N 个人围成一圈顺序编号,从 1 号开始按 1、2、 3 顺序报数,报 3 者退出圈外,其余的人再从 1、2、 3 开始报数,报 3 的人再退出圈外,依次类推。请按退出顺序输出每个退出人的原序号。要求使用环形链表编程。
这道题是学校常出的编程练习题,现在读来感受不同,从之前用的malloc函数到现在直接用new给结构体分配存储空间,效率提高了很多。
但是题目的理解可能会出现偏差,因为题目中并没有明确说出其余人从t出的人的下一个人开始报数还是从head结点开始报数,我就默认按照从t出的人的下一个人开始报数。
#include<iostream>
using namespace std;
typedef struct person{
int number;
person *next;
}*node;
int main(){
int n;
cin>>n;
node head;
node p=new person;
p->number=1;
p->next=NULL;
head=p;
node q,m;
for(int i=2;i<=n;i++)
{
node r=new person;
r->number=i;
r->next=p->next;
p->next=r;
p=p->next;
}
p->next=head;
node t=head;
int countnumber=n;
while(countnumber-->=1)
{
int count=2;
while(--count){
t=t->next;
}//找到要删除的结点的前一个元素。
cout<<t->next->number;
t->next=t->next->next;
t=t->next;//移动到下一个三计数起点
}
}