题目描述:
编号为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>
#include<string.h>
typedef struct node{
int data;
int pass;
struct node *next;
struct node *pre;
}node,*linklist;
linklist creatL(int n)
{
linklist l;
l = (linklist)malloc(sizeof(node));
int i;
node *r,*p;
l->next=NULL;
l->data=1;
scanf("%d",&l->pass);
r=l;
for(i=2;i<=n;i++)
{
p=(node*)malloc(sizeof(node));
p->data=i;
scanf("%d",&p->pass);
p->next=NULL;
p->pre=r;
r->next=p;
r=p;
}
p->next=l;
l->pre=p;
return l;
}
void delate(linklist l,int n,int x){
node *p,*q,*t;
int i,k;
if(n==0){
return ;
}
p=t=l;
if(x<0)
x=n;
for(i=1;i<=x;i++)
{
q=p->pre;
t=q->next;
p=p->next;
}
q->next=p;
p->pre=q;
k=t->pass;
printf("%d ",t->data);
free(t);
n--;
if(n==0){
return ;
}
l=p;
delate(l,n,k);
}
int main()
{
int n,x;
linklist l;
scanf("%d",&n);
scanf("%d",&x);
l=creatL(n);
delate(l,n,x);
return 0;
}