版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、湖南人文科技学院计算机系课程设计说明书课 程名称:数据 结构课程代码:题目:猴子选大王年级/专业/班:06级计算机科学与技术专业一班学生姓名:学 号:06408109 06408102 06408107 0640812206408103指导教 师:文【I冈5常开题时间:2008年6月16B完成时间:2008年6月29.4.目录摘3.一、4.、设计目的与任务三、设计方案5.1 、总体设计5.2 、详细设计8.3、程序清单4、程序调试与体会22.5、运行结果23四、结论2.4.五、致谢2.4.六、参考文献2.5摘要 本文首先介绍顺序表和链表并作以比较,我们分 别使用循环队列和循环链表来解决猴子选大
2、王的问题,程序使用了 c语言编写,有很少一部分函数是 用C+编写的,有比较详细的中文注释并在VC+下调试运行通过。整个程序使用中文界面,并 有相应的提示信息,便于操作和程序运行。关键词:循环队列;循环链表;存储结构AbstractThis paper details the difference of sequence list and linklist.We respectively use queue and circular queue and circular linked list to solve theseek elected kingof the monkey problem
3、. The procedure write with C language,a very small partfunction is used by the C + +,and has Chinese explanatory note.What*s more,it wasdebugged in VC+ debugger and run very well.The whole procedure,with Chinese interface and thecorresponding hints,is convenient to run and easy to be operated.storag
4、e structureKeywords : circular queue ; circular linked list数据结构课程设计猴子选大王一、弓言数据结构是一门非常重要的基础学科,但是实验内容大都不能很好的和实际应用结合 起来。从 而让很多学生认为学习数据结构并没有很大的作用。但本实验运用数据结构的知识,很好的解决了 一个对于人脑来说比较烦琐的实际问题。链表是一种以链式结构存储的线性表,特点是数据元素可以用任意的存储单元存储,线性表中 逻辑上相邻的两元素存储空间可以是不连续的。同时为了表示逻辑关系,每个数据元素除了存放自 身的数据信息外还要存储一个指示其直接后继的信息。队列是一种先进先出
5、的线性表。它只允许在的 表的一端进行插入,而在另一端删除元素。循环队列是队列的顺序表示和实现。从时间上考虑顺序表 中插入和删除元素的时间复杂度为O(N),查找元素的时间复杂度为0(1);而链表中插入和删除元素 的时间复杂度为0(1),查找元素的时间复杂度为O(N)。而链表中除了存放自身的数据信息外,还 要存放后继结点的地址信息,存储密度不高。本设计分别通过一个顺序存储结构和一个链表存储结构,再加适当函数与改变,就简明的解决了 猴子选大王这个实际问题,其中顺序存储结构我们使用的是循环队列。依次按要求淘汰猴子一直到 找到猴王,并依次显示被淘汰猴子的编号,输出猴王的编号。该程序具有一定的通俗性与实用
6、 性,其他类似的算法均可借鉴和参考使用。该程序清单详细具体、全面,为了使组员之间能够很好 的理解各自完成的程序,促进组员之间的沟通,我们在程序中添加了较多的注释和说明,具有很强 的可读性。二、设计目的与任务1、本课程设计的目的1)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能并培养学 生进行规范化软件设计的能力。2)训练学生灵活应用所学数据结构的基本知识,熟练的完成问题分析、算法设计、编写程序,求解出指定的问题;3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4)训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编 程水平,并
7、在此过程中培养他们严谨的科学态度和良好的工作作风。5)使学生会使用各种计算机资料和有关参考资料,提高学生进行程序设计基本能力。2、本课程设计的任务问题描述:1 )分别使用顺序和链表二种存储结构2)功能实现:一群猴子都有编号,编号是1,2,3 .m,这群猴子(m个)按照1-m的顺序围坐圈,从第1开始数,每数到第n个,该猴子就要离开此,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。输入数据:输入m,n。其中m,n为整数,n<m输出形式:依次显示离开圈的猴子编号,并且输出为大王的猴子编号。三、设计方案1、总体设计1)使用顺序存储结构实现我们选择的是使用一个循环队列来完成这个设计。定
8、义并构造一个空循环队列,把猴子按照1到m的顺序依次进入该队列,再按题目要求把被淘汰的猴子踢出队列,使用两个循环把被淘汰猴子的编号和猴王的编号分别输出。本设计使用循环队列求解猴子选大王的问题,程序中定义的数据结构如下:定义一个循环队列typedef struct SqQueue进队列 int EnQueue(SqQueue &Q,QEIemType e)出队列 int DeQueue(SqQueue &Q,QEIemType &e)主程序包含模块:typedef struct SqQueue/定义一个循环队列SqQueue;int lnitQueue(SqQueue &a
9、mp;Q)/初始化int EnQueue(SqQueue &Q,QEIemType e)/进队列 /EnQueue() endint DeQueue(SqQueue &Q,QEIemType &e)/ 出队列 DeQueue() endint QueueLength(SqQueue Q)/返回Q的元素个数,即队列的长度 / QueueLength() end void exit()(void Change(SqQueue &Q)/选大王void main() SqQueue Q;InitQueue(Q);Change(Q);2)使用链表存储结构实现我们选择用一个
10、循环链表来完成该设计,设计一个猴子的结构体,并开辟空间用来存储猴子 结构,生成了一个猴子结构的循环链表,对链表中的猴子进行编号,报号到n的猴子被淘汰,最后 剩下的猴子为猴王,把依次被淘汰的猴子和猴王输出。本设计使用循环链表求解猴子选大王的问题,程序中定义的数据结构如下:设计一个猴子的结构体typedef struct monkey开辟空间用来存储猴子结构head=p=p2=(LINK)malloc(sizeof(Monkey)开辟新空间用来存各个猴 子结构 p=(LINK)malloc(sizeof(Monkey)把链表变成循环链表 p2->next=head报号为n的猴子被淘汰,最后剩
11、下的是猴王,输出被淘汰的猴子和猴王while(1)(if(i=m) printf("d 号猴被淘汰 nn5p->num)else /没有报到m的继续报数printf(H 猴王的编号为:%d",p->num);3)菜单选择函数程序int menu_select() /(printf(H ttint x;猴子选大王系统n");printf(Httprintf(Httprintf(ntt1使用顺序表nn);2使用链表n“);请选择:”);2、详细设计1)使用顺序存储结构实现 (1)输入m,n.m是猴子的总个数,n是小于m的正整数数。 把m只猴子编上好“ 1,
12、2,3m”然后按照1-m的顺序围坐一圈,从第1开始 数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到中只剩下最后一只猴子,则该猴子为大王。(3)输出最后剩下的那只猴子的编号,这猴子就是大王。 对结果进行分析 本程序设计中所包括的函数如下:typedef int QEIemType;typedef struct SqQueue / 定义一个循环队列、SqQueue;int lnitQueue(SqQueue &Q) / 初始化int EnQueue(SqQueue &Q5QEIemType e) / 进队列 /EnQueue() end/出队列int DeQueue(Sq
13、Queue &Q5QEIemType &e) /DeQueue() end/返回Q的元素个数,即队列的长度int QueueLength(SqQueue Q)、 / QueueLength() endvoid exit() void Change(SqQueue &Q)/ 选大王int n,m;int e;cout«"输入猴子总数:”;cin»m;for(int j=1 ;jv=m;j+)EnQueue(QJ);n«endl;cout«"从第1个开始数,每数到第n个,该猴子将离开此 coutvv” 请输入 n:
14、n«endl;cin»n;cout«"被淘汰猴子的顺序为:”;if(n<m)while(QueueLength(Q)!=1)/当只剩下一个元素时循环结束5依次输出被淘汰猴子编号for(int i=0;i<n-1 ;i+)e=DeQueue(Q,e);EnQueue(Q,e);)e=DeQueue(Q,e);cout«e;)while(Q.front!=Q.rear) /循环到最后找出猴王(for(int i=0;i<n-1 ;i+)(e=DeQueue(Q,e);EnQueue(Q,e);)e=DeQueue(Q,e);)co
15、ut«H猴王是编号为«e«的猴子n«endl;Change(Q);void main()(SqQueue Q;InitQueue(Q);Change(Q);2)使用链表存储结构实现 (1)设计一个猴子的结构体,typedef struct monkey(2)输入m,n.m是猴子的总个数,n是小于m的正整数数。(3)开辟空间用来存储猴子结构,生成了个猴子结构的链表,并使其循环head=p=p2=(LINK)malloc(sizeof(Monkey);for(i=1 ;ivn;i+)(p=(LINK)malloc(sizeof(Monkey);p2->
16、next=p;P2=P;p2->next=head;(4)找出所有被淘汰的猴子编号和猴王的编号,并将其输出。while(1)i+;if(p->next=p)break;if(i=n)(i=0;p2->next=p->next; printf(,f%dn5p->num);p=p2->next;)else(if(i=n-1) p2=p;p=p->next;printf(H 猴王的编号为:%dnn,p->num);3)主菜单选择程序和主函数int menu_select() /菜单选择函数程序猴子选大王系统n");1使用顺序表nn);2使用链
17、表n”);请选择:”);int x;printf(nttprintfC*ttprintfC*ttprintf(nttfor(;)scanf(-d”,&x);if(x<=0 | x>2)printf”nt输入错误,重选1-2elsebreak;return x;)void main()(switch(menu_select()(case 1:SqQueue Q;InitQueue(Q);Change(Q);break;return;case 2:monkey();break;return;) )3、程序清单#include<iostream.h>#include&
18、lt;malloc.h>#include <stdio.h>#include <stdlib.h># define STACKJNIT_SIZE 100# define STACKINCREMENT 10# define MAXQSIZE 100# define OK 1# define ERROR 0 typedef int QEIemType;typedef struct SqQueue / 定义一个循环队列 QEIemType *base;int front;int rear;SqQueue;int lnitQueue(SqQueue &Q)/ 构造
19、一个空队列 Q Q.base=(QEIemType *)malloc(MAXQSIZE*sizeof(QEIemType); if(!Q.base) return ERROR; 存储分配失败 Q.front=Q,rear=0;return OK;int EnQueue(SqQueue &Q,QEIemType e) / 进队列if(Q.rear+1 )%MAXQSIZE=Q.front)return ERROR; / 队列满Q.baseQ.rear=e;Q.rear=(Q.rear+1 )%MAXQSIZE;return OK; /EnQueue() endint DeQueue(Sq
20、Queue &Q,QEIemType &e)/ 出队列if(Q.front=Q.rear)return ERROR;e=Q.baseQ.front;Q.front=(Q.front+1 )%MAXQSIZE;return e; /DeQueue() endint QueueLength(SqQueue Q) /返回Q的元素个数,即队列的长度return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE; /QueueLength() end void exit() void Change(SqQueue &Q)/ 选大王int n,m;int e;co
21、ut«M输入猴子总数:”;cin»m;for(int j=1 ;jv=m;j+)EnQueue(QJ);coutvv” 请输入 n:n«endl;cin»n;cout«n被淘汰猴子的顺序为if(n<m)(while(QueueLength(Q)!=1)/当只剩下一个元素时循环结束,依次输出被淘汰的猴 子编号for(int i=0;i<n-1 ;i+)(e=DeQueue(Q,e);EnQueue(Q,e);e=DeQueue(Q,e);cout«e;while(Q.front!=Q.rear) 循环到最后找出猴王for(i
22、nt i=0;i<n-1 ;i+)(e=DeQueue(Q,e);EnQueue(Q,e); e=DeQueue(Q,e);cout«"猴王是编号为«e«的猴子H«endl;Change(Q); typedef struct monkey /设计一个猴子的结构体,该结构体用monkey表示/link表示该结构体的 指针(int num; 它的号码struct monkey *next; /下个猴子的地址指针 Monkey,*LINK;void monkey() int n,m;printf("请输入猴子总数m的值:n"
23、);scanf(n%d"5&m);printf("请输入n的值:n”);scanf("d”,&n);printf ("被淘汰猴子的顺序为:”);LINK p,head,p2; /定义了三个猴子结构的指针int i;head=p=p2=(LINK)malloc(sizeof(Monkey);/ 开辟空间用来存储猴子结构for(i=1 ;ivm;i+) /生成了个猴子结构的链表 (p=(LINK)malloc(sizeof(Monkey); /开辟新空间用来存各个猴子结构p2->next=p;P2=P;p2,next=head;这步很重
24、要,这样链表变成循环链表了,也就是说链表到了结/尾它的下个地址就是链表头了如此不停循环下去,就是个圆p=head;for(i=1 ;iv=m;i+)(p->num=i;/对猴子编号p=p->next; /指针指向下个猴子 /所有猴子编号结束i=0;p=head; 又将p指向了链表的头while(1)i+;H(p,next=p)这是结束条件,你想自己的下一个就是自己本身了,是不是说明只剩下自己了,也就是大王了 break;if(i=n) 如果这一个报到了数ni=0; /再次从1开始报数,因为以后要执行i+语句p2->next=p->next; 将该猴子从链表中拿下prin
25、tf("%d'p->num);/这个号码的猴子要被淘汰p=p2->next;/指针指向下一个猴子else /没有报到m的继续报数(if(i=n-1) p2=p;p=p->next;printf("猴王的编号为:%dn'p->num);int menu_select() /菜单选择函数程序猴子选大1使用顺序表n 2使用链表n");请选择:”);int x;王系统己);1);printfC1ttprintf(HttprintfC1ttprintf(nttfor(;)scanf("d”,&x);if(x<=
26、0 | x>2)printf("nt 输入错误,重选 1-2 :");elsebreak;return x; )void main()(switch(menu_select()case 1:SqQueue Q;InitQueue(Q);Change(Q);break;return;case 2:monkey();break;return;4、程序调试与体会程序调试的步骤:1)调试各个模块函数,并测试模块间参数的传递与调用。2)调试主函数和对其他模块函数的调用,并检验最后的输出结果。本程序还算比较简单,用链表存储 结构不是很复杂,在使用循环链表的程序中最主要 的是定义一
27、个结构体,然后构造一个循环链表并为 其在结构体中开辟存储空间。但是真正的程序中还要考虑各种限制条件,这就给调试过程带来一些问 题,例如在出队列的过程中,可能队列已经为空队列,就要给出该队列为空队列此信息的提示,还有 在使用循环队列的 程序中我们刚开始只能输出猴王的编号,却不能输出各个被淘汰猴子的编号,后来 才发现是循环控制的不对,在使用循环链表的程序中我们刚开始调试根本不出结果,后来发现是在编 号和循环函数之前没返回链表的表头。通过本次课程设计,我们学到了很多东西:首先,平时在学理论知识时觉得很简单容易的知识,实践起来并不是那么容易。比如 最基础的构 造结构体,要完全不出错的用自己的语言输到屏
28、幕上,却要求对相关知识的掌握熟练到一定程度。又如,循环的次数不能多也不能少,否则就会导致输出结果不是所需的。其次,只有理论知识没实践经验是不可能成为一名出色的软件设计师的。理论是实践 的基础, 实践是对所学知识的巩固与提高,只有理论与实践相结合才能真正掌握知识。再次,我们还懂得了团结精神的重要性。设计思路是最重要的,只有大家讨论出来的设计思路 才是清晰的,这是程序设计成功的关键。在本次程序设计过程中,大家共同努力,分工合作,一起到 图书馆找资料,找范文,并在网上搜索了大量的资料,共同学习,使得我们共同进步。一个人的力量 是有限的,但团结的力量是无穷的。在竞争如此激烈的当今 社会,这些东西都是终
29、生实用的,为我们 以后的工作和学习奠定了基础。最后,这次程序设计提炼了我们的心理素质。设计过程是一个考验人耐心的过程,不能有丝毫 的急躁,马虎。在不影响试验的前提下可以加快进度。必须要有耐心,要有坚持的毅力。程序需要反 复调试,其过程很可能相当烦琐,而且在程序调试出来后写报告书也是一个很繁琐的过程,有时花很 长时间写出来的报告书还是需要重写,那时心中未免有点灰心,有时还特别想放弃,此时更加需要静 下心,查找原因。5、运行结果主菜单函数运行结果如图1所示,主菜单函数是一个选择函数L /图1有两种选择,输入你要选择的一项使用顺序表程序运行结果如图2所示,输入选择1,输入猴子总数和n的值图2猴子总数为6,n为2,依次被淘汰的猴子是24631号,猴王为5号使用链表程序运行结果如图3所示,输入选择2,输入猴子总数和n的值图3猴子总数为9,n为4,依次被淘汰的猴子是48396572号,猴王为1号四、结论经过将近两周的数据结构课程设计,我们分别
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024医疗机构医疗服务与技术合作协议
- 2024年度品牌合作发展协议
- 2024年度版权许可使用合同许可期限与使用方式
- 2024复印机共享租用合同说明
- 2024年国际品牌服装连锁加盟合同
- 2024委托采购合同样本
- 04园林绿化工程设计与施工合同
- 2024年度旅游服务合同详细描述及合同标的
- 2024年度文化创意产业项目投资合同
- 2024个人租房合同范例
- (试卷)建瓯市2024-2025学年第一学期七年级期中质量监测
- 《安徽省二年级上学期数学期末试卷全套》
- 2024年企业业绩对赌协议模板指南
- “全民消防生命至上”主题班会教案(3篇)
- 24秋国家开放大学《当代中国政治制度》形考任务1-4参考答案
- “以德育心,以心育德”
- 临床用药管理制度
- 多层工业厂房施工组织设计#现浇框架结构
- 消防控制室值班记录(制式表格).doc
- 艰辛与快乐并存-压力与收获同在——我的课题研究故事
- 混凝土拦挡坝的施工方案
评论
0/150
提交评论