数据结构课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、题目:求解约瑟夫(Josephus)问题
1、【问题描述】:
有一个旅行社要从n个旅客中选出一名旅客,为他提供免费的环球旅行服务。旅行社安排这些旅客围成一个圆圈,并从帽子中取出一张纸条,用纸条上面写的正整数m(m 2、设计: 2.1概要设计:采用循环单链表实现,其中包括链表节点的设计及循环单链表类的设计。链表的数据元素有头结点和节点的数目,其中头结点的数据类型设计成节点类型,节点的数目size设计成整数类型。循环单链表类的操作集合有构造函数、析构函数、取大小函数、定位函数、插入函数、删除函数、取值函数以及求解该问题约瑟夫函数。其中的删除、取值等操作要保证参数不越界的约束条件i>=0&&i<=size-1;插入操作要满足i>=0&&i<=size;定位操作要使得i>=-1&&i<=size-1. 2.2详细设计:本问题的求解主要是对约瑟夫函数的设计。首先给该函数传入m的值,然后定义一个指针指向头结点,依照题目要求设计循环条件使指针依次指向下一结点直到找到淘汰对象,然后用事先定义的k记录,是指针指向淘汰节点的前一结点,再进行循环,直至完成题目要求。 3、测试:测试函数设计主函数接口,定义n与m的值分别为8,3.定义一个循环单链表对象,将各个数据插入到循环单链表中,再将m值传入约瑟夫函数。测试过程中出现的大部分错误主要来自于功能函数对删除节点的前一节点定位操作的错误,后来在改正过程中添加了k辅助定位,解决了该问题。 4、使用说明及设计小结:使用时每次定义好n与m的值在进行操作。该程序的设计我认为有待改进的地方还是定位操作,该解法的最终实现得益于k的引入。但不免失之普遍性,应该有更好的,更易懂的算法实现。 5、约瑟夫函数实现代码: #include"LinList.h" template void LinList { int k = 0; ListNode while(p!=NULL) {