约瑟夫问题数据结构实验报告23938.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《约瑟夫问题数据结构实验报告23938.pdf》由会员分享,可在线阅读,更多相关《约瑟夫问题数据结构实验报告23938.pdf(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、中南民族大学管理学院 学生实验报告 实验工程:约瑟夫问题 课程名称:数据构造 年 级:专 业:信息管理与信息系统 指导教师:实验地点:管理学院综合实验室 完成日期:小组成员:2012 学年至 2013 学年度第 1 学期 一、实验目的 1掌握线性表表示和实现;2学会定义抽象数据类型;3学会分析问题,设计适当的解决方案;二、实验容-.z【问题描述】:编号为 1,2,n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码正整数。一开场任选一个正整数作为报数上限值 m,从第一个人开场按顺时针方向自 1 开场顺序报数,报到 m 时停顿报数。报 m 的人出列,将他的密码作为新的 m 值,从他在顺时针方向
2、上的下一个人开场重新从 1 报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。【根本要求】:利用单向循环链表存储构造模拟此过程,按照出列的顺序印出各人的编号。【测试数据】:m 的初值为 20;密码:3,1,7,2,4,8,4正确的结果应为 6,1,4,7,2,3,5。三、实验步骤(一)需求分析 对于这个程序来说,首先要确定构造链表时所用的插入方法。当数到 m时一个人就出列,也即删除这个节点,同时建立这个节点的前节点与后节点的联系。由于是循环计数,所以才采用循环列表这个线性表方式。程序存储构造 利用单循环链表存储构造存储约瑟夫数据即 n 个人的编码等,模拟约瑟夫的显示过程,按照
3、出列的顺序显示个人的标号。编号为 1,2,n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码正整数。一开场任选一个正整数作为报数上限值 m,从第一个人开场按顺时针方向自 1 开场顺序报数,报到 m 时停顿报数。报 m 的人出列,将他的密码作为新的 m 值,从他在顺时针方向上的下一个人开场重新从 1 报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。根本要利用单向循环链表存储构造模拟此过程,按照出列的顺序印出各人的编号。程序执行的命令1构造单向循环链表。2按照出列的顺序引出各个人的标号。测试数据 m 的初值为 20;密码:3,1,7,2,4,8,4正确的结果应为 6,1,4
4、,7,2,3,5 1、插入:在把元素插入到循环链表中时,由于是采用的头插法,所以我保存了 front 头结点。在每参加一个节点时,都会直接连接在 front 后面,从而保证一开场就赋值的 rear 尾节点不用修改。伪代码阐释如下:1)、在堆中建立新节点:Node*s=new Node;2)、将 ai写入到新节点的数据域:s-data=ai;3)、修改新节点的指针域:s-ne*t=front-ne*t;4)、修改头结点的指针域,将新节点参加到链表中:front-ne*t=s;时间复杂度为:1;(2)、删除:首先通过 p 指针查找到所要删除的节点的前一个节点,继而通-.z 过 q=p-ne*t 简
5、单地删除掉。假设所要查找的为第 i 个元素。伪代码阐释如下:1、在堆中建立新节点 p,通过循环查找到 i-1,将此节点的地址赋给 p。2、设q指向第i个节点:假设p=rear,则q=front-ne*t;否则,q=p-ne*t;3)、摘链,即将 q 从链表中摘除:假设 q=rear,则 p-ne*t=front-ne*t;否则,则 p-ne*t=q-ne*t.4)、保存 q 元素的数据:*=q-data;5、释放 q 元素:delete q;时间复杂度为:1;3、约瑟夫问题的根本思想:在这个循环查找问题中,通过循环链表实现了循环查找到节点。一个关键局部就是删除节点后进展链表的,从而保证链表的循
6、环性。在查找方面上,我利用了一个 for 循环来计数所查找过的节点。其中查找的时间复杂度也为 1;(二)概要设计 测试主函数流程:流程图如下:否 是 跳出函数 否 是 否 三详细设计#include using namespace std;const int d=50000;struct Node 开场 输入 m 和 n 创立 Clinklist 类的对象,首先建立循环链表,之后调用 Josef 函数。判断所要删除节点是否为最后一个 删除该节点,并从该节点的直接后继结点重新计数。此时要判断 P和q是否存在恰好为rear指针的情况 输出 m 的位置 完毕 循环查找到所要删除节点的前一个节点。判断
7、链表是否为空 判断 m、n 是否符合要求-.z int data;struct Node*ne*t;/声明 ne*t 指针;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-ne*t=rear;/构造空单链表 rear-ne*t=front;rear-data=an
8、-1;for(int i=n-2;i=0;i-)Node*s=new Node;/循环插入元素来建立链表 s-data=ai;s-ne*t=front-ne*t;front-ne*t=s;void Clinklist:Josef(int m,int n)Node*p=front;int j=0;while(front-ne*t!=front)int i=0;while(i!=m-1)/实现第 m-1 个节点的查找 -.z if(p=rear)p=front-ne*t;else p=p-ne*t;i+;Node*q=p-ne*t;if(p=rear)/排除 p 恰好为 rear 节点的情况 q=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 约瑟夫 问题 数据结构 实验 报告 23938
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内