实验一-约瑟夫环问题.docxVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验一-约瑟夫环问题

数据结构实验报告实验名称:实验一线性表学生姓名:班级:班内序号:学号:日期:1.实验要求一.实验目的通过选择下面四个题目之一进行实现,掌握如下内容:熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法学习指针、模板类、异常处理的使用掌握线性表的操作的实现方法学习使用线性表解决实际问题的能力二.实验内容题目4利用循环链表实现约瑟夫问题的求解。约瑟夫问题如下:已知n个人(n=1)围坐一圆桌周围,从1开始顺序编号。从序号为1的人开始报数,顺时针数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规则重复下去,直到所有人全部出列。请问最后一个出列的人的编号。2.程序分析2.1存储结构 单循环链表。线性表简称表,是由零个或多个具有相同类型的数据元素构成的有限序列。链表用一组任意的存储单元存放线性表的各个元素。为了正确表示结点间的逻辑关系,在存储每个元素值的同时,还需要存储该元素的直接后继的位置信息,这个信息称为指针或链,这两部分构成了实际的存储结构,称为结点。如果单链表终端结点的指针域指向头结点,则整个链表构成一个环,将这种首尾相接的单链表称为单循环链表。示意图:2.2关键算法分析1.关键算法:约瑟夫问题的实质就是在含n个元素的循环链表中依次删除第m个元素,返回链表中最后一个元素值。即用含n个元素的数组初始化循环链表,从第一个元素开始查找第m-1个元素,删除第m个元素,然后从第m+1个元素开始继续查找第m-1个元素,删除第m个元素,循环此过程直到链表中只剩下最后一个元素。2.代码详细分析:[1] rear=new Node;rear-next=rear;for (inti=0;in;i++){Node *s=new Node;s-data = a[i];s-next = rear-next;rear-next = s;rear = s;}采用尾插法用含n个元素的数组初始化循环链表Node *p = rear-next;rear-next = p-next;初始化指针p指向第一个结点;[2] 判断人数n或报数m是否为1;[2.1] 人数n或报数m为1,将人数n赋给x;[2.2] 当人数不为1时,进入循环;[2.2.1] 初始化计数器i=1;[2.2.2] 查找第m-1个元素,p指向第m-1个元素;[2.2.3]Node *q = p-next;初始化指针q指向p-nextp-next = q-next;p的指针域指向q的指针域delete q第m个元素摘链,删除qp = p-next指针p后移[2.2.4] 人数n减1;[2.3] 尾指针rear指向最后的结点p,将此结点值赋给x;[3] 返回x的值。3.时间复杂度的计算[1] O(n)[2] O(1)[2.1] O(1) [2.2] O(n) [2.2.1] O(n*m)[2.2.2] O(n*m)[2.2.3] O(n)[2.2.4] O(n)……T(n) = n*m2.3在此需要说明的是,在初始化链表时,特使用了尾插法,并对尾插法做了相应的修改。使尾指针rear可以随新插入链表的结点移动。为了保证循环计数的准确,在含参构造函数中,用含n个元素的数组初始化链表后,特将无实际值的头结点删去,这样就可以避免因头结点的存在而导致计数错误,也省去了对头结点的判断。伪代码如下:[1] 用含n个元素的数组a[]初始化循环链表;[2] 初始化指针p使其指向头结点;[3] 将尾结点rear的指针域指向头结点的下一个结点,即第一个含值的结点;[4] 删去p,即删除了头结点。3.程序运行结果.3.1测试主函数流程:流程图:2.运行结果4.总结(1)调试时出现的问题及解决方法在执行时,当输入m=1时程序无法继续进行,是因为在查找第m-1个元素时缺少了判断m=1的情况,后增加了当m=1时直接返回人数n的判断,问题解决。(2)心得体会在本次实验中,通过自己编译代码的形式实现了单链表的构造,插入及删除操作,加深了自己对单链表的印象,提高了自己调试和解决异常的能力。(3)下一次的改进可以尝试这在程序代码中添加析构函数。同时在删除结点时存在指针悬挂的问题,有待进一步改进。源代码如下:#include iostreamusing namespace std;template class Tstruct Node{T data;struct NodeT *next;};template class TclassCLinkList{public:CLinkList(){rear=new NodeT;rear-next=rear;}CLinkList(T a[],int n);int Josephus(intm,int n);private:Node T *rear;};template cla

您可能关注的文档

文档评论(0)

liudao + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档