#include<iostream>
using namespace std;
struct Circle //创建结构体Circle
{
int index; //编号
Circle* next; //指针变量next指向一个节点
};
Circle* CreateList(int n) //创建链表
{
Circle* head, * p; //head为头指针,p为当前指针
head = p = new Circle; //创建存储空间
int i;
for (i = 1; i < n; i++)
{
p->index = i; //进行编号
p->next = new Circle; //为下一个节点创建存储空间
p=p->next; //指针变量p指向下一个节点
}
p->index = i; //对最后一个节点进行编号
p->next = head; //最后一个节点时,指针变量p指向头指针
return head; //返回头指针
}
Circle* DeleteNode(Circle* head, Circle* d) //删除节点
{ //head为头指针,d为指向需要删除节点的指针
Circle* p = head;
while (p->next != d) p = p->next; //查找节点
p->next = d->next; //前一个和后一个相连,跳过d
delete d; //删除d所指向的节点
return p; //返回p指针
}
Circle* NumberOff(Circle* head) //报数
{
int k = 1;
Circle* p = head;
while (p->next != p) //p的下一个节点不为p时,即不是只剩下一个节点时
{
k++; //继续报数
p = p->next;
if (k % 3 == 0) //当报数为3的倍数时,退出圈子
p = head = DeleteNode(head, p);//调用删除节点函数
}
return p; //返回指针p
}
int main()
{
int n; //有n个人
cin >> n;
Circle* list = CreateList(n); //调用创建链表函数
list = NumberOff(list); //调用报数函数
cout << list->index << endl; //输出最后留下的一个人的编号
}
?