约瑟夫问题数据结构实验报告
更新时间:2023-12-19 12:06:01 阅读量: 教育文库 文档下载
中南民族大学管理学院
学生实验报告
实验项目: 约瑟夫问题 课程名称: 数据结构 年 级:
专 业:信息管理与信息系统 指导教师:
实验地点:管理学院综合实验室 完成日期: 小组成员:
2012 学年至2013 学年度第 1 学期
中南民族大学管理学院学生实验报告
一、实验目的
(1)掌握线性表表示和实现; (2)学会定义抽象数据类型;
(3)学会分析问题,设计适当的解决方案;
二、实验内容
【问题描述】:编号为 1,2,…,n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值 m,从第一个人开始按顺时针方向自 1 开始顺序报数,报到 m 时停止报数。报 m 的人出列,将他的密码作为新的 m 值,从他在顺时针方向上的下一个人开始重新从 1 报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
【基本要求】:利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
【测试数据】:m 的初值为 20;密码:3,1,7,2,4,8,4(正确的结果应为 6,1,4,7,2,3,5)。
三、实验步骤
(一) 需求分析
对于这个程序来说,首先要确定构造链表时所用的插入方法。当数到m时一个人就出列,也即删除这个节点,同时建立这个节点的前节点与后节点的联系。由于是循环计数,所以才采用循环列表这个线性表方式。 程序存储结构 利用单循环链表存储结构存储约瑟夫数据(即n个人的编码等),模拟约瑟夫的显示过程,按照出列的顺序显示个人的标号。编号为 1,2,?,n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值 m,从第一个人开始按顺时针方向自 1 开始顺序报数,报到 m 时停止报数。报 m 的人出列,将他的密码作为新的 m 值,从他在顺时针方向上的下一个人开始重新从 1 报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。基本要求是利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。 程序执行的命令(1)构造单向循环链表。
(2)按照出列的顺序引出各个人的标号。
测试数据 m 的初值为 20;密码:3,1,7,2,4,8,4(正确的结果应为 6,1,4,7,2,3,5) (1)、插入:在把元素插入到循环链表中时,由于是采用的头插法,所以我保留了front头结点。在每加入一个节点时,都会直接连接在front后面,从而保证一开始就赋值的rear尾节点不用修改。 伪代码阐释如下:
1)、在堆中建立新节点:Node
中南民族大学管理学院学生实验报告
2)、将a[i]写入到新节点的数据域:s->data=a[i]; 3)、修改新节点的指针域:s->next=front->next;
4)、修改头结点的指针域,将新节点加入到链表中:front->next=s; 时间复杂度为:1;
(2)、删除:首先通过p指针查找到所要删除的节点的前一个节点,继而通过q=p->next简单地删除掉。假设所要查找的为第i个元素。 伪代码阐释如下: 1)、在堆中建立新节点p,通过循环查找到i-1,将此节点的地址赋给p。 2)、设q指向第i个节点:若p=rear,则q=front->next; 否则,q=p->next; 3)、摘链,即将q从链表中摘除:若q=rear,则p->next=front->next;否则,则p-next=q->next.
4)、保存q元素的数据:x=q->data; 5)、释放q元素:delete q; 时间复杂度为:1; (3)、约瑟夫问题的基本思想:在这个循环查找问题中,通过循环链表实现了循环查找到节点。一个关键部分就是删除节点后进行链表的链接,从而保证链表的循环性。在查找方面上,我利用了一个for循环来计数所查找过的节点。其中查找的时间复杂度也为1;
(二)概要设计
测试主函数流程: 流程图如下: 开始 输入m和n
m n 是 否 判断、 否符合要求
是 创建Clinklist类的对象, 首先建立循环链表,之后 调用Josef函数。
中南民族大学管理学院学生实验报告
断 链 跳出函数 判表 是否为空
否 循环查找到所要删除节点 的前一个节点。 判断所要删除节点是否为最后一个 是
否 删除该节点,并从该节点的直接 后继结点重新计数。此时要判断 P和q是否存在恰好为rear指针 的情况
输出m的位置
结束
(三)详细设计
#include
using namespace std; const int d=50000; struct Node { int data; struct Node*next; //声明next指针 };
中南民族大学管理学院学生实验报告
class Clinklist {
public: Clinklist(int a[],int n); void Josef(int m,int n); private: Node *rear; //声明rear和front指针 Node *front; int n; };
Clinklist::Clinklist(int a[],int n) { rear=new Node; front=new Node; front->next=rear;//构造空单链表 rear->next=front; rear->data=a[n-1]; for(int i=n-2;i>=0;i--) { Node*s=new Node; //循环插入元素来建立链表 s->data=a[i]; s->next=front->next; front->next=s; } }
void Clinklist::Josef(int m,int n) { Node* p=front; int j=0; while(front->next!=front) { int i=0; while(i!=m-1) //实现第m-1个节点的查找 { if(p==rear) p=front->next; else p=p->next; i++;
中南民族大学管理学院学生实验报告
} Node* q=p->next; if(p==rear) //排除p恰好为rear节点的情况 {q=front->next; front->next=q->next; p->next=front->next; } else { if(q==rear) //排除q恰好为rear节点的情况 p->next=front->next; //完成摘链 else p->next=q->next; //完成摘链 } int x=q->data; //保留q点数据 delete q; //完成q节点的删除 j++; if(j==n)cout<<\所出的最后一个人的编号是:\ } }
int main() { int m,n; cout<<\请输入人数(1<=n<=50000):\ cin>>n; int member[d]; for(int i=0;i
中南民族大学管理学院学生实验报告
(四)调试分析
调试时出现的问题及解决的方法
1、早期程序只写了约瑟夫的实现部分,没有对输入的数据进行筛选,测试时会出错。
2、在先前的程序循环过程中没有进行优化,导致循环次数过多,浪费了一定的时间。
3、为了限制在输入过程中不会上溢,只在输入中限定为四个不全为零的数字,但是做的是一个循环。在约瑟夫的实现在程序中,为for循环,时间复杂度为o(m%n-1)当n=1时,复杂度为o(1)。
4、在调试时一开始用的是模板类,调试时就总会遇到“无法解析的外部指令”之类的问题。由于无法解决,对模板类的理解不好,所以就去掉了模板类的应用。Templete
int data;
struct Node*next; };
6、这个是最严重的逻辑错误,就是编译的时候没有任何问题,在程序运行时会出现乱码或者出错的情况。这个完全靠一点点的逻辑判断了,又用了最笨的方法:在纸上画一个循环链表才搞定。
(五)用户手册
1、我们这个程序的运行环境为 VC++6.0操作系统, 2、进入演示程序后即显示文本方式的用户界面:
中南民族大学管理学院学生实验报告
(六)测试结果
中南民族大学管理学院学生实验报告
(七)心得体会
数据结构的课程设计,相对来说还是一个较大的工程,我们小组各个成员相互合作,虽然里面的内容不是很完备,但总体上还是一个比较能要体现数据结构的知识点能力的程序了,这个设计让我们在课堂中学到的理论知识,解决相应的实际问题,深入理解和灵活掌握所学的内容,使我们在实践的过程中收获匪浅,认真去做,踏踏实实,静静思考,慢慢进步,会有收获的。
(八)团队介绍
小组成员基本情况介绍 组长:雷灵花11056024
组员:涂艺11056022 伍雨豪11056029
小组成员分工情况
组长 雷灵花,选择的实验设计为第一模块的约瑟夫问题,完成了第一个实验的程序设计和最终实验报告的总结。
组员 涂艺,完成了第二个实验的程序设计和实验报告的撰写工作,选择的程序设计为第一模块的城市链表实验。
组员 伍宇豪,在进行实验当中查阅了大量的相关资料,给出了实验的程序设计和源代码上的文件资料和指导。
小组成员任务完成情况
程序一和程序二的调试工作完成情况良好,各个结果都能运行,组长实验一的程序和实验报告完成符合老师要求格式,组员涂艺程序和实验报告完成情况基本一致,组员伍宇豪也提供了很多的资料和技术支持。总体来说,团队意识很好,一起共同完成学习任务。
中南民族大学管理学院学生实验报告
(九)附录:源程序清单 源程序文件名清单:
#include
class Clinklist {
public: Clinklist(int a[],int n); void Josef(int m,int n); private: Node *rear; //声明rear和front指针 Node *front; int n; };
Clinklist::Clinklist(int a[],int n) { rear=new Node; front=new Node; front->next=rear;//构造空单链表 rear->next=front; rear->data=a[n-1]; for(int i=n-2;i>=0;i--) { Node*s=new Node; //循环插入元素来建立链表 s->data=a[i]; s->next=front->next; front->next=s; } }
void Clinklist::Josef(int m,int n) { Node* p=front; int j=0; while(front->next!=front) { int i=0; while(i!=m-1) //实现第m-1个节点的查找 { if(p==rear) p=front->next; else p=p->next; i++;
正在阅读:
约瑟夫问题数据结构实验报告12-19
泪,留在心中作文300字06-28
屋面与防水施工复习题(1)04-21
兰州市有机高效农产品种植示范基地项目可行性研究报告02-29
Win7下MATLAB - 7.0下载地址和详细安装03-24
详述陀螺经纬仪的作业过程09-10
标语、口号宣传的特点及其社会功能05-13
大气污染课后答案 3章11-11
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 约瑟夫
- 数据结构
- 实验
- 报告
- 问题
- 部编版五年级下册语文期末检测卷 docx
- 自主学习任务单的初体验
- 陀螺仪的原理及应用
- 爱因斯坦怎样走近中国
- 权健的规章制度
- 一汽大众公司捷达品牌2001年战略营销分析
- 探析亚洲航空低成本运营战略
- 北京课改版语文七下老北京的小胡同教案(2)
- 石家庄市糖果糕点经销企业名录129家
- 妇科中成药的市场调查分析文献综述
- 成都七中2010—2011学年度第一学期高一物理期中试卷
- 大屏简明操作手册6
- 2010 - 2011学年度第一学期教学工作总结
- 名片中经常使用到的英文职务、职称、头衔名称的英文翻译
- 小孩流口水流鼻涕是什么原因
- 优秀党员先进事迹材料2篇
- 浅谈加强校园安全的几点措施
- “最密切联系原则”与涉外合同的法律适用
- 2019届高考一轮复习备考资料之数学人教A版全国用讲义之第十三章推理与证明、算法、复数13.2
- 2019-2020年九年级物理下册17.1关于电动机转动的猜想教学设计新版粤教沪版