#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct
LNode
{
ElemType date;
struct LNode*next;
}LinkList;
int lnitList(LinkList*L)
{
L=(LinkList*)malloc(sizeof(LinkList));
if(L==NULL) return 0;
L->next=NULL;
}
int FootCreateList(LinkList*L,ElemType n)
{
if(n<0) return 0;
LinkList*temp,*LCopy;
LCopy=L;
int i=1;
while(i<=n) {
temp=(LinkList*)malloc(sizeof(LinkList));
if(temp==NULL) return 0;
temp->date=i;
L->next=temp;
L=L->next; i++; }
L->next=LCopy->next;
printf("他们的序号是\n");}
void PrintList(LinkList*L,ElemType k)
{ LinkList*temp=L;
temp=temp->next;
for(int i=0;i<k;i++)
{ printf("%d号\n",temp->date);
temp=temp->next; }
printf("print successfully\n");}
ElemType DeleteElemList(LinkList*L,int m,int k,int *n)
{
int i=1;
for(;i<=m-1;++i)
{L=L->next; }
printf("死掉的人为:%d号\n",L->next->date);
L->next=L->next->next;(*n)=(*n)-1;
if(k<(*n))
DeleteElemList(L,m,k,n);
}
int main(){ int n,m,j,k;
printf("***********欢迎来到约瑟夫生死游戏************\n");
LinkList*L; L=(LinkList*)malloc(sizeof(LinkList));
lnitList(L); printf("请输入参与游戏的总人数n\n");
scanf("%d",&n);
if(n<1) { printf("非法输入");
return 0; }
FootCreateList(L,n);
PrintList(L,n);
printf("从j号开始计数\n"); scanf("%d",&j);
if(j>n) { printf("非法输入");
return 0; } printf("请输入死亡间隔数m\n");
scanf("%d",&m);
if(m>=n)
{
printf("非法输入");
return 0; }
printf("直至所剩k人\n"); scanf("%d",&k);
if(k>=n) { printf("非法输入");
return 0; }
for(int i=0;i<j;++i)
{ L=L->next; }
DeleteElemList(L,m-1,k,&n);
printf("还活着的人的人为\n");
PrintList(L,k); return 0;}
约瑟夫生死游戏结果间隔数错误
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- 急速光粒 2023-06-19 10:29关注
问题比较多,主要问题有几点:
1、没有释放删除的节点,导致内存泄漏;
2、间隔思路混乱,多次出现m-1情况;
3、未考虑删除后列表的变化,仍然用原列表输出剩余节点;
程序都做了修改,可以参考一下,有帮助请采纳!
运行结果:#include<stdio.h> #include<string.h> #include<stdlib.h> typedef int ElemType; typedef struct LNode { ElemType date; struct LNode*next; }LinkList; int lnitList(LinkList*L) { L = (LinkList*)malloc(sizeof(LinkList)); if (L == NULL) return 0; L->next = NULL; } int FootCreateList(LinkList*L, ElemType n) { if (n<0) return 0; LinkList*temp, *LCopy; LCopy = L; int i = 1; while (i <= n) { temp = (LinkList*)malloc(sizeof(LinkList)); if (temp == NULL) return 0; temp->date = i; L->next = temp; L = L->next; i++; } L->next = LCopy->next; printf("他们的序号是\n"); } void PrintList(LinkList*L, ElemType k) { LinkList*temp = L; temp = temp->next; for (int i = 0; i<k; i++) { printf("%d号\n", temp->date); temp = temp->next; } printf("print successfully\n"); } LinkList* GetPrevElement(LinkList*L, int n) { LinkList*temp = L; for (int i = 0; i<n - 1; i++) { temp = temp->next; } return temp; } LinkList* DeleteElemList(LinkList*L, int m, int k, int *n) { int i = 1; for (; i <= m - 1; ++i) { L = L->next; } LinkList* prevL = GetPrevElement(L, *n); printf("死掉的人为:%d号\n", prevL->next->date); prevL->next = L->next; (*n) = (*n) - 1; free(L); L = prevL->next; if (k<(*n)) return DeleteElemList(L, m, k, n); return L; } int main() { int n, m, j, k; printf("***********欢迎来到约瑟夫生死游戏************\n"); LinkList*L; L = (LinkList*)malloc(sizeof(LinkList)); lnitList(L); printf("请输入参与游戏的总人数n\n"); scanf("%d", &n); if (n<1) { printf("非法输入"); return 0; } FootCreateList(L, n); PrintList(L, n); printf("从j号开始计数\n"); scanf("%d", &j); if (j>n) { printf("非法输入"); return 0; } printf("请输入死亡间隔数m\n"); scanf("%d", &m); if (m >= n) { printf("非法输入"); return 0; } printf("直至所剩k人\n"); scanf("%d", &k); if (k >= n) { printf("非法输入"); return 0; } for (int i = 0; i<j; ++i) { L = L->next; } L = DeleteElemList(L, m , k, &n); printf("还活着的人的人为\n"); PrintList(L, k); system("pause"); return 0; }
带名字输出:
#include<stdio.h> #include<string.h> #include<stdlib.h> typedef int ElemType; typedef struct LNode { ElemType date; struct LNode*next; char name[100]; }LinkList; int lnitList(LinkList*L) { L = (LinkList*)malloc(sizeof(LinkList)); if (L == NULL) return 0; L->next = NULL; } int FootCreateList(LinkList*L, ElemType n) { if (n<0) return 0; LinkList*temp, *LCopy; LCopy = L; int i = 1; while (i <= n) { temp = (LinkList*)malloc(sizeof(LinkList)); if (temp == NULL) return 0; char line[1000] = { 0 }; temp->date = i; printf("请输入第%d位姓名:\n", i); scanf("%s", temp->name); L->next = temp; L = L->next; i++; } L->next = LCopy->next; printf("他们的序号是\n"); } void PrintList(LinkList*L, ElemType k) { LinkList*temp = L; temp = temp->next; for (int i = 0; i<k; i++) { printf("%d号,姓名:%s\n", temp->date, temp->name); temp = temp->next; } printf("print successfully\n"); } LinkList* GetPrevElement(LinkList*L, int n) { LinkList*temp = L; for (int i = 0; i<n - 1; i++) { temp = temp->next; } return temp; } LinkList* DeleteElemList(LinkList*L, int m, int k, int *n) { int i = 1; for (; i <= m - 1; ++i) { L = L->next; } LinkList* prevL = GetPrevElement(L, *n); printf("死掉的人为:%d号,姓名:%s\n", prevL->next->date, prevL->next->name); prevL->next = L->next; (*n) = (*n) - 1; free(L); L = prevL->next; if (k<(*n)) return DeleteElemList(L, m, k, n); return L; } int main() { int n, m, j, k; printf("***********欢迎来到约瑟夫生死游戏************\n"); LinkList*L; L = (LinkList*)malloc(sizeof(LinkList)); lnitList(L); printf("请输入参与游戏的总人数n\n"); scanf("%d", &n); if (n<1) { printf("非法输入"); return 0; } FootCreateList(L, n); PrintList(L, n); printf("从j号开始计数\n"); scanf("%d", &j); if (j>n) { printf("非法输入"); return 0; } printf("请输入死亡间隔数m\n"); scanf("%d", &m); if (m >= n) { printf("非法输入"); return 0; } printf("直至所剩k人\n"); scanf("%d", &k); if (k >= n) { printf("非法输入"); return 0; } for (int i = 0; i<j; ++i) { L = L->next; } L = DeleteElemList(L, m , k, &n); printf("还活着的人的人为\n"); PrintList(L, k); return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 12864只亮屏 不显示汉字
- ¥20 三极管1000倍放大电路
- ¥15 vscode报错如何解决
- ¥15 前端vue CryptoJS Aes CBC加密后端java解密
- ¥15 python随机森林对两个excel表格读取,shap报错
- ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
- ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
- ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
- ¥15 VFP如何使用阿里TTS实现文字转语音?
- ¥100 需要跳转番茄畅听app的adb命令