标题:关于C单链表约瑟夫的问题,不胜感激
只看楼主
new123123
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-4-10
结帖率:0
已结贴  问题点数:20 回复次数:2 
关于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
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
得分:20 
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;
}

根据楼主的代码可以用这个图来解释。
简单地说,Head是个头指针。用于确定链表从什么位置开始访问。以后要遍历时,就可以用Head指针来确定起始位置了。
所以插入不能直接操作Head,那么就需要用L1来操作。
那么,每一个L1->next节点都存储着L2的数据域和指向下个结点的指针域。

for(i=2;i<=n;i++) //为为什么要用到这个循环?
这个很好理解。比如n为10,那么就是循环8次。
这8次循环里,L1都在重复的执行上面的操作。直到循环停止,L1->next=NULL
不知道这样解释你能不能明白。。可能我这样表达有难不专业。

普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2018-04-11 02:07
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.081003 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved