约瑟夫环课程设计(数据结构)(共16页).doc
《约瑟夫环课程设计(数据结构)(共16页).doc》由会员分享,可在线阅读,更多相关《约瑟夫环课程设计(数据结构)(共16页).doc(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上计算机学院网络工程专业数据结构课程设计题 目: 排序系统设计(约瑟夫环问题) 班 级: 网工10101班 姓 名: 房鸿朝 学 号 7 同组人姓名: 罗源 起 迄 日 期: 2010年12月26日 课程设计地点: E3-A513 指导教师: 徐晓蓉 评阅意见:成绩评定:评阅人: 日期:完成日期:2011年12月摘要: 功能:设编号为1,2,3,n的n(n0)个人按顺时针方向围坐一圈,每个人持有一个正整数密码。开始时任选一个正整数做为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m是停止报数,报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数
2、。如此下去,直到所有人全部出列为止。令n最大值取30。要求设计一个程序模拟此过程,求出出列编号序列。目 录=1=1 需求分析 1.1 功能分析 本次选做的课程设计是改进约瑟夫(Joseph)环问题。我选择了和罗源两个人来完成本次课程设计的作业。约瑟夫环问题是一个古老的数学问题,本次课题要求用程序语言的方式解决数学问题。此问题仅使用单循环链表就可以解决此问题。在建立单向循环链表时,因为约瑟夫环的大小由输入决定。为方便操作,我们将每个结点的数据域的值定为生成结点时的顺序号和每个人持有的密码。进行操作时,用一个指针r指向当前的结点,指针H指向头结点。然后建立单向循环链表,因为每个人的密码是通过sca
3、nf()函数输入随机生成的,所以指定第一个人的顺序号,找到结点,不断地从链表中删除链结点,直到链表剩下最后一个结点,通过一系列的循环就可以解决改进约瑟夫环问题。1.2设计平台Windows2007操作系统;Microsoft Visual C+ 6.0;2概要设计已知n个人(以编号1,2,3.n分别表示)围成一圈。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到一圈的人全部出列。这个就是约瑟夫环问题的实际场景,有一种是要通过输入n,m,k三个正整数,来求出列的序列。这个问题采用的是典型的循环链表的数据结构,就是将一个链表的尾元
4、素指针指向队首元素。r-next=H。解决问题的核心步骤:首先建立一个具有n个链结点,无头结点的循环链表。然后确定第1个报数人的位置。最后不断地从链表中删除链结点,直到链表为空。本课程设计主要采用了结构体,程序中包含了两个只要函数:create();search();2.1 创建循环单链表create()dtypeef struct Node 定义一个结构体,m为密码,n为序号(总人数)。=2=定义H=NULL创建一个没有头结点的单向循环链表,并采for(i=1;i=H时创建单向循环链表成功,并返回H的值作为总人数。单项循环链表示意图: 每当结点计数到某一结点时,将他的前驱结点接到他的后继结点
5、,然后将他的密码值password赋给计数变量,再将此结点删除。如此循环下去,直到最后变为空的单循环链表为止。2.2 输出查找search()用循环链表实现报数问题,利用count累计报数人数,num为标记出列人数计数器。当随机输入初始密码m0时即从第一个人报起,到第m时取出m并显示,在释放该指针指向m的值,从删除位的下一个人开始报起,按该人的密码为m实现对总个链表的输出,指针没报数一次则后移一个节点。实现代码:pre-next=p-next;printf(%d ,p-n);m0=p-m;free(p); p=pre-next; 2.3异常处理及屏幕清理clean() system(cls);
6、 对上次输入的及运行结果是否进行屏幕清理工作。使程序运行界面不至于太过混乱,也可以将第二次的实验结果和先前的实验结果进行比较从而可以发现程序是否出现运行错误,便于检查和修改。=3=3. 程序设计主要流程3.1 程序实现流程图(图3-1)主菜单1.输入约瑟夫环2.显示约瑟夫环问题的描述3.结束界面是否执行清屏(1=Y,2=N)?1.清屏进入2.不清屏进入 图3-1 程序实现流程图 4调试与操作说明4.1调试情况这次的课程设计的代码很冗长,所以等有了解题思路后,把代码都写上后难免会有很多错误。当第一次把整个程序写好后运行,出现了很多错误。如赋值语句H=NULL没有定义,从而形成带空头结点的单链表,
7、以及在操作r指针后移找出m时,没对r当时的值进行释放从而导致下个输出出现错误。不过经过一点点的改正,错误也慢慢地变少。这也说明做事要认真,尤其做计算机这方面工作的时候,因为计算机不容许不一点点的错误,有了一点小错误和有一个大错误在计算机看来都是一样的,都不会得不到结果。有些小错误,比如说少了个分号,变量忘了定义,数据溢出等都是些小错误,但也不能松懈。因为要注意的地方很多,经过多次尝试,问题也就自然而然的解决了,而且以后遇到这方面的问题都会觉得比较得心应手。在调试的过程中,结构体的优势很明显,能很简单的把问题解决,而不需要使用的其他的一些比较复杂的方法。=4=4.2操作说明生成界面如图4-1,4
8、-2,4-3,4-4,4-5所示; 图 4-1 主菜单图4-2输入约瑟夫环=5=当程序运行的时候会出现如上图所示的提示,要求使用者输入程序中所需的输入总人数,使用者只需输入自己所想的总人数,便可以随机输入每个人对应的密码。最后系统会给出出列的次序。使用者还可进行选择是否记录上次数据,进行下一次的操作。图4-3显示约瑟夫环问题图4-4退出程序=6=图4-5 当输入人数超过最大数总 结为期一周的课程设计快结束了,通过这次数据结构课程设计,我感受最深的就是对于循环链表的使用,可以说对循环链表有了比以前更进一步的认识,以前只是一知半解的,如果只给个题目自己根本不能把程序完整地编写出来,所以这次课程设计
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 约瑟夫 课程设计 数据结构 16
限制150内