猴子选大王数据结构课程设计报告(内附详细注释)
用c++编写程序猴子选大王

用C++编写程序猴子选大王(总7页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--湖南人文科技学院计算机系课程设计说明书课程名称: 数据结构课程代码:题目: 猴子选大王年级/专业/班: 06级计算机科学与技术专业一班学生姓名:学号:06408109 06408102 06408107 06408122 06408103指导教师: 刘刚常开题时间: 2008 年 6 月 16 日完成时间: 2008 年 6 月 29 日目录摘要..................................................................................................................... 错误!未定义书签。
一、引言............................................................................................................. 错误!未定义书签。
二、设计目的与任务......................................................................................... 错误!未定义书签。
三、设计方案....................................................................................................... 错误!未定义书签。
1、总体设计......................................................................................................... 错误!未定义书签。
猴子选大王 数据结构课程设计

i am the king of monkeies
问题描述
一群猴子都有编号,编号是1,2,„„m,这群猴
子按照顺序围坐成一圈,从第一个开始数,每数到第
n个,该猴子就要离开此圈,这样依次数下来,直到 圈中只剩下最后一只猴子,则该猴子为大王。
我们选择用一个循环链表来完成
该设计,设计一个猴子的结构体,
直至剩下最 后一个链表
单链表的删除
为了删除第i个猴子Mi,必须找到猴子的存储地址。 该存储地址是在其直接前趋结点Mi-1的next域中,因 此,必须首先找到Mi-1的存储位置p,然后令p– 图解 >next指向Mi的直接后继结点,即把Mi从中赶出。
算法设计与实现
1. 对每一个猴子进行编号 2. 3. 每数到n便删除该猴子,当循环单链表只剩一个时, 主函数 r=q=(listnode *)malloc(sizeof(listnode)); int main() 输出该编号 for(i=1;i<=n-1;i++) for(i=1;i<n;i++){ { { p=(listnode*)malloc(sizeof(listnode)); linklist r; for(j=1;j<=k-1;j++) p=p->next; q->data=i; int n,k; q=p->next; q->next=p; linklist initring(int n,linklist r); p->next=q->next; q=p; linklist deletedeath(int n,int k,linklist r); if(i % 10==0) } free(q); void outring(int n,linklist r); } p->data=n; printf("请输入猴子总数m:"); printf("\n"); p->next=r; scanf("%d",&n); r=p;return r; } r=p; printf("请输入n:"); void outring(int n,linklist r) scanf("%d",&k); { int i; r=initring(n,r); listnode *p; r=deletedeath(n,k,r); p=r; printf("猴子大王:"); outring(n,r); printf("%4d\n",p->data);
猴子选王问题求解和二叉树建立——课程设计报告

《数据结构》课程设计———————猴子选王问题求解和二叉树的建立专业计算机科学与技术班级指导教师编写日期 2012年6月24日目录一、课程设计的目的 (3)二、课程设计的要求 (3)三、相关知识 (3)四、问题的分析 (3)五、数据结构的描述 (4)六、算法的设计 (4)七、代码实现 (6)八、程序运行成功展示 (11)九、心得体会 (14)十、参考资料 (14)一、课程设计的目的课程设计是学生对课程所学知识的综合运用,它与课堂听讲、上机实验、课外练习、自学研究相辅相成,构成一个完整的课程教学体系。
《数据结构》是一门实践性强的课程,其中对算法设计和程序编写的掌握尤为重要。
学生虽然可以通过与课堂教学同步的上机实验完成相关内容的练习,但却往往局限于一些功能简单、彼此之间关系独立的算法和程序。
课程设计是一种综合训练,致力于培养学生全面、灵活的算法设计思想和较高的编程能力,为今后从事计算机开发与应用打下基础。
新世纪需要具有丰富科学知识、独立解决实际问题、有创造能力的新型人才,这也是该课程设计的最终目的。
二、课程设计的要求1、猴子选王问题描述一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
2、二叉树的建立描述已知二叉树T中结点的前序和中序遍历序列,编写算法实现构造满足上述条件的二叉树。
3、界面设计模块问题描述设计一个菜单式界面,让用户可以选择要解决的问题,同时可以退出程序。
界面要求简洁明了,大方得体,便于用户的使用,同时,对于用户的错误选择可以进行有效的处理。
三、相关知识1、猴子选王求解约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,他参加并记录了公元66—70年犹太人反抗罗马的起义。
约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名死硬的将士在附近的一个洞穴中避难。
猴子选大王数据结构课程设计报告内附详细注释

1.需求分析问题定义:一堆猴子都有编号,编号是1,2,3…n,这群猴子(n个)按照1-n的顺序围坐一圈,从第1个开始数,每数到第m个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
m,n键盘输入,且m<n,输出为大王的猴子的号数。
问题分析:根据任务描述可知,编号是1,2,3…n的一群猴子按照1-n的顺序围坐一圈,因此可以用指针指向数组的方法给数组赋值,输入n值和m值,为保证m<n,用一个while( )#include<stdio.h>#include<stdlib.h> //使用calloc()函数void FindKing_pointer(int,int,int*);//移动指针法找大王void Initialize(int,int*);//初始化数组整形和指针型int main(){int m,n,*ptr;printf("输入猴子数与出局时报的数\n");scanf("%d %d",&n,&m);while(n<m){printf("输入数据有误,请重新输入!\n"); printf("输入猴子数与出局时报的数\n"); scanf("%d %d",&n,&m);}ptr=(int *)calloc(n,sizeof(int));Initialize(n,ptr);FindKing_pointer(m,n,ptr);free(ptr);return 0;if(ptr2==ptr+n)ptr2=ptr;/*指针所指元素不为0时计数器加1.*/if(*ptr2!=0)i++;/*计数器数到m时将指针所指元素设为0*/ if(i==m){*ptr2=i=0;count--; //用于终止循环}}/*最后不为0的元素的值即为大王的编号*/for(ptr2=ptr;;ptr2++){if(*ptr2!=0){printf("第%d个猴子是大王\n",*ptr2);break;}}}/*思想是猴子围坐一圈,有N个猴子,开始数数,数到第M个猴子,该猴子就出列,然后再从该猴子的下一个猴子开始数到第M个猴子,直到只剩下一个猴子时。
猴子选大王课程设计说明书

数学与计算机学院课程设计说明书课程名称: 数据结构课程设计课程代码: 6014389题目: 猴子选大王年级/专业/班: 2010级软件工程2班学生姓名: 蒋童学号:开始时间: 2011 年11 月9 日完成时间: 2011 年12 月30 日课程设计成绩:指导教师签名:年月日数据结构课程设计任务书学院名称:数学与计算机学院课程代码:__ 6014389______ 专业:软件工程年级:2班一、设计题目猴子选大王二、主要内容一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
三、具体要求及应提交的材料要求:使用数组和循环链表等两种以上的存储方式来做输入数据:输入m,n m,n 为整数,n<m输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能用C/C++语言编程实现上述内容,对每个问题写出一个算法实现,并按数学与计算机学院对课程设计说明书规范化要求,写出课程设计说明书,并提交下列材料:1)课程设计说明书打印稿一份2)课程设计说明书电子稿一份;3)源程序电子文档一份。
四、主要技术路线提示可采用数组、链表数据结构实现。
在此基础上用C/C++实现其操作。
五、进度安排按教学计划规定,数据结构课程设计为2周,其进度及时间大致分配如下:六、推荐参考资料[1] 严蔚敏,吴伟民.数据结构.清华大学出版社出版。
[2] 严蔚敏,吴伟民. 数据结构题集(C语言版) .清华大学出版社.2003年5月。
[3] 唐策善,李龙澎.数据结构(作C语言描述) .高等教育出版社.2001年9月[4] 朱战立.数据结构(C++语言描述)(第二版本).高等出版社出版.2004年4月[5] 胡学钢.数据结构(C语言版) .高等教育出版社.2004年8月[6] 徐孝凯等著.数据结构(C语言描述).清华大学出版社.2004指导教师签名日期年月日系主任审核日期年月日目录摘要................................. 错误!未定义书签。
数据结构上机实验程序--猴子选大王

#include<stdio.h>#include<stdlib.h>struct Monkeyking{int data;struct Monkeyking *next;};void main(){struct Monkeyking *head, *s, *q, *t,*p,*h;int n, k, count=0, i,j;printf("输入猴子总数:");scanf("%d",&k);printf("\n");printf("输入报号起始猴子编号:");scanf("%d",&j);printf("\n");printf("输入报号间隔数:");scanf("%d",&n);printf("\n");for(i=0; i<k; i++){s=(struct Monkeyking *)malloc(sizeof(struct Monkeyking)); s->data=i+1;s->next=NULL;if(i==0){head=s;q=head;}else{q->next=s;q=q->next;}}//建立一个单链表q->next=head;//将单链表组成环状printf("输出猴子原始的编号:");q=head;while(q->next!=head){printf("%d ",q->data);q=q->next;}//依次输出节点的值printf("%d ",q->data);printf("\n");printf("\n");q=head;for (i=0;i<j;i++){p=q;q=q->next;}q=p;printf("输出被淘汰的猴子编号:");if (n==1){for (i=1;i<=k;i++){t=q;q=q->next;t->next=h;h=t;}for (i=1;i<=k;i++){printf("%d ",h->data);//倒序输出淘汰猴子的编号,第一个编号为大王h=h->next;}printf("\n");}else{do{count++;if(count==n-1){t=q->next;q->next=t->next;t->next=h;h=t;count=0;}q=q->next;}while(q->next!=q);q->next=h;h=q;}for(i=1;i<=k;i++){printf("%d ",h->data);//倒序输出淘汰猴子的编号,第一个编号为大王h=h->next;}}。
数据结构课程设计(附代码)-数据结构设计

上海应用技术学院课程设计报告课程名称《数据结构课程设计》设计题目猴子选大王;建立二叉树;各种排序;有序表的合并;成绩管理系统;院系计算机科学与信息工程专业计算机科学与技术班级姓名学号指导教师日期一.目的与要求1. 巩固和加深对常见数据结构的理解和掌握2. 掌握基于数据结构进行算法设计的基本方法3. 掌握用高级语言实现算法的基本技能4. 掌握书写程序设计说明文档的能力5. 提高运用数据结构知识及高级语言解决非数值实际问题的能力表。
3、输出功能:void print(LinkList *head);通过一个while的循环控制语句,在指针p!=NULL时,完成全部学生记录的显示。
知道不满足循环语句,程序再次回到菜单选择功能界面。
4、删除功能:LinkList *Delete(LinkList *head);按想要删除的学生的学号首先进行查找,通过指针所指向结点的下移来完成,如果找到该记录,则完成前后结点的连接,同时对以查找到的结点进行空间的释放,最后完成对某个学生记录进行删除,并重新存储。
5、插入功能:LinkList *Insert(LinkList *head);输入你想插入的位置,通过指针所指向结点的下移,找到该位置,将该新的学生记录插入到该结点,并对该结点后面的指针下移。
链表长度加一,重新存储。
(5) 程序的输入与输出描述输入:调用LinkList *create()函数,输入学生的姓名、学号、三门功课的成绩;输出:调用void print(LinkList *head)函数,输出学生的记录。
(6) 程序测试主菜单:成绩管理系统的主界面:学生成绩记录的输入:输出学生成绩记录:学生成绩记录的删除(删除学号是1101的学生记录)插入新的学生成绩记录(插入学号为1103的学生记录)(7) 尚未解决的问题或改进方向尚未解决的问题:该成绩管理系统还存在不少缺陷,而且它提供的功能也是有限的,只能实现学生成绩的输入、输出、删除、插入。
数据结构课程设计报告格式

