#include <cstdlib>
#include <iostream>
using namespace std;
struct MonkeyNode
{
int num;
MonkeyNode *next;
};
MonkeyNode *head; // 全局变量 标记头结点
MonkeyNode *tail; // 全局变量 标记尾结点
// 根据猴子数量创建环形链表
void CreateMonkeyList(int n)
{
if (n < 1) {
cout << "数字数量不能小于1!";
exit(0);
return;
}
// 创建头节点
MonkeyNode *p = new MonkeyNode();
p->num = 1;
p->next = nullptr;
head = p; // head指针始终指向链表第一个结点
// 继续往节点点后面追加第2.. 一直到第n只猴子
for (int i = 2; i <= n; i ++) // i = 2...n
{
MonkeyNode *monkey = new MonkeyNode;
monkey->num = i;
p->next = monkey; // 使用p添加新节点
p = p->next; // p指向新节点
}
tail = p; // 最后p和tail都指向尾节点
tail->next = head; // 尾结点指针域指向头节点, 形成闭环
}
// 根据报数m, 选举猴王
void SelectMonkeyKing(int m)
{
int count = 1;
MonkeyNode *q; // q指针用于遍历操作
MonkeyNode *p; // p指针用于删除和释放节点
q = tail;
do
{
p = q->next; // 从头结点开始报数..
if (count % m == 0) // 正好报数到m, 此时p节点要删除
{
cout << "第" << (count / m)
<< "轮: 淘汰的猴子编号:" << p->num << endl;
q->next = p->next; // q的指针域指向p的后继 保证链表不断
delete p; // 释放p占用的空间
p = nullptr;
}
else // 如果没有报数到m, 则继续报数.
q = p;
count++;
} while (q != q->next); // 只剩一个头结点时 循环结束
head = q; // 重新调整head指向
cout << "经过筛选, 最终猴王编号是: " << head->num << endl;
}
int main()
{
int n, m; // n 猴子数量, m 报数到多少
cout << "输入竞选猴王的猴子数量: ";
cin >> n;
cout << "输入报数到几则淘汰出局?: ";
cin >> m;
CreateMonkeyList(n); // 创建环形链表
SelectMonkeyKing(m); // 选举猴王
system("pause");
return 0;
}
循环单链表-猴子选大王
最新推荐文章于 2024-04-13 12:51:57 发布