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

上传人:仙人指路1688 文档编号:4201147 上传时间:2023-04-09 格式:DOC 页数:16 大小:238.50KB
返回 下载 相关 举报
约瑟夫环课程设计数据结构.doc_第1页
第1页 / 共16页
约瑟夫环课程设计数据结构.doc_第2页
第2页 / 共16页
约瑟夫环课程设计数据结构.doc_第3页
第3页 / 共16页
约瑟夫环课程设计数据结构.doc_第4页
第4页 / 共16页
约瑟夫环课程设计数据结构.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《约瑟夫环课程设计数据结构.doc》由会员分享,可在线阅读,更多相关《约瑟夫环课程设计数据结构.doc(16页珍藏版)》请在三一办公上搜索。

1、数据结构课程设计题 目: 排序系统设计(约瑟夫环问题) 班 级: 网工10101班 姓 名: 房鸿朝 学 号 201017030127 同组人姓名: 起 迄 日 期: 2010年12月26日 课程设计地点: E3-A513 指导教师: 评阅意见:成绩评定:评阅人: 日期:完成日期:2011年12月摘要: 功能:设编号为1,2,3,n的n(n0)个人按顺时针方向围坐一圈,每个人持有一个正整数密码。开始时任选一个正整数做为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m是停止报数,报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数。如此下去,直到所有人全部出列为止。令n

2、最大值取30。要求设计一个程序模拟此过程,求出出列编号序列。目 录1需求分析21.1功能分析21.2设计平台22概要设计22.1创建循环单链表create()22.2输出查找search()32.3异常处理及屏幕清理clean()33程序设计主要流程43.1程序实现流程图44调试与操作说明44.1调试情况44.2操作说明5总 结7致 谢8附 录9参 考 文 献13=1=1 需求分析 1.1 功能分析 本次选做的课程设计是改进约瑟夫(Joseph)环问题。我选择了和罗源两个人来完成本次课程设计的作业。约瑟夫环问题是一个古老的数学问题,本次课题要求用程序语言的方式解决数学问题。此问题仅使用单循环链

3、表就可以解决此问题。在建立单向循环链表时,因为约瑟夫环的大小由输入决定。为方便操作,我们将每个结点的数据域的值定为生成结点时的顺序号和每个人持有的密码。进行操作时,用一个指针r指向当前的结点,指针H指向头结点。然后建立单向循环链表,因为每个人的密码是通过scanf()函数输入随机生成的,所以指定第一个人的顺序号,找到结点,不断地从链表中删除链结点,直到链表剩下最后一个结点,通过一系列的循环就可以解决改进约瑟夫环问题。1.2设计平台Windows2007操作系统;Microsoft Visual C+ 6.0;2概要设计已知n个人(以编号1,2,3.n分别表示)围成一圈。从编号为1的人开始报数,

4、数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到一圈的人全部出列。这个就是约瑟夫环问题的实际场景,有一种是要通过输入n,m,k三个正整数,来求出列的序列。这个问题采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。r-next=H。解决问题的核心步骤:首先建立一个具有n个链结点,无头结点的循环链表。然后确定第1个报数人的位置。最后不断地从链表中删除链结点,直到链表为空。本课程设计主要采用了结构体,程序中包含了两个只要函数:create();search();2.1 创建循环单链表create()dtypeef struct No

