前言
数据结构课作业自留bupt.
题目如下:
约瑟夫(Josephus)环问题:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,直到所有人全部出列为止。建立n个人的单循环链表存储结构,运行结束后,输出依次出队的人的序号。
[测试数据]
m的初值为20;密码:3,1,7,2,4,8,4(正确的结果应为6,1,4,7,2,3,5)。
完整代码
关键部分
void Js(Node* tail,int n,int m) {
int i = 0;
Node* p = NULL;
cout << "输出结果: ";
while (n) {
i = (i + 1) % m;
if (i)
tail = tail->next;
else {
p = tail->next;
tail->next = p->next;
cout << p->data << " ";
m = p->password;
free(p); //约瑟夫环删除结点,即淘汰人
n--;
i = 0;
}
}
}
完整代码如下
#include<iostream>
using namespace std;
typedef struct Node {
int data;
int password;
struct Node* next;
}Node;
Node* Create(int n,int m) { //创建循环单链表表示约瑟夫环
Node* tail = NULL, * p=NULL;
int a[7] = { 3,1,7,2,4,8,4 }; //测试数据
for (int i = 0; i < n; ++i) {
p = new Node;
if (!tail) {//一开始tail为null的创建
p->next = p;
tail = p;
p->data = i + 1;
p->password = a[i];
}
else { //tail不为null的创建
p->data = i + 1;
p->password = a[i];
p->next = tail->next;
tail->next = p;
tail = p;//tail尾结点移动
}
}
return tail;
}
void Js(Node* tail,int n,int m) {
int i = 0;
Node* p = NULL;
cout << "输出结果: ";
while (n) {
i = (i + 1) % m;
if (i)
tail = tail->next;
else {
p = tail->next;
tail->next = p->next;
cout << p->data << " ";
m = p->password;
free(p); //约瑟夫环删除结点,即淘汰人
n--;
i = 0;
}
}
}
void main() {
int n=7, m=20; //人数和初始密码
Node *tail;
tail = Create(n,m);//创建环
Js(tail, n, m); //进行游戏
}
总结
以上就是全部代码,具体细节我觉得值得推敲.