#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; //前一个和后一个相连,跳过ddelete 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; //输出最后留下的一个人的编号
}