5、de 定义一个结构体,m为密码,n为序号(总人数)。=2=定义H=NULL创建一个没有头结点的单向循环链表,并采for(i=1;i=H时创建单向循环链表成功,并返回H的值作为总人数。单项循环链表示意图: 每当结点计数到某一结点时,将他的前驱结点接到他的后继结点,然后将他的密码值password赋给计数变量,再将此结点删除。如此循环下去,直到最后变为空的单循环链表为止。2.2 输出查找search()用循环链表实现报数问题,利用count累计报数人数,num为标记出列人数计数器。当随机输入初始密码m0时即从第一个人报起,到第m时取出m并显示,在释放该指针指向m的值,从删除位的下一个人开始报起,按

6、该人的密码为m实现对总个链表的输出,指针没报数一次则后移一个节点。实现代码:pre-next=p-next;printf(%d ,p-n);m0=p-m;free(p); p=pre-next; 2.3异常处理及屏幕清理clean() system(cls); 对上次输入的及运行结果是否进行屏幕清理工作。使程序运行界面不至于太过混乱,也可以将第二次的实验结果和先前的实验结果进行比较从而可以发现程序是否出现运行错误,便于检查和修改。=3=3. 程序设计主要流程3.1 程序实现流程图(图3-1)主菜单1.输入约瑟夫环2.显示约瑟夫环问题的描述3.结束界面是否执行清屏(1=Y,2=N)?1.清屏进入

7、2.不清屏进入 图3-1 程序实现流程图 4调试与操作说明4.1调试情况这次的课程设计的代码很冗长,所以等有了解题思路后,把代码都写上后难免会有很多错误。当第一次把整个程序写好后运行,出现了很多错误。如赋值语句H=NULL没有定义,从而形成带空头结点的单链表,以及在操作r指针后移找出m时,没对r当时的值进行释放从而导致下个输出出现错误。不过经过一点点的改正,错误也慢慢地变少。这也说明做事要认真,尤其做计算机这方面工作的时候,因为计算机不容许不一点点的错误,有了一点小错误和有一个大错误在计算机看来都是一样的,都不会得不到结果。有些小错误,比如说少了个分号,变量忘了定义,数据溢出等都是些小错误,但

8、也不能松懈。因为要注意的地方很多,经过多次尝试,问题也就自然而然的解决了,而且以后遇到这方面的问题都会觉得比较得心应手。在调试的过程中,结构体的优势很明显,能很简单的把问题解决,而不需要使用的其他的一些比较复杂的方法。=4=4.2操作说明生成界面如图4-1,4-2,4-3,4-4,4-5所示; 图 4-1 主菜单图4-2输入约瑟夫环=5=当程序运行的时候会出现如上图所示的提示,要求使用者输入程序中所需的输入总人数,使用者只需输入自己所想的总人数,便可以随机输入每个人对应的密码。最后系统会给出出列的次序。使用者还可进行选择是否记录上次数据,进行下一次的操作。图4-3显示约瑟夫环问题图4-4退出程

9、序=6=图4-5 当输入人数超过最大数总 结为期一周的课程设计快结束了,通过这次数据结构课程设计,我感受最深的就是对于循环链表的使用,可以说对循环链表有了比以前更进一步的认识,以前只是一知半解的,如果只给个题目自己根本不能把程序完整地编写出来,所以这次课程设计最大的收获就在于对循环链表有了一定的理解,包括其中的一系列操作,如建立一个循环链表,删除链表中的一个结点,增加一个结点等。在这次课程设计过程中需要我们一边设计一边探索,这这个过程当中我发现自己在数据结构方面知识掌握不够深入,对一些基本概念不能很好的理解,对一些数据结构不能够熟练的进行上机实现,这是自己比较薄弱的。学好基础知识是理论付诸实践

10、的前提,这样理论和实践才能充分地结合起来。在以后的学习中,我还要努力改正,充分利用上机实验的机会提高自己。在程序的输入的时候,因为自己对键盘的不熟练,代码又很多很繁琐,常常会产生放弃的念头,从中我也=7=感受到只有坚持到底,胜利才会出现。在调试程序的时候我也有所体会,虽然约瑟夫环问题不是很难,但调试的时候还是会出现很多错误,因此我们不能认为容易就不认真对待。在以后的学习中,要能不断发现问题,提出问题,解决问题,从不足之处出发,在不断学习中提高自己。 致谢这次的课程设计,我们两人一个小组去完成我们自己的课程.,让我们有机会贴近现实,感受成功的喜悦;其次要感谢实验机房的老师提供优良的实验设备供我们

11、做实验,正是这种良好的实验环境让我们整个实验过程心情都非常愉快。再次要感谢指导老师们的辛勤指导,每当我们遇到疑难问题时,是他们一次次不厌其烦的解释和悉心的指导,我们才能闯过一个个难关,到达胜利的彼岸,是他们给我们提供了一次宝贵的检验自己机会。只有在真正实战的时候才会发现书到用时方恨少的真谛。有时感觉自己那么一次次举手请教,可问题又那么幼稚简单。老师是那么的耐心与不厌其烦,直到我们点头说懂得的时候老师才离开。最后也要感谢同学们的帮助,感谢所有在我课程设计过程中帮助过我的人!=8=附 录#include #include #include#include #include#define NULL

12、0typedef struct Node int m;/密码int n;/序号struct Node *next;Node,*Linklist;Linklist create(int z) /生成循环单链表并返回,z为总人数 int i,mm;Linklist H,r,s;H=NULL;printf(Output the code:);for(i=1;in=i;s-m=mm;printf(%d号的密码%d,i,s-m);if(H=NULL)/从链表的第一个节点插入 H=s;r=H;else/链表的其余节点插入 r-next=s;r=s;/r后移/for结束r-next=H;/*生成循环单链表*

13、/=9=return H;void search(Linklist H,int m0,int z)/用循环链表实现报数问题 int count=1;/count为累计报数人数计数器int num=0;/num为标记出列人数计数器Linklist pre,p;p=H;printf(出列的顺序为:);while(numnext;while(countnext=p-next;printf(%d ,p-n);m0=p-m;free(p);p=pre-next;count=1;num+;/while结束void clean()int system(const char *string);int inqu

14、iry;printf(请问需要清除上一次操作记录吗(1.清屏/2.不清屏).?n);scanf(%d,&inquiry);if(inquiry =1)system(cls);void text()int m0,z,i, choose,k=1; /k用来阻止第一次进入程序清屏操作Linklist H; bool chooseFlag=false;while(1)=10=if(k!=1)clean();k+;while(!chooseFlag)printf( 欢迎进入约瑟夫环问题系统 n);printf( * 1.输入约瑟夫环数据 * n);printf( * 2.什么是约瑟夫环 * n);pri

15、ntf( * 3.退出系统 * n);printf( . n);printf(请输入相应的数字进行选择: ); scanf(%d,&choose);for(i=1;i=4;i+)if(choose=i) chooseFlag=true; break;else chooseFlag=false;if(!chooseFlag) printf(Error Input!n); /end while(!chooseFlag)if(choose=1) /if 开始printf(Input how many people in it:);/z为总人数scanf(%d,&z);if(z=30)H=create

16、(z);/函数调用printf(nInput the start code m0=);scanf(%d,&m0);search(H,m0,z);printf(nnn);else printf(超过最大输入人数n); break;=11=else if(choose=2)printf(n约瑟夫环问题:设有n个人,其编号分别为1,2,3,n,安装编号顺序顺时针围坐一圈。选定一个正整数m,从第一个人开始顺时针报数,报到m时,则此人出列,然后从他的下一个人从1重新报数,依此类推,直到所有人全部出列为止,求出列的顺序。nn);else if(choose=3)printf(程序结束n);break;el

17、seprintf(错误!n);/end ifchooseFlag=0;/end while(1)void main() time_t timer ;/*时间*/struct tm *ptrtime;/*指向struct tm的指针*/ timer = time( NULL ) ;/*调用time()函数获取当前时间*/ptrtime = localtime( &timer ) ;/*调用localtime()函数将获得的系统时间转化为指向struct tm的指针指向的结构体*/ printf( 系统时间: %s,asctime( ptrtime ) ) ;/*用asctime()将结构体转化为字符串输出*/ text();=12=参 考 文 献 1张乃孝,裘宗燕.数据结构C+与面向对象的途径.北京:高等教育出版社,19982 周云静数据结构习题解析与上机指导北京:冶金工业出版社,20043 陈慧南数据结构C+语言描述北京:人民邮电出版社,20054 严蔚敏,吴伟民数据结构北京:清华大学出版社,19975 Adam Drozdek数据结构与算法北京:清华大学出版社,20066 徐孝凯数据结构实验北京:中央广播电视大学出版社,2001 =13=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号