约瑟夫问题。有n个人,编号为1,2,…,n,围成一个圆圈,按照顺时针方向从编号为k的人从1开始报数,报数为m的人出列,他的下一个人重新开始从1报数,数到m的人出列,一直这样重复下去,直到所有的人都出列。要求编写一个算法,输入n、k和m,依次输出每次出列人的编号。
算法描述如下:
void Josephus(LinkList h,int n,int m,int k)
/*在由n个人围成的圆圈中,从第k个人开始报数,数到m的人出列*/
{
ListNode *p,*q;
int i;
p=h;
for(i=1;i<k;i++) /*从第k个人开始报数*/
{
q=p;
p=p->next;
}
while(p->next!=p)
{
for(i=1;i<m;i++) /*数到m的人出列*/
{
q=p;
p=p->next;
}
q->next=p->next; /*将p指向的结点删除,即报数为m的人出列*/
printf("%4d",p->data);
free(p);
p=q->next; /*p指向下一个结点,重新开始报数*/
}
printf("%4d\n",p->data);
}
测试代码由自己编写,或参考零基础学数据结构,机工社,