2201_76014975 2023-06-19 00:14 采纳率: 100%
浏览 88
已结题

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


#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

  • 写回答

3条回答 默认 最新

  • 急速光粒 2023-06-19 10:29
    关注

    问题比较多,主要问题有几点:
    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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月27日
  • 已采纳回答 6月19日
  • 创建了问题 6月19日

悬赏问题

  • ¥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命令