关于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();
}