约瑟夫问题是循环链表的一个典型应用,其描述如下:
m个人围成了一圈,从其中任一个人开始,按顺时针顺序
使所有人依次从1开始报数,报到n的人出列;然后使n之后的
人接着从1开始报数,再次使报到n的人出列……如此下去,
求算出列的顺序,及最后留下来的人的编号
将m与n设定为具体数字,使m=8,n=3模拟约瑟夫问题。
以下是关于此函数的完整代码
#include<stdio.h>
#include<stdlib.h>
typedef struct CLinkList
{ int data;
struct CLinkList *next;
}node;
int main()
{ node *L,*r,*s;
L =(node*)malloc(sizeof(node));
r =L;
int n = 8,i,k = 3;
for(i = 1;i<=n;i++)
{ s = (node*)malloc(sizeof(node));
s->data = i;
r->next = s;
r= s;
}
r->next =L->next; //让最后一个结点指向第一个有数据结点
node *p;
p = L->next;
delete L; //删除第一个空的结点
while(p->next != p) //判断条件:因为最后肯定剩下一个人,
循环链表的最后一个数据的next还是他本身
{for(i = 1;i<k-1;i++)
{p = p->next; } //每k个数出列一个人
printf("%d,",p->next->data);
p->next = p->next->next; //将该节点从链表上删除。
p = p->next;
}
printf("%d,",p->next->data);
return 0;
}
下图为执行的结果