Dream To Me

总有些什么留下来并被惦记

约瑟夫问题循环链表求解


编号为1.2.3…….n的n个人按顺时针方向围坐一圈,开始任意选一个整数作为报数上限值,从第一个人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,从他顺时针下一个人开始重新从1开始报数,如此下去直到所有的人全部都出列为止。

原始约瑟夫问题是出去的那个人说一个数后面的人按这个数报下去,直到所有人出列

#include <stdio.h> 
typedef struct node
{
int num;
struct node *next;
}lnode;
main()
{
int i,j,key,n; 
/*i,j为记数器,key间隔人数,n为人的总个数*/
lnode *p,*s,*head;
head=(lnode *)malloc(sizeof(lnode));
/*为头结点分配空间*/
p=head;
scanf("%d",&n); /*输入人的总个数*/
for(i=0;i<n;i++)
{
s=p;
p=(lnode *)malloc(sizeof(lnode));
/*创建新的结点*/
s->next=p;
p->num=i+1;
}
p->next=head->next;
p=head;
head=head->next;
free(p);
scanf("%d",&key); /*间隔人数*/
do
{
j=1; /*j为记数数*/
p=head;
while(j<key)
{
s=p;
p=p->next;
j++;
}
i=p->num;
printf("%d ",i);
s->next=p->next;
head=p->next; /*重新定义head,下次循环的开始结点*/
free(p);
n--; /*每循环一次人是减1*/
}while(n>0);
getch();
}


输入:6 2

输出:2 4 6 3 1 5

输入:15 7

输出:7 14 6 15 9 3 13 11 10 12 2 8 1 4 5