约瑟夫生死游戏结果间隔数错误


#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;}

img

img

问题比较多,主要问题有几点:
1、没有释放删除的节点,导致内存泄漏;
2、间隔思路混乱,多次出现m-1情况;
3、未考虑删除后列表的变化,仍然用原列表输出剩余节点;
程序都做了修改,可以参考一下,有帮助请采纳!
运行结果:

img

img

#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;
}

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7629439
  • 你也可以参考下这篇文章:写程序来控制函数发生器来输出任意波形
  • 除此之外, 这篇博客: 小白学C语言必看教程!中的 输入字符数组 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 例 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;}

#如有帮助,恭请采纳