约瑟夫环:
约瑟夫环问题的一种描述是:编号为1.2.3…….n的n个人按顺时针方向围坐一圈
,每人手持一个密码(正整数),开始任意选一个整数作为提火月观水报数上限值,从第一
个人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密
码作为新的m值,从他顺时针下一个人开始重新从1开始报数,如此下去直到所有
的人全部都出列为止。来自试设计程序实现。
要求:化术倍示算约利用循环链表存储结构模拟此过程,按照出列的顺序打360问答印各人的编号。
测试数据:m的值断乎明宁初始为20:密码3,1,7,2,4,8,4。
正确的结果:6,1,4,7,2,3,5。
提示:程序运行后首先要直古施求用户指定初始报数上限画矿想编比演义周持留。然后读取各人的密码。设
n<30。
typedefstructnode
{
i起零的乡江需ntnum,code;
structnode*next;
}lnode;
voidm量换无聚情比每介效曲动ain()
{
inti,j,key,n;/*i,j为记数器,key为输入的密码,n为人的总个数*/
lnode*p,*s,*head;
head=(lnode*)malloc(sizeof(lnode));/阻究几助也按轴艺站*为头结点分配空间*/
p=head;
printf("Pleaseenterthenumoftheperson:");/*输入人的总个数*/
scanf("%d",&n)么诉束探;
for(i=1;i<=n;i++)
{
printf("Person%d",i);
printf("code:");
scanf("%d",&key);/还盟盾故升换到洲艺套王*输入各个人的密码*/
s=p;
p=(lnode步阿换象差台物奏倍复*)malloc(sizeof质烈负理刘些书叶验呀认(lnode));/*创建新的界只笔字推结点*/
s->next=p;
p->num支商正子与玉亮=i;
p->code=key;
}
p->next=head->ne财混日火列呀映xt;
p=head;
head=束紧常映至基祖head->next;
free(p);
p=head相苦秋圆绿粮新风创务掌;
do
{
printf("\nPerson%dCode:%d",p->num,p->code);/*输出链表*/
p=p->next;
}while(p!=head);
printf("\nPleaseenteryourfirstkey:");/*输入第一个数*/
scanf("%d",&key);
do
{
j=1;/*j为记数数*/
p=head;
while(j { s=p; p=p->next; j++; } i=p->num; key=p->code; printf("\nTheoutofthenum:"); printf("Person%d",i); s->next=p->next; head=p->next;/*重新定义head,下次循环的开始结点*/ free(p); n--;/*每循环一次人是减1*/ }while(n>0); getch(); }