题目见另一篇博客:
https://blog.csdn.net/macunshi/article/details/38499273
使用循环链表来做:
#include "iostream"
using namespace std;
int n, m;
struct node
{
int data;
struct node *next;
};
struct node *creat()//循环链表的建立
{
struct node *head, *tail, *p;
head = (struct node *)malloc(sizeof(struct node));
head->next = NULL;
head->data = 1;//此处头结点不是虚节点
tail = head;
for (int i = 2; i <= n; i++)
{
p = (struct node *)malloc(sizeof(struct node));
p->data = i;
p->next = NULL;
tail->next = p;
tail = p;
}
tail->next = head;//形成环
return head;
};
void baoshu(struct node *head)//报数过程的操作
{
int num = 0;//报数的计数变量
int count = 0;//统计被杀的人的个数
struct node *p, *q;
q = head;
while (q->next != head) //q指向尾节点
q = q->next;
p = head; //p指向头结点,暂且称他为“先锋”,如果要删就删它指向的位置
while (count != n - 1)
{
num++;
if (num%m == 0)//数到m的人被删
{
q->next = p->next;
free(p);
p = q->next;
count++;
}
else
{
q = p;
p = p->next;
}
}
cout<<q->data<<endl;
}
int main()
{
cin>>n>> m;
struct node *head;
head = creat();
baoshu(head);
return 0;
}
一般情况下,循环链表的头结点是虚节点,不会存储数据,但是本题为了方便解题,头结点就存储了数据。