线性表的链表存储结构来实现约瑟夫(Josephu)问题,用C++代码实现
时间: 2024-02-09 09:10:44 浏览: 84
以下是使用单向循环链表实现约瑟夫问题的C++代码:
```
#include <iostream>
using namespace std;
// 定义单向循环链表结点结构体
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
// 约瑟夫问题求解函数
void josephu(int n, int m) {
// 构造循环链表
ListNode* head = new ListNode(1);
ListNode* p = head;
for (int i = 2; i <= n; i++) {
p->next = new ListNode(i);
p = p->next;
}
p->next = head; // 将链表尾部连接到头部,形成循环链表
// 模拟约瑟夫问题的求解过程
p = head;
while (p->next != p) { // 当链表中只剩一个结点时停止
for (int i = 1; i < m; i++) {
p = p->next; // 找到要删除的结点的前一个结点
}
ListNode* del = p->next; // 要删除的结点
p->next = del->next; // 将要删除的结点从链表中删除
cout << del->val << " "; // 输出删除的结点的值
delete del; // 释放被删除结点的内存空间
}
cout << p->val << endl; // 输出最后剩下的结点的值
delete p; // 释放最后剩下的结点的内存空间
}
int main() {
int n, m;
cout << "请输入总人数n和报数m:";
cin >> n >> m;
josephu(n, m);
return 0;
}
```
在上述代码中,我们首先构造了一个包含1~n的单向循环链表,然后模拟了约瑟夫问题的求解过程。具体来说,我们用一个指针p来遍历链表,每次找到要删除的结点的前一个结点,并将要删除的结点从链表中删除,并输出其值。当链表中只剩一个结点时,即p->next==p时,算法结束,输出最后剩下的结点的值。
阅读全文