[编程入门]报数问题
题目描述
有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
输入
初始人数n
输出
最后一人的初始编号
样例输入
3
样例输出
2
#include<iostream>
#include<stdio.h>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode *next;
}*LinkList;
void CreatList(LinkList &L,int n)
{
int i;
LinkList p,q;
L=new Lnode;
L->data=1;
L->next=NULL;
q=L;
//尾插法初始化并创建单链表
for(i=2; i<=n; i++)
{
p=new Lnode;
p->data=i;
p->next=NULL;
q->next=p;
q=q->next;
}
q->next=L;
}
void dele(LinkList &L,int n)
{
LinkList tail=L,p=L;
// 找到链表第一个结点的上一个结点,为删除操作做准备
while (tail->next!=L) {
tail=tail->next;
}
while (p->next!=p) {
//找到报数为3的位置,删除
for (int i=1; i<3; i++) {
tail=p;
p=p->next;
}
tail->next=p->next;//将p节点取下来
delete p;
p=tail->next;//继续使用p指针指向出列编号的下一个编号
}
cout<<p->data;//最后剩下的一个人出列
delete p;
}
int main()
{
int n;
cin>>n;
LinkList L;
CreatList(L,n);
dele(L,n);
//cout<<L->data;输出莫名其妙的一堆数字,因为L原来所指的结点已经被delete释放
return 0;
}