今天检查电脑的文件,发现了当时学习时候对于数据结构的一些学习实验内容,接下来通过编程为大家介绍!
一、问题分析
约瑟夫(Joeph)问题的一种描述是:编号为 1,2,…,n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值 m,从第一个人开始按顺时针方向自 1 开始顺序报数,报到 m 时停止报数。报 m 的人出列,将他的密码作为新的 m 值,从他在顺时针方向上的下一个人开始重新从 1 报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
二、概要设计与代码
初始化界面:
代码:
/*彭名驹 */
#include <iostream>
using namespace std;
#include<stdlib.h>
typedef struct Lnode {
int xuhao;
int mima;
struct Lnode *next;
} Lnode,*list;
Lnode *head,*p,*q;
int main() {
int i,n,m,j;//n个人 报数上限
cout<<"请输入人数:";
cin>>n;
for (i = 1; i <= n; i++) {
if (i == 1) {
head = p = (struct Lnode*)malloc(sizeof(struct Lnode));
} else {
q = (struct Lnode*)malloc(sizeof(struct Lnode));
p->next = q;
p = q;
}
cout<<"请输入"<<i<<"密码"<<endl;
cin>>i;
p->xuhao = i;
}
p->next = head;
p = head;
cout<<"请输入上限:"<<endl;
cin>>m;
cout<<"密码是:";
for (j = 1; j <= n; j++) {
for (i = 1; i < m; i++) p = p->next;
m = p->mima;
if(i==n) printf("%d", p->xuhao);
else printf("%d->", p->xuhao);
p->xuhao = p->next->xuhao;
p->mima = p->next->mima;
q = p->next;
p->next = p->next->next;
free(q);
}
return 0;
}
变量定义:
i,n,m,j;//n个人 报数上限
Lnode *head,*p,*q;
三、调试程序:
四、使用说明:
第一步:输入所需的测试人数
第二步:分别输入各个人的密码
第三步:输入第一个自定的上限值
第四部:输出结果
五、运行结果:
上面内容是个人学习总结,如有遗漏或者错误请在评论区中指正,期待与大家大讨论!!!