2022年数据结构约瑟夫环课程方案 .pdf
《2022年数据结构约瑟夫环课程方案 .pdf》由会员分享,可在线阅读,更多相关《2022年数据结构约瑟夫环课程方案 .pdf(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、个人资料整理仅限学习使用摘要:约瑟夫问题是由古罗马著名的史学家Josephus 提出的问题演变而来,所以通常称为 Josephus 问题。改进约瑟夫问题的描述是:编号为1,2, n 的 n个人按顺时针方向围坐一圈, 每人有一个密码Kilink=head解决问题的核心步骤:先建立一个具有n 个链结点,无头结点的循环链表,然后确定第一个报数人的位置,并不断地从链表中删除链结点,直到链表为空。关键词: 约瑟夫环;双向循环链表;数据结构;删除结点精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 14 页个人资料整理仅限学习使用目录1 需求分析 2
2、1.1 功能分析2 1.2 设计平台2 2 概要设计 22.1 类 LinkList3 2.2 类 Joseph3 2.3 类异常处理3 3 详细设计和实现33.1 创建结点Node3 3.2 创建双向循环链表4 3.3 从链表中删除结点5 4 调试与操作说明54.1 调试情况5 4.2 操作说明6 总结 8致谢 9参考文献 10精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 14 页个人资料整理仅限学习使用1 需求分析1.1 功能分析本次选做的课程设计是改进约瑟夫(Joseph 环问题。我选择了和薛晶两个人来完成本次课程设计的作业。约
3、瑟夫环问题是一个古老的数学问题,本次课题要求用程序语言的方式解决数学问题。此问题仅使用单循环链表就可以解决此问题。而改进的约瑟夫问题通过运用双向循环链表,同样也能方便地解决。在建立双向循环链表时,因为约瑟夫环的大小由输入决定。为方便操作,我们将每个结点的数据域的值定为生成结点时的顺序号和每个人持有的密码。进行操作时,用一个指针current指向当前的结点,指针front 始终指向头结点。然后建立双向循环链表,因为每个人的密码是通过rand(函数随机生成的,所以指定第一个人的顺序号,找到结点,不断地从链表中删除链结点,直到链表剩下最后一个结点,通过一系列的循环就可以解决改进约瑟夫环问题。1.2
4、设计平台Windows2000以上操作系统; Microsoft Visual C+ 6.0 2 概要设计已知 n 个人link=head。解决问题的核心步骤:首先建立一个具有n个链结点,无头结点的循环链表。然后确定第1 个报数人的位置。最后不断地从链表中删除链结点,直到链表为空。改进的约瑟夫环问题与原问题思路一致,只是不再采用单循环链表存储结构,而采用双向循环链表,而且用一个判断语句来决定报数的方向的顺时针还是逆时针。本课程设计主要采用了类的数据结构,程序中包含了两个类:Linklist , Joseph 。2.1 类 LinkList 精选学习资料 - - - - - - - - - 名师
5、归纳总结 - - - - - - -第 3 页,共 14 页个人资料整理仅限学习使用主要功能是创建结点,每个结点数值域包括data,password , 还有指示前驱结点的指针 llink , 和指示后继结点的指针rlink 。2.2 类 Joseph 主要功能是实现创建双向循环链表及一些相应的操作。2.3 类异常处理在 C+程序中,可以使用try-throw-catch 结构处理程序异常。采用这一程序结构能够将使用和实现分离:类和函数的实现者使用throw 语句易地错误类别通知使用者。使用者根据获悉的错误类别采取相应的措施,这就是异常处理。3 详细设计和实现改进约瑟夫环问题的基本思路和原问题
6、基本一致,只是一个采用单循环链表,另一个采用双向循环链表来解决问题。第一步是定义结构变量结点linklist ,并在该结点下定义结点的元素域: data,password ,指针域 : lLink 和rLink。然后建立一个由n 个链结点,无表头结点的双向循环链表。并由构造函数对结点赋值,由随机函数rand(产生每个结点的 password 。由于每个结点的password是由随机函数产生的,也就是每个结点的password是后知的,所以在一开始人为地指定一个结点的顺序,由此结点开始报数。报password个数后,报到的那个结点被删除,它的password被记录下,由它的下一个结点开始逆方向报
7、数如此循环,直到循环链表里只剩下一个结点,那就是问题所求的结果。具体到问题上,还需要创建一个Joseph类,由构造函数来初始化,输入所有的人数,也就是表长,然后指定由第几个人开始报数。在Joseph类中定义一个 GetWinner(函数,由它来实现获得最后的胜利者。并在该类中设置一个判断语句来确定先由顺时针报数并淘汰了一个人之后,再按逆时针顺序报数,如此交替进行。3.1 创建结点 Node 链表都是由一个个结点组成,由于结点的不同,组成的链表也不同。因此需要创建双向链表结点。由于每一个结点有一个密码和一个序号,所以可以将精选学习资料 - - - - - - - - - 名师归纳总结 - - -
8、 - - - -第 4 页,共 14 页个人资料整理仅限学习使用结点结构体定义为:struct Node int data。int password。DNode* llink 。DNode* rlink 。 图 3.1 结点 Dnode3.2 创建双向循环链表创建一个空双向循环链表,双向循环链表和每个结点包括三个域: Element,lLink,rLink . 其中 element为元素域, rLink 域为指向后继结点的指针,新增的lLink 域用以指向前驱结点。双向链表也可以带表头结点,并且也可以构成双向循环链表。此时,表头结点的rLink ,lLink 分别指向双向循环链表的头结点( 或
9、表头结点 和尾结点。一个结点的 lLink 域的指针指向它左边结点的后部,这并不意味着该结点的 lLink 域保存的仍是该左边结点存储块的起始地址。在此处,指针指向某个结点任何部分都是等价的,都是指该存储块的起始位置。图 3.2 单表头的双向循环链表每当结点计数到某一结点时,将他的前驱结点接到他的后继结点,然后将他的密码值 password赋给计数变量,再将此结点删除。如此循环下去,直到最后变为空的单循环链表为止。由于当某个人退出圆圈后,报数的工作要从下一个人开始继续,剩下的人仍然是围成一个圆圈的,可以使用循环表,由于退出圆圈的工作对应着表中结点的删除操作,对于这种删除操作频繁的情况,选用效率
10、较高的链表结构,为了程序指针每一次都指向一个具体的代表一个人的结点而不需要判断,链表不rLink password data first llink 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 14 页个人资料整理仅限学习使用带头结点。所以,对于所有人围成的圆圈所对应的数据结构采用一个不带头结点的循环链表来描述。设头指针为front,front 始终指向头结点,并定义指针current记录当前的结点。并根据具体情况移动llink-rlink=q-rlink 。q-rlink-llink=q-llink。delete q。来删除当前的
11、那个结点q,通过循环来一次次删除当前的结点,直到链表中剩下最后一个结点。具体程序如下:#include #include #include typedef struct node /定义单循环链表中节点的结构 int num 。/ 序列号即个人的编号int cipher。/ 个人所持有的密码struct node *next。linklist。class YSFH 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 14 页个人资料整理仅限学习使用 public: linklist *Creat(int n。linklist *Select
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年数据结构约瑟夫环课程方案 2022 数据结构 约瑟夫 课程 方案
限制150内