标题:关于C单链表约瑟夫的问题,不胜感激
取消只看楼主
new123123
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-4-10
结帖率:0
已结贴  问题点数:20 回复次数:1 
关于C单链表约瑟夫的问题,不胜感激
程序的要求是有N个人,从第M个人开始起报数,报到K的人退出,K+1个人继续从1开始报数。
下面是源代码,有些地方不懂,望指点,感谢。
#include<stdio.h>
#include<malloc.h>

typedef struct desk
{
    int num;
    struct desk *next;
}desk,*LinkList;

LinkList Head,L1=NULL,L2,L3=NULL; //构建Head,L1,L2,L3的原因?
int i,n,m,k,c=0;

void circle()
{
    Head->next=NULL;
    Head=(LinkList)malloc(sizeof(Head));
    Head->num = 1;
    L1=Head;  //这句话有什么用吗?
    for(i=2;i<=n;i++) //为为什么要用到这个循环?
    {
        L2->next=NULL;
        L2 = (LinkList)malloc(sizeof(Head));
        L2->num = i;
        L1->next=L2;
        L1=L2;
    }
    L1->next = Head;
}

void find()
{
    L2=Head;
    for(i=1;i<m;i++)
    {
        L2=L2->next;
    }
    while(1)
    {
        L1=L2;
        if(k == 1)
        {
            for(i=0;i<n;i++)
            {
                printf("%d ",L2->num);
                L2=L2->next;
            }
            break;
        }
        else
        {
            for(i=1;i<k-1;i++)
            {
                L1=L1->next;
            }
            L3=L1->next;
            L1->next=L3->next;
            L2=L3->next;
            printf("%d ",L3->num);
            free(L3);
            c++;
            if(c==n)
            {
                break;
            }
        }
    }
    printf("\n");
}

void main()
{
    printf("请输入人数:\t从第几位开始报数:\t报的数字\n");
    scanf("%d%d%d",&n,&m,&k);
    circle();
    find();
}
搜索更多相关主题的帖子: num next Head NULL for 
2018-04-10 20:29
new123123
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-4-10
得分:0 
回复 2楼 lanke711
十分感谢您的解答,谢谢您
2018-04-27 17:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-485950-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.125847 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved