约瑟夫环
编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,直到所有人全部出列为止。编程打印出列顺序。
#include<stdlib.h>
typedef struct people
{
int key;
int number;
people *pre,*aft;
}*list;
list header ;
int curKey;
list create(int m)
{
int n = 0,key=0;
list p,tail;
tail= (list)malloc(sizeof(list));
tail->number = 1;
printf("请输入第1个人的密码: ",n);
scanf("%d",&tail->key);
p = tail;
header = tail;
for (n=2;n<=m;n++)
{
tail= (list)malloc(sizeof(list));
tail->number = n;
printf("请输入第%d个人的密码: ",n);
scanf("%d",&tail->key);
p->aft = tail;
tail->pre = p;
tail->aft = header;
header->pre = tail;
p = tail;
}
return header;
}
list delete_p(int out,list cur)
{
list p;
int key=0;
p = cur;
while (-out)
p = p->aft;
printf("%d",p->number);
curKey = p->key;
p->pre->aft = p->aft;
p->aft->pre = p->pre;
p = p->aft;
return p;
}
int main()
{
int m,n,out;
list cur;
printf("请输入人数: ");
scanf("%d",&m);
header = create(m);
printf("请输入第一个上限值: ");
scanf("%d",&n);
printf("出列顺序为: ");
cur = delete_p( n % m ,header);
while (m!=1)
{
m-;
out = curKey;
cur = delete_p(out,cur);
}
system("pause");
}