题目描述
N 个人围成一圈顺序编号,从1 号开始按1、2、3 顺序报数,报3 者退出圈外,其余的人再从1、2、3 开始报数,报3 的人再退出圈外,依次类推。请按退出顺序输出每个退出人的原序号。要求使用环行链表编程。
输入描述:
输入第一行为整数m表示有m组测试数据,接下来m行每行一个整数N,N不超过50。
输出描述:
输出m行,每行表示题目所求,用空格隔开。
示例1
1
4
3 2 4 1
即环形链表问题。题目要求需要用环形链表实现,其实用队列应该实现更快一些?
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
struct node *next;
int number;
}node;
int main()
{
node *head,*p,*pre;
int i,m,n,j,flag=0;
scanf("%d",&m);
for(i=1;i<=m;i++){
scanf("%d",&n);
head=(node *)malloc(sizeof(node));
head->number=1;
pre=head;
for(j=2;j<=n;j++){
p=(node *)malloc(sizeof(node));
p->number=j;
pre->next=p;pre=p;
}
pre->next=head;
p=head;pre=NULL;
while(p->next!=p){
flag++;
if(flag%3==0){
pre->next=p->next;
printf("%d ",p->number);
free(p);
p=pre->next;
}
else {
pre=p;p=p->next;
}
}
printf("%d\n",p->number);
free(p);
}
return 0;
}