4. N 个人围成一圈顺序编号,从 1 号开始按 1、2、 3 顺序报数,报 3 者退出圈外,其余的人再从1、2、 3 开始报数,报 3 的人再退出圈外,依次类推。请按退出顺序输出每个退出人的原序号。要求使用环形链表编程。
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
struct Node
{
int num;
Node *next;
};
int main()
{
int n;
cin>>n;
if(n<=0) return 0;
Node *root,*loc;
root=(Node*)malloc(sizeof(Node));
root->num=1;
root->next=root;
loc=root;
for(int i=2;i<=n;i++)
{
Node *q;
q=(Node*)malloc(sizeof(Node));
q->num=i;
q->next=loc->next;
loc->next=q;
loc=q;
}
loc=root;
int k=n;
while(n--)
{
loc=loc->next->next;
if(n==k-1) cout<<loc->num;
else cout<<" "<<loc->num;
if(loc->next!=loc)
{
loc->num=loc->next->num;
Node *tmp=loc->next;
loc->next=tmp->next;
free(tmp);
}
else
{
free(loc);
}
}
cout<<endl;
return 0;
}