#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;}
问题比较多,主要问题有几点:
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:键盘输入“I am supermonkey!”时,将这句话存入数组。
#include<stdio.h>
int main()
{
char c1[12],c2[12],c3[12];
scanf(“%s%s%s”,c1,c2,c3);
return 0;
}
c1[12]={‘I’,‘\0’,‘\0’,‘\0’,‘\0’,‘\0’,‘\0’,‘\0’,‘\0’,‘\0’,‘\0’,‘\0’};
c2[12]={‘a’,‘m’,‘\0’,‘\0’,‘\0’,‘\0’,‘\0’,‘\0’,‘\0’,‘\0’,‘\0’,‘\0’};
c3[12]={‘s’,‘u’,‘p’,‘e’,‘r’,‘m’,‘o’,‘n’,‘k’,‘e’,‘y’,‘!’};
#include<stdio.h>
int main()
{
char c[18];
gets(c);
return 0;
}
c[18]={‘I’,‘ ’,‘a’,‘m’,‘ ’,‘s’,‘u’,‘p’,‘e’,‘r’,‘m’,‘o’,‘n’,‘k’,‘e’,‘y’,‘!’,‘\0’};
例 2:输入一行由空格和单词组成的字符(字符数在 80 以内),请统计有多少个单词。
#include<stdio.h>
int main()
{
char c[81];
int i,dancishu=1;
gets(c);
if(c[0]==‘ ’)
dancishu=0;
for(i=0;c[i]!=‘\0’;i++)
if(c[i]==‘ ’&&c[i+1]!= ‘ ’&&c[i+1]!= ‘\0’)
dancishu++;
printf(“有%d 个单词”,dancishu);
return 0;
}
运行结果:
在你的代码中,似乎缺少了 FootCreateList() 函数的实现。这个函数的作用是创建一个带有 n 个元素的链表,每个元素的值为从 1 到 n 的整数。在 PrintList() 函数中,你使用了一个未定义的 temp 变量,实际上应该使用 LCopy 变量,因为它指向链表的头部。另外,在 PrintList() 函数中,你只打印了前 k 个元素,而不是剩余的 k 个元素。
更新后代码示例:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct
{
ElemType date;
struct LNode*next;
}LinkList;
int initList(LinkList*L)
{
L=(LinkList*)malloc(sizeof(LinkList));
if(L==NULL) return 0;
L->next=NULL;
}
int createList(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");
return 1;
}
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));
initList(L); printf("请输入参与游戏的总人数n\n");
scanf("%d",&n);
if(n<1) { printf("非法输入");
return 0; }
if(!createList(L,n)) { printf("创建链表失败");
return 0; }
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;}
#如有帮助,恭请采纳