题目描述
编号为1,2,…,n的n个人按顺时针方向围坐在一张圆桌周围,每人持有一个密码(正整数)。一
开始任选一个正整数m作为报数上限值,从第一个人开始按顺时针方向自1开始报数,报到m时停止报数,报m的那
个人出列,将他的密码作为新的m值,从他顺时针方向的下一个人开始重新从1报数,数到m的那个人又出列;如
此下去,直至圆桌周围的人全部出列为止。要求按出列顺序输出n个人的编号。
输入
第一行输入两个整数,依次表示人数n和初始化密码m,以空格间隔。
第二行依次输入n个整数,分别表示n个人的密码,以空格间隔。
输出
按出列次序输出每个人的编号,以空格间隔。
样例输入
7 20
3 1 7 2 4 8 4
样例输出
6 1 4 7 2 3 5
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode //定义结构体
{
int num,pwd; //num定义人的序号,psw定义密码;
struct LNode *next;
} LNode ;
struct LNode *p,*head,*pt; //定义结点
//创建循环链表函数
int Createlinklist(int n)
{
int i;
head=(struct LNode*)malloc(sizeof(struct LNode)); //创建带头结点的链表
p=head;
for(i=1;i<n;i++)
{
pt=(struct LNode*)malloc(sizeof(struct LNode));
p->next=pt;
p=pt;
}
p->next=head;
pt=head;
return 0;
}
//创建输入密码函数
int Enterpwd(int n)
{
int i,j;
for(i=1;i<=n;i++)
{
scanf("%d",&j);
pt->num=i; //num存储人的序号
pt->pwd=j; //pwd存储人的密码
pt=pt->next;
}
pt=p;
return j;
}
//创建输出函数
int Outlist(int m,int n)
{
int i,a;
for(i=1;i<=n;i++) //for循环搜索链表
{
for(a=1;a<m;a++)
{
pt=pt->next;
}
p=pt->next;
m=p->pwd;
printf("%d ",p->num); //输出人的序号
pt->next=p->next;
free(p);
}
return 0;
}
//主函数
void main()
{
int m,n; //m为报数上限值,n为人数
scanf("%d%d",&n,&m);
Createlinklist(n);
Enterpwd(n);
Outlist(m,n);
}