#include<cstdio>
#include<cstdlib>
//#include<bits/stdc++.h>
using namespace std;
typedef struct Lnode
{
int id;
int code;
struct Lnode *next;
}Lnode,*Linklist;
Linklist Createlist(int n)//创建链表
{
Lnode *head=NULL,*tail=NULL;
for(int i=1;i<=n;i++)
{
//Lnode *p=(Lnode *)malloc(sizeof(struct Lnode));
Linklist p=(Linklist)malloc(sizeof(Linklist));
p->id=i;
printf("输入第%d个人的密码:",i);
scanf("%d",&p->code);
if(tail)
tail->next=p;
else
head=p;
tail=p;
}
if(tail)//成环
tail->next=head;
return tail;
}
void print(Linklist tail)//输出
{
Linklist head=tail;
Linklist p=tail->next;
printf("每个人的初始序号和初始密码:\n");
while(p!=head)//head标志起点
{
printf("(%d %d) ",p->id,p->code);
p=p->next;
}
printf("(%d %d)",p->id,p->code);
}
Linklist play(Linklist& tail,int n,int m)//进行游戏
{
Linklist pre,p;
pre=tail;
printf("出列顺序为:");
while(n>1)
{
p=pre->next;
m==m%n?m%n:n;//=
for(int i=1;i<=m-1;i++)
{
pre=p;
p=p->next;
}
printf("%d ",p->id);
//p=p->next
pre->next=p->next;
m=p->code;
n--;
}
printf("%d\n\n",pre->id);//pre始终指向为待出列人前驱
}
int main()
{
int n,m;
printf("输入总人数和初始密码:");
while(scanf("%d",&n),n)
{
scanf("%d",&m);
printf("*人数为0则游戏结束*\n");
Linklist tail=Createlist(n);
if(tail)
{
print(tail);
play(tail,n,m);
}
printf("输入总人数和初始密码:");
}
return 0;
}
04-16
397
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
09-29