数据结构约瑟夫环课程设计.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
摘要: 约瑟夫问题是由古罗马著名的史学家Josephus提出的问题演变而来,所以通常称为Josephus问题…,n的n个人按顺时针方向围坐一圈, 每人有一个密码Ki(整数),留作其出圈后应报到Ki后出圈。报数方法采用顺时针报数和逆时针报数交替进行,初始密码可任意确定。求最后剩下的人的编号。这个就是约瑟夫环问题的实际场景,循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。 p-link=head解决问题的核心步骤:建立一个具有n个链结点,无头结点的循环链表确定第个报数人的位置不断地从链表中删除链结点,直到链表为空1需求分析 2 1.1功能分析 2 1.2设计平台 2 2概要设计 2 2.1类LinkList 3 2.2类Joseph 3 2.3类异常处理 3 3详细设计和实现 3 3.1创建结点Node 3 3.2创建双向循环链表 4 3.3从链表中删除结点 5 4调试与操作说明 5 4.1调试情况 5 4.2操作说明 6 总 结 8 致 谢 9 参 考 文 献 10 1需求分析 1.1功能分析 本次选做的课程设计是改进约瑟夫(Joseph)环问题。我选择了和薛晶两个人来完成本次课程设计的作业。约瑟夫环问题是一个古老的数学问题,本次课题要求用程序语言的方式解决数学问题。此问题仅使用单循环链表就可以解决此问题。而改进的约瑟夫问题通过运用双向循环链表,同样也能方便地解决。 在建立双向循环链表时,因为约瑟夫环的大小由输入决定。为方便操作,我们将每个结点的数据域的值定为生成结点时的顺序号和每个人持有的密码。进行操作时,用一个指针current指向当前的结点,指针front始终指向头结点。然后建立双向循环链表,因为每个人的密码是通过rand()函数随机生成的,所以指定第一个人的顺序号,找到结点,不断地从链表中删除链结点,直到链表Windows2000以上操作系统;Microsoft Visual C++ 6.0 2概要设计 已知n个人(以编号1,2,3...n分别表示)围。从编号为的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到的人全部出列。这个就是约瑟夫环问题的实际场景,有一种是要通过输入n,m,k三个正整数,来求出列的序列。这个问题采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。 p-link=head解决问题的核心步骤:建立一个具有n个链结点,无头结点的循环链表确定第1个报数人的位置不断地从链表中删除链结点,直到链表为空Linklist , Joseph。 2.1类LinkList 主要功能是创建结点,每个结点数值域包括data,password,还有指示前驱结点的指针llink,和指示后继结点的指针rlink。 2.2类Joseph 主要功能是实现创建双向循环链表及一些相应的操作。 2.3类异常处理 在C++程序中,可以使用try-throw-catch结构处理程序异常。采用这一程序结构能够将使用和实现分离:类和函数的实现者使用throw语句易地错误类别通知使用者。使用者根据获悉的错误类别采取相应的措施,这就是异常处理。 3详细设计和实现 改进约瑟夫环问题的基本思路和原问题基本一致,只是一个采用单循环链表,另一个采用双向循环链表来解决问题。第一步是定义结构变量结点linklist,data,password,指针域:lLink和rLink。然后建立一个由n个链结点,无表头结点的双向循环链表。并由构造函数对结点赋值,由随机函数rand()产生每个结点的password。由于每个结点的password是由随机函数产生的,也就是每个结点的password是后知的,所以在一开始人为地指定一个结点的顺序,由此结点开始报数。报password个数后,报到的那个结点被删除,它的password被记录下,由它的下一个结点开始逆方向报数………如此循环,直到循环链表里只剩下一个结点,那就是问题所求的结果。具体到问题上,还需要创建一个Joseph类,由构造函数来初始化,输入所有的人数,也就是表长,然后指定由第几个人开始报数。在Joseph类中定义一个GetWinner()函数,由它来实现获得最后的胜利者。并在该类中设置一个判断语句来确定先由顺时针报数并淘汰了一个人之后,再按逆时针顺序报数,如此交替进行。 3.1创建结点Node 链表都是由一个个结点组成,由于结点的不同,组成的链表也不同。因此需要创建双向链表结点。由于每一个结点有一个密码和一个序号,所以可以将结点结构体定义为: struct Node{ int data; int password; DNode* llink; DNode* rlink;}

文档评论(0)

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

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

1亿VIP精品文档

相关文档