欢迎来到天天文库
浏览记录
ID:56247790
大小:114.50 KB
页数:12页
时间:2020-03-24
《约瑟夫问题数据结构实验报告.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、中南民族大学管理学院学生实验报告中南民族大学管理学院学生实验报告实验项目:约瑟夫问题课程名称: 数据结构 年 级: 专 业:信息管理与信息系统指导教师: 实验地点:管理学院综合实验室完成日期: 小组成员: 2012学年至2013学年度第1学期中南民族大学管理学院学生实验报告一、实验目的(1)掌握线性表表示和实现;(2)学会定义抽象数据类型;(3)学会分析问题,设计适当的解决方案;二、实验内容【问题描述】:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上
2、限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。【基本要求】:利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。【测试数据】:m的初值为20;密码:3,1,7,2,4,8,4(正确的结果应为6,1,4,7,2,3,5)。三、实验步骤(一)需求分析对于这个程序来说,首先要确定构造链表时所用的插入方法。当数到m时一个人就出列,也即删除这个节点,同时建立这个节点的前节
3、点与后节点的联系。由于是循环计数,所以才采用循环列表这个线性表方式。程序存储结构利用单循环链表存储结构存储约瑟夫数据(即n个人的编码等),模拟约瑟夫的显示过程,按照出列的顺序显示个人的标号。编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。基本要求是利用单向循环链表存储结构
4、模拟此过程,按照出列的顺序印出各人的编号。程序执行的命令(1)构造单向循环链表。(2)按照出列的顺序引出各个人的标号。测试数据m的初值为20;密码:3,1,7,2,4,8,4(正确的结果应为6,1,4,7,2,3,5)(1)、插入:在把元素插入到循环链表中时,由于是采用的头插法,所以我保留了front头结点。在每加入一个节点时,都会直接连接在front后面,从而保证一开始就赋值的rear尾节点不用修改。伪代码阐释如下:1)、在堆中建立新节点:Node*s=newNode;中南民族大学管理学院学生实验报告2)、将a[i]写入到新节点
5、的数据域: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=
6、rear,则p->next=front->next;否则,则p-next=q->next.4)、保存q元素的数据:x=q->data;5)、释放q元素:deleteq;时间复杂度为:1;(3)、约瑟夫问题的基本思想:在这个循环查找问题中,通过循环链表实现了循环查找到节点。一个关键部分就是删除节点后进行链表的链接,从而保证链表的循环性。在查找方面上,我利用了一个for循环来计数所查找过的节点。其中查找的时间复杂度也为1;(二)概要设计测试主函数流程:流程图如下:开始输入m和n判断m、n是否符合要求否是创建Clinklist类的对象,首先建立循环
7、链表,之后调用Josef函数。中南民族大学管理学院学生实验报告判断链表是否为空跳出函数否循环查找到所要删除节点的前一个节点。判断所要删除节点是否为最后一个是否删除该节点,并从该节点的直接后继结点重新计数。此时要判断P和q是否存在恰好为rear指针的情况输出m的位置结束(三)详细设计#includeusingnamespacestd;constintd=50000;structNode{intdata;structNode*next;//声明next指针};中南民族大学管理学院学生实验报告classClinklist{pub
8、lic:Clinklist(inta[],intn);voidJosef(intm,intn);private:Node*rear;//声明rear和front指针
此文档下载收益归作者所有