当前位置:文档之家› 用C编写程序猴子选大王

用C编写程序猴子选大王

湖南人文科技学院计算机系课程设计说明书课程名称: 数据结构课程代码:题目: 猴子选大王年级/专业/班: 06级计算机科学与技术专业一班学生姓名:学号:06408109 06408102 06408107 0640812206408103指导教师: 刘刚常开题时间: 2008 年 6 月16 日完成时间: 2008 年 6 月29 日目录摘要 (3)一、引言 (4)二、设计目的与任务 (4)三、设计方案 (5)1、总体设计 (5)2、详细设计 (8)3、程序清单 (14)4、程序调试与体会 (22)5、运行结果 (23)四、结论 (24)五、致谢 (24)六、参考文献 (25)摘要本文首先介绍顺序表和链表并作以比较,我们分别使用循环队列和循环链表来解决猴子选大王的问题,程序使用了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 the seek elected king of the monkey problem . The procedure write with C language ,a very small part function is used by the C + +,and has chinese explanatory note.What’s more,it was debugged 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.Keywords : circular queue;circular linked list ;storage structure《数据结构》课程设计——猴子选大王一、引言数据结构是一门非常重要的基础学科,但是实验内容大都不能很好的和实际应用结合起来。

从而让很多学生认为学习数据结构并没有很大的作用。

但本实验运用数据结构的知识,很好的解决了一个对于人脑来说比较烦琐的实际问题。

链表是一种以链式结构存储的线性表,特点是数据元素可以用任意的存储单元存储,线性表中逻辑上相邻的两元素存储空间可以是不连续的。

同时为了表示逻辑关系,每个数据元素除了存放自身的数据信息外还要存储一个指示其直接后继的信息。

队列是一种先进先出的线性表。

它只允许在的表的一端进行插入,而在另一端删除元素。

循环队列是队列的顺序表示和实现。

从时间上考虑顺序表中插入和删除元素的时间复杂度为O(N) , 查找元素的时间复杂度为O(1); 而链表中插入和删除元素的时间复杂度为O(1) , 查找元素的时间复杂度为O(N)。

而链表中除了存放自身的数据信息外, 还要存放后继结点的地址信息, 存储密度不高。

本设计分别通过一个顺序存储结构和一个链表存储结构,再加适当函数与改变,就简明的解决了猴子选大王这个实际问题,其中顺序存储结构我们使用的是循环队列。

依次按要求淘汰猴子一直到找到猴王,并依次显示被淘汰猴子的编号,输出猴王的编号。

该程序具有一定的通俗性与实用性,其他类似的算法均可借鉴和参考使用。

该程序清单详细具体、全面,为了使组员之间能够很好的理解各自完成的程序,促进组员之间的沟通,我们在程序中添加了较多的注释和说明,具有很强的可读性。

二、设计目的与任务1、本课程设计的目的1)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能并培养学生进行规范化软件设计的能力。

2)训练学生灵活应用所学数据结构的基本知识,熟练的完成问题分析、算法设计、编写程序,求解出指定的问题;3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4)训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。

5)使学生会使用各种计算机资料和有关参考资料,提高学生进行程序设计基本能力。

2、本课程设计的任务问题描述:1)分别使用顺序和链表二种存储结构2)功能实现:一群猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。

输入数据:输入m,n 。

其中m,n 为整数,n<m输出形式:依次显示离开圈的猴子编号,并且输出为大王的猴子编号。

三、设计方案1、总体设计1)使用顺序存储结构实现我们选择的是使用一个循环队列来完成这个设计。

定义并构造一个空循环队列,把猴子按照1到m的顺序依次进入该队列,再按题目要求把被淘汰的猴子踢出队列,使用两个循环把被淘汰猴子的编号和猴王的编号分别输出。

本设计使用循环队列求解猴子选大王的问题,程序中定义的数据结构如下:定义一个循环队列typedef struct SqQueue进队列int EnQueue(SqQueue &Q,QElemType e)出队列int DeQueue(SqQueue &Q,QElemType &e)主程序包含模块:typedef struct SqQueue{ //定义一个循环队列}SqQueue;int InitQueue(SqQueue &Q){ //初始化}int EnQueue(SqQueue &Q,QElemType e){ //进队列} //EnQueue() endint DeQueue(SqQueue &Q,QElemType &e){ //出队列} //DeQueue() endint QueueLength(SqQueue Q){ //返回Q的元素个数,即队列的长度} // QueueLength() end void exit(){ }void Change(SqQueue &Q){ //选大王}void main(){ SqQueue Q;InitQueue(Q);Change(Q);}2)使用链表存储结构实现我们选择用一个循环链表来完成该设计,设计一个猴子的结构体, 并开辟空间用来存储猴子结构,生成了一个猴子结构的循环链表,对链表中的猴子进行编号,报号到n的猴子被淘汰,最后剩下的猴子为猴王,把依次被淘汰的猴子和猴王输出。

本设计使用循环链表求解猴子选大王的问题,程序中定义的数据结构如下:设计一个猴子的结构体typedef struct monkey开辟空间用来存储猴子结构head=p=p2=(LINK)malloc(sizeof(Monkey))开辟新空间用来存各个猴子结构p=(LINK)malloc(sizeof(Monkey))把链表变成循环链表p2->next=head报号为n的猴子被淘汰,最后剩下的是猴王,输出被淘汰的猴子和猴王while(1){if(i==m){ printf("%d号猴被淘汰\n",p->num)}else{ //没有报到m的继续报数}printf("猴王的编号为:%d",p->num);}3)菜单选择函数程序int menu_select() //{int x;printf(" \t\t 猴子选大王系统\n");printf(" \t\t 1 使用顺序表\n");printf(" \t\t 2 使用链表\n");printf(" \t\t 请选择:") ;2、详细设计1)使用顺序存储结构实现(1) 输入m,n.m是猴子的总个数,n是小于m的正整数数。

(2) 把m只猴子编上好“1,2,3……m”然后按照1--m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。

(3) 输出最后剩下的那只猴子的编号,这猴子就是大王。

(4) 对结果进行分析本程序设计中所包括的函数如下:typedef int QElemType;typedef struct SqQueue //定义一个循环队列{ 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、}SqQueue;int InitQueue(SqQueue &Q) //初始化{ 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、}int EnQueue(SqQueue &Q,QElemType e) //进队列{ 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、} //EnQueue() endint DeQueue(SqQueue &Q,QElemType &e) //出队列{ 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、} //DeQueue() endint QueueLength(SqQueue Q) //返回Q的元素个数,即队列的长度{、、、、、、、、、、、、、、、、、、、、、、、、、、、、、} // QueueLength() endvoid exit(){}void Change(SqQueue &Q)//选大王{int n,m;int e;cout<<"输入猴子总数:";cin>>m;for(int j=1;j<=m;j++)EnQueue(Q,j);cout<<"从第1个开始数,每数到第n个,该猴子将离开此圈"<<endl;cout<<"请输入n:"<<endl;cin>>n;cout<<"被淘汰猴子的顺序为:";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(int i=0;i<n-1;i++){e=DeQueue(Q,e);EnQueue(Q,e);}e=DeQueue(Q,e);}cout<<"猴王是编号为"<<e<<"的猴子"<<endl;Change(Q);}}void main(){SqQueue Q;InitQueue(Q);Change(Q);}2)使用链表存储结构实现(1) 设计一个猴子的结构体,typedef struct monkey(2) 输入m,n.m是猴子的总个数,n是小于m的正整数数。

相关主题