《数据结构》课程设计报告题目猴子选大王学生姓名学号专业班级指导老师设计日期 2009年12月19日指导老师评阅意见:一、问题定义1、课程设计目的:数据结构课程设计是学习数据结构课程的一个重要环节。
能巩固和加深课堂教学内容,提高学生实际工作能力,培养科学作风,为学习后续课程和今后的系统开发奠定基础。
通过课程设计,使学生熟练掌握数据结构课程中所学的理论知识,并实际应用,通过综合运用数据结构的基本知识来解决实际问题,加强学生分析和解决问题的能力。
2、课程设计的要求:本次课程设计要求学生正确理解课题,考虑问题要细致,全面,解决问题的方法要科学合理,切合实际。
并能上机实现。
3、课程设计的意义:1、有利于基础知识的理解。
学生对计算机运行的机理等知识内容的理解比较肤浅。
如果接触了程度设计,就能真正理解,从而进一步打破计算机的神秘感。
2、有利于逻辑思维的锻炼。
程序设计是公认的、最能直接有效地训练学生的创新思维,培养分析问题、解决问题能力的学科之一。
即使一个简单的程序,从任务分析、确定算法、界面布局、编写代码到调试运行,整个过程学生都需要有条理地构思,这中间有猜测设想、判断推理的抽象思维训练,也有分析问题、解决问题、预测目标等能力的培养。
3、有利于治学态度的培养。
程序设计中,语句的语法和常量变量的定义都有严格的要求,有时输了一个中文标点、打错了一个字母,编译就不通过,程序无法正常运行。
因此,程序设计初学阶段,学生经常会犯这样的错误,可能要通过几次乃至十多次的反复修改、调试,才能成功,但这种现象会随着学习的深入而慢慢改观。
这当中就有一个严谨治学、一丝不苟的科学精神的培养,又有一个不怕失败、百折不挠品格的锻炼猴子选大王任务:一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.需求分析
问题定义:一堆猴子都有编号,编号是1,2,3…n,这群猴子(n个)按照1-n的顺序围坐一圈,从第1个开始数,每数到第m个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
m,n键盘输入,且m<n,输出为大王的猴子的号数。
问题分析:根据任务描述可知,编号是1,2,3…n的一群猴子按照1-n的顺序围坐一圈,因此可以用指针指向数组的方法给数组赋值,输入n值和m值,为保证m<n,用一个while( )语句实现,如果输错,报错,再输入。
用for循环实现猴子编号。
从1开始数到m的猴子出列,即用指针移动查找法将计数器数到m的指针指向的内容变为0,用for循环,直到只有一个元素不为0时,最后不为0的元素的值即为大王。
实现这个程序功能需3个模块,一个模块用数组指针实现猴子编号,一个模块用指针移动查找法实现猴子出局,最后主模块将前两个模块要用到的函数,数组定义。
具体步骤如下:
第一步建立数组,填入猴子编号及猴子出局时报的数
第二步从第一个猴子报数
第三步数到m让指针指向元素变为0
第四步继续报数,重复第三步
2.概要设计(流程图)
break
3.详细设计
#include<stdio.h>
#include<stdlib.h> //使用calloc()函数
void FindKing_pointer(int,int,int*);//移动指针法找大王void Initialize(int,int*);//初始化数组整形和指针型int main()
{
int m,n,*ptr;
printf("输入猴子数与出局时报的数\n");
scanf("%d %d",&n,&m);
while(n<m)
{
printf("输入数据有误,请重新输入!\n");
printf("输入猴子数与出局时报的数\n");
scanf("%d %d",&n,&m);
}
ptr=(int *)calloc(n,sizeof(int));
Initialize(n,ptr);
FindKing_pointer(m,n,ptr);
free(ptr);
return 0;
}
/*
在数组中依次填入1,2,3,4,…
*/
void Initialize(int n,int *ptr)
{
int i;
for(i=0;i<n;i++)
ptr[i]=i+1;
}
/*
循环一次指针向后移一位,所指元素不为0时计数器加1.
移动指针,当计数器数到m时将指针所指元素设为0.
*/
void FindKing_pointer(int m,int n,int *ptr)
{
int i,count,*ptr2;
count=n-1; //count=0时终止循环就是只剩一个猴子时
ptr2=ptr; // 移动ptr2进行查找开始时ptr为多少
//calloc()为指针类型的元素分配内存时,元素被初始化为空指针for(i=0;count!=0;ptr2++)
{
if(ptr2==ptr+n)
ptr2=ptr;
/*指针所指元素不为0时计数器加1.*/
if(*ptr2!=0)
i++;
/*计数器数到m时将指针所指元素设为0*/
if(i==m)
{
*ptr2=i=0;
count--; //用于终止循环
}
}
/*最后不为0的元素的值即为大王的编号*/
for(ptr2=ptr;;ptr2++)
{
if(*ptr2!=0)
{
printf("第%d个猴子是大王\n",*ptr2);
break;
}
}
}
/*思想是猴子围坐一圈,有N个猴子,开始数数,数到第M个猴子,该猴子就出列,
然后再从该猴子的下一个猴子开始数到第M个猴子,直到只剩下一个猴子时。
该猴子就是所要选得大王*/
4.结果分析
5.设计总结
在课程设计中,首先要看清问题,将问题要求理解透彻,在构思要如何实现,要用到哪些函数,要用什么算法,在课程构思中选算法是一个很重要的概念,只有确定用这么算法后才能接下来的工作,将流程图画在纸上,再依次编写代码,在程序设计中,编写代码只是一个方面,调试才是关键。
它是一个相当繁琐的过程,有许多新的问题需要被解决,但同时它也是一个比较重要的过程,因为在程序调试过程中,你会学到很多新的东西,从而增加你编程的经验。
通过本次实习,温固了数据结构的相关知识,加深对课内所学的有关数据的逻辑结构和存储表示、数据结构的选择和应用、算法的设计和时空效率分析等课程基本内容的理解,进一步熟悉了VC++编程环境,巩固并提高了分析问题、解决实际问题的能力。