数据结构--猴子选大王
猴博士数据结构与算法
猴博士数据结构与算法
猴博士数据结构与算法是一本经典的计算机科学教材,主要介绍了数据结构和算法的基本概念、原理和应用。
该书由美国计算机科学家托马斯·H·科尔曼(Thomas H. Cormen)等人共同编写,首次出版于1990年,目前已经成为世界各大高校计算机科学专业的必读教材之一。
猴博士数据结构与算法通过简明易懂的语言和丰富的示例,系统地介绍了各种常见的数据结构和算法,包括数组、链表、栈、队列、树、图、排序、查找等。
该书不仅详细解释了每种数据结构和算法的特点、操作和应用场景,还给出了具体的实现代码和运行时间分析,使读者能够深入理解并灵活应用这些概念和技巧。
猴博士数据结构与算法的特点之一是强调算法的设计原则和分析方法。
书中介绍了常见的算法设计技巧,如贪心算法、动态规划算法和分治算法,并给出了实际问题的解决思路和算法设计过程。
此外,书中还介绍了算法的复杂度分析方法,包括时间复杂度和空间复杂度,并给出了一些常见算法的分析结果,帮助读者评估算法的效率和性能。
猴博士数据结构与算法不仅适用于计算机科学专业的学生和教师,也适用于从事软件开发和算法研究的工程师和科研人员。
通过学习该教材,读者可以全面了解数据结构和算法的基本原理和应用,提高编程和问题解决的能力,并为进一步学习和研究提供了良好的基础。
约瑟夫问题
cout<<endl;
return 0;
}
约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m
,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,
这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
int main()
{
int i,j,nx[10000] = {0},n[10000] = {0},m[10000] = {1},counter[2] = {0};//数组要足够大才能不停止运行
{ j = j % nx[i]; //求余实现循环从0-n移动或用if判断实现循环
if(n[j] == 0)
{ counter[0]++; //计数器记录具有某一特点的数的次数
if(counter[0] % m[i] == 0)n[j] = 1,counter[1]+& = 0;j < nx[i];j++)
if(!n[j])cout<<j + 1<<endl;
for(j = 0;j < 10000;j++)n[j] = 0;for(j = 0;j < 2;j++)counter[j] = 0; //初始化需要重新使用的变量
for(i = 1;m[i - 1] != 0;i++) //利用m[]只有最后的值为0判定,不使用m[0]并赋值为1,其余默认为0
cin>>nx[i]>>m[i];
for(i = 1;m[i] != 0;i++)
数据结构课程设计报告
*****数据结构课程设计题目: 赫夫曼树的建立运动会分数统计订票系统猴子选大王图的建立与输出姓名:***学号 ****专业:计算机科学与技术指导教师:****2006年9月20日目录一:绪言 (3)1.1课题设计背景 (3)1.2课题研究的目的和意义…………………………….3.1.3课题研究的内容 (4)二:主菜单设计 (4)2.1主菜单 (4)2.2主菜单源代码 (4)2.3主菜单流程图 (5)三:具体程序设计 (6)3.1赫夫曼树的建立 (6)3.2运动会设计 (8)3.3订票系统 (12)3.4猴子选大王 (15)3.5图的建立及输出 (16)四:总结与展望 (19)五:参考文献 (19).1.绪言1.1 课题背景《数据结构》作为一门独立的课程最早是美国的一些大学开设的,1968年美国唐·欧·克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。
从60年代末到70年代初,出现了大型程序,软件也相对独立,结构程序设计成为程序设计方法学的主要内容,人们就越来越重视数据结构,认为程序设计的实质是对确定的问题选择一种好的结构,加上设计一种好的算法。
从70年代中期到80年代初,各种版本的数据结构著作就相继出现。
目前在我国,《数据结构》也已经不仅仅是计算机专业的教学计划中的核心课程之一,而且是其它非计算机专业的主要选修课程之一。
《数据结构》在计算机科学中是一门综合性的专业基础课。
数据结构的研究不仅涉及到计算机硬件(特别是编码理论、存储装置和存取方法等)的研究范围,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。
在研究信息检索时也必须考虑如何组织数据,以便查找和存取数据元素更为方便。
因此,可以认为数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程,在计算机科学中,数据结构不仅是一般程序设计(特别是非数值计算的程序设计)的基础,而且是设计和实现编译程序、操作系统、数据系统及其它系统程序和大型应用程序的重要基础。
蓝桥杯-猴子选大王(约瑟夫问题)
蓝桥杯-猴⼦选⼤王(约瑟夫问题)标题:猴⼦选⼤王⼀群猴⼦要选新猴王。
新猴王的选择⽅法是:让N只候选猴⼦围成⼀圈,从某位置起顺序编号为1~N号。
从第1号开始报数,每轮从1报到3,凡报到3的猴⼦即退出圈⼦,接着⼜从紧邻的下⼀只猴⼦开始同样的报数。
如此不断循环,最后剩下的⼀只猴⼦就选为猴王。
请问是原来第⼏号猴⼦当选猴王?输⼊格式:输⼊在⼀⾏中给⼀个正整数N(≤1000)。
输出格式:在⼀⾏中输出当选猴王的编号。
输⼊样例:11输出样例:7思路⼀:⽤数组模拟⼀个环,存储第下标+1位猴⼦是否退出(因为下标从0开始),数组初始化为0,每次轮到数3的猴⼦就将他的下标置为-1,最后⼀个下标不为-1的猴⼦就是选中的王。
1 #include<bits/stdc++.h>2using namespace std;34const int N = 1000; //共有N个猴⼦56int a[N]; //⽤数组和%操作模拟圈78int index = 0; //下标index9int i = 1; //⽤来对3计数10int counter; //记录每次剩下的猴⼦个数1112int main()13 {14int num; //num是猴⼦的数量15 cin >> num;16 counter = num;1718while(counter > 1)19 {20if(a[index] != -1) //当下标为index的猴⼦还在圈内时21 {22if(i == 3)23 {24 a[index] = -1; //将数到3的猴⼦退出圈⼦,将下标置为-125 counter--; //剩下的猴⼦总个数-126 }2728 i++;2930if(i > 3) //i=4时候,i要回到131 {32 i = i % 3;33 }34 }3536 index++;3738if(index >= num) //当下标达到了猴⼦总数时,要回到开头39 {40 index = index % num;41 }4243 }4445for(int i = 0; i < num; i++)46 {47if(a[i] != -1)48 {49 cout << i + 1; //数组下标是从0开始的,要+150 }51 }5253return0;54 }思路2:使⽤递归思想1 #include<bits/stdc++.h>2using namespace std;34int fun(int n)5 {6if(1 == n)7 {8return0;9 }1011return (fun(n - 1) + 3) % n;12 }1314int main()15 {16int n;17 cin >> n;18 cout << fun(n) + 1;19return0;20 }。
用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《数据结构》课程设计——猴子选大王一、引言数据结构是一门非常重要的基础学科,但是实验内容大都不能很好的和实际应用结合起来。
数据结构课程设计(附代码)-数据结构设计
上海应用技术学院课程设计报告课程名称《数据结构课程设计》设计题目猴子选大王;建立二叉树;各种排序;有序表的合并;成绩管理系统;院系计算机科学与信息工程专业计算机科学与技术班级姓名学号指导教师日期一.目的与要求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) 尚未解决的问题或改进方向尚未解决的问题:该成绩管理系统还存在不少缺陷,而且它提供的功能也是有限的,只能实现学生成绩的输入、输出、删除、插入。
讲题比赛讲稿
讲题比赛讲稿一、问题的提出我今天要讲的是第12题。
题目为:有2015个同学站成一个圆圈,按顺时针方向编号:1—2015。
现在从1号开始,按“0、1、0、1、0、1……”的方式报数,报到1的同学立即离开,不再参与报数。
到最后只剩一个同学时报数停止。
请问最后留下的这个同学的编号是多少?二、问题分析这道题其实源于一道很有意思约瑟夫问题。
约瑟夫问题,有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。
据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数3该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。
然而Josephus 和他的朋友并不想遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
回到我今天要讲的题目。
题目中将约瑟夫问题中的报数方式置换成“0、1、0、1……”循环报数,而且将结果也变成了“最后留下的同学的编号是多少?”虽然题目条件有了变化,但是仍然属于“约瑟夫问题”,可以用该类方法进行分析和解决。
三、问题的研究拿到题目以后,我们对此题的研究经历了三个阶段。
第一阶段:自我摸索阶段拿到题后,我简直有点懵。
说实话,我从来没有遇到过这样的题。
不过我想,通过网络搜索应该会有些眉目。
可是当我将原题输入百度以后,却找不到答案。
我只能对着题目,自己动手研究了。
首先我想到数的奇偶问题。
当总人数为奇数时,第一轮留下的是所有奇数编号;而到第二轮……情况比较复杂了。
而当总人数为偶数时,那么第一轮排除的是偶数编号;第二轮排除的就是4n的编号;第三轮时,剩下的编号可能是奇数个,怎么办呢?再次受挫的我只能像个小学生一样从最原始的方法开始模拟游戏过程。
我从3人开始研究3人留下的是3号;4人留下的是1号……当研究到8人留下是1号时,我恍如黑暗中窥见无限光明。
猴子算法
一、猴子选大王:(1)M只猴子要选大王,选举办法如下:所有猴子按1-M编号围坐一圈,从1号开始按顺序1,2,,,K报数,凡报到K的猴子退出到圈外,如此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王。
M和K由输入文件提供,要求在输出文件中打印出最后剩下的猴子的编号。
数据规模(M<=1000,K<=10)【输入文件】输入文件monkey.in 的第1 行,为两个正整数,用一个空格隔开:M K【输出文件】输出文件monkey.out 只有一个正整数,输出最后一个猴子的编号【输入样例】7 3【输出样例】4这就是顶顶有名的约瑟夫问题。
这是一个据说是由古罗马著名史学家Josephus提出的问题演变而来的。
称之为约瑟夫问题。
很多资料上对这一问题解释得过于繁杂,实现起来不好理解。
在这里介绍一下本人的一些想法以供大家参考。
这个题目其实就是一种编程的经验问题。
我们可以假设猴子就位的状态用1表示,把猴子离开的状态用0表示。
那么我们就可以用一个a[M]的数组来存放M个猴子是否就位的状态。
我们可以一边报数一边遍历该数组,每遇到第K个1时,就把当前位置的1变为0,表示当前位置的猴子已经出局了。
一直循环遍历到我们的状态数组只有一个1的时候,这个存放1的数组下标再加上1(因为数组下标是由0开始的,所以要加1)即为选出的大王的编号。
想法很简单,现在关键的问题是如何解决当报数到第M个猴子的时候如何使得下一个报数重新回到第1个猴子处,也就是如何使用一维数组来解决环型问题的求解技巧。
大家想一下当我们的猴子围成圈坐的时候,问题其实由简单的一维数组变成了首尾相接的环型数组,也就是我们数据结构中的环型队列。
假设p为当前数组某一元素的下标,对于一维数组来说,我们只要p++就可以移动到下一个元素的位置上。
那么当p=M时,如果我们直接使用p++的话,p的值就超出了a[M]数组的最大长度,我们想要的是p++之后等于0。
那么如何实现呢?解决环型数组循环遍历元素的方法:对于环型数组移动下标时,我们如果每次在p++之后再加上p=p%M的话就能解决先前遇到的越界的问题。
(完整版)数据结构经典题目及c语言代码
《数据结构》课程设计题目(程序实现采用C语言)题目1:猴子选王(学时:3)一堆猴子都有编号,编号是1,2,3 .。
.m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王.要求:m及n要求从键盘输入,存储方式采用向量及链表两种方式实现该问题求解.//链表#include 〈stdio.h〉#include 〈stdlib.h>// 链表节点typedef struct _RingNode{int pos;struct _RingNode *next;}RingNode, *RingNodePtr;// 创建约瑟夫环,pHead:链表头指针,count:链表元素个数void CreateRing(RingNodePtr pHead, int count){RingNodePtr pCurr = NULL, pPrev = NULL;int i = 1;pPrev = pHead;while(——count 〉 0){pCurr = (RingNodePtr)malloc(sizeof(RingNode));i++;pCurr—〉pos = i;pPrev-〉next = pCurr;pPrev = pCurr;}pCurr-〉next = pHead; // 构成环状链表}void KickFromRing(RingNodePtr pHead, int n){RingNodePtr pCurr, pPrev;int i = 1; // 计数pCurr = pPrev = pHead;while(pCurr != NULL){if (i == n){// 踢出环printf("\n%d", pCurr->pos); // 显示出圈循序pPrev—>next = pCurr->next;free(pCurr);pCurr = pPrev—>next;i = 1;}pPrev = pCurr;pCurr = pCurr—〉next;if (pPrev == pCurr){// 最后一个printf("\nKing is %d", pCurr—〉pos); // 显示出圈循序 free(pCurr);break;}i++;}}int main(){int n = 0, m = 0;RingNodePtr pHead = NULL;printf("M(person count)= ”);scanf(”%d”, &m);printf("N(out number) = ");scanf(”%d”, &n);if(m 〈= 0 || n <= 0){printf("Input Error\n”);return 0;}// 建立链表pHead = (RingNodePtr)malloc(sizeof(RingNode)); pHead->pos = 1;pHead->next = NULL;CreateRing(pHead, m);// 开始出圈printf("\nKick Order: ");KickFromRing(pHead, n);printf(”\n");system(”pause”);return 0;}//数组做:#include<stdio。
C++猴子选大王 choose monkey king
}
猴子状态初始化为1表示可能被选上为0表明没希望了
#include <iostream>
usingnamespacestd;
classmonkey
{
private:intnum,del;
public:
monkey(intn,intd):num(n),del(d){}//构造函数
intchoose(intnum,intdel)
}
delete[]a;
}
};
intmain()
{
intnum,del;
cout<<"请输入猴子总数M和淘汰号N:";
cin>>num>>del;
monkeymonkeygroup(num,del);
cout<<"第"<<monkeygroup.choose(num,del)+1<<"个猴子为大王!"<<endl;
{
countOne=0;
for(i=0;i<num;i++)
{
sum+=a[i];
if(sum==del)
sum=a[i]=0; //淘汰倒霉猴子;
countOne+=a[i];
}
}
for(i=0;i<num;i++)
if(a[i]!=0){
delete[]a;
return i; //找到幸运猴子编号(从0开始的);
{
inti;
int*a;
a = newint[num];
for(i[i]=1; //猴子状态初始化,为1表示可能被选上,为0表明没希望了;
一维、二维数组及应用程序设计习题
一维、二维数组及应用程序设计习题1、 【字符统计问题】题目描述:试统计用户键盘输入的一串英文字符中每种英文字符个数。
题目要求:⑴相同英文字符的大小写形式视为同一种统计对象;⑵遇到任意非英文字符时统计终止;⑶输出数据时每行仅输出10个数据。
输入数据:abcdeABCDElKlhmn2输出数据:A(2) B(2) C(2) D(2) E(2) F(0) G(0) H(1) I(0) J(0)K(1) L(0) M(1) N(1) O(0) P(0) Q(0) R(0) S(0) T(0) U(0) V(0) W(0) X(0) Y(0) Z(0)2、 【约瑟夫(猴子选大王)问题】题目描述:有M(1000以内)个猴子围成一圈,每个有一个编号,编号从1到M 。
打算从中选出一个大王。
经过协商,决定选大王的规则如下:从第一个开始,每隔N(任意正整数)个,数到的猴子出圈,最后剩下来的就是大王。
题目要求:从键盘输入M 、N(均为正整数),试编程计算哪一个编号的猴子将成为大王。
输入数据:15 3 输出数据:5 200 55 93 3、 【行列互换问题】题目描述:试编程将一个二维数组行和列元素互换,存到另一个二维数组中。
例如:A =B = 4、 【矩阵初始化问题】题目描述:矩阵是线性代数中的重要概念及研究工具,在计算机算法设计中,我们常常选用二维数组之类的数据结构来描述矩阵。
下图是两个4×4的下三角方阵(即行列相等)初始化后的状态,请编程输出任意方阵(用户从键盘输入方阵的行列值)的这类初始化状态。
A 4×4 =B 4×4 =5、 【杨辉三角问题】题目描述:杨辉三角(出自其1261年所著的《详解九章算法》,也叫贾宪三角或帕斯卡三角),它可以简单解释为由两个未知数和的幂次方运算后按某个未知数的降幂排列(或另一未知数的升幂排列)后的系数表(二项式定理)。
比如(x+y)0=1,系数为(1);(x+y)1=x+y ,系数为(1、1);(x+y)2=x 2+2xy+y 2,系数为(1、2、1);(x+y)3=x 3+3x 2y+3xy 2+y 3,系数为(1、3、3、1)以及四次、五次、……等运算后所得的系数表,如下图(仅举5行):题目要求:⑴利用一维数组试求用户给定行数的杨辉三角形;⑵利用二维数组试求用户给定行数的杨辉三角形(请尽力严格按照上图要求的输出格式)。
C++实验习题
实验注意事项
每次实验下课前,将实验文档以附件形式发送邮箱: jiaozuoye_email@ 注意邮件主题与文件名相同,保持正确,否则等同未交 实验报告格式:见实验报告样例
第六次实验要求: (4 月 21 日)
提交实验报告内容包括: 1、 实验 6:练习题三 编程实现对键盘输入的英文字符进行加密。加密方法为,当内容为英文字母时,使用 26 个字母中该字母后的第三个字母代替该字母,即'A'替换为'D','X'替换为'A'等等,若为其 它字符时不变。 2、 实验 6:自测练习一 编写函数实现删除字符串中字符'T'的功能,要求使用内联函数。
#####
# # # # # # # #
#####
#####
图2-1用“#”号组成的数字“8”
5、 实验 2:自测练习四 编写一个程序,计算两个整数 m、n 的和、差、积、商。(参考《实验指导》:实验 3, 练习题二)
第三次实验要求: (3 月 24 日)
提交实验报告内容包括: 1、 实验 3:练习题一: 已知三条边 a、b、c,求三角形面积。计算三角形面积的海伦公式:
A =
1 4
2 5
3 6
B =
3、 实验 5:自测练习一
试统计键盘输入的一串英文字符中每种英文字符个数。 要求:⑴相同英文字符的大小写形式视为同一种统计对象; ⑵遇到任意非英文字符时统计终止; ⑶按每行 10 个数据的格式输出数据。 4、 实验 5:自测练习三 A 和 B 是两个 4×4 的下三角方阵(即行列相等)初始化后的状态,请编程输出任意方 阵(键盘输入方阵的行列值)的这类初始化状态。 1 2 4 7 0 3 5 8 0 0 6 9 0 0 0 10 0 0 0 1 0 0 2 3 0 4 5 6 7 8 9 10
猿猴积分表
猿猴积分表
(原创实用版)
目录
1.猿猴积分表的定义和作用
2.猿猴积分表的构成
3.猿猴积分表的应用
4.猿猴积分表的优缺点
正文
一、猿猴积分表的定义和作用
猿猴积分表,又称为猴子爬树问题,是一个经典的概率论问题。
它是由一位美国统计学家爱德华·卡西尼提出的,旨在说明一种随机过程的性质。
猿猴积分表主要用于描述在一棵树上,猴子们随机跳跃的过程中,某一时刻所有猴子都位于奇数高度树枝的概率。
这个问题在概率论、统计学和随机过程等领域具有广泛的应用。
二、猿猴积分表的构成
猿猴积分表由一个无限大的完全二叉树构成,每个节点表示一个树枝,每个树枝上有两个子节点,分别表示左子树和右子树。
在每个时刻,猴子们可以从当前所在的树枝跳跃到其左子树或右子树,每次跳跃都是等可能的。
三、猿猴积分表的应用
猿猴积分表在概率论和统计学中有广泛的应用,例如:
1.计算在一棵树上,猴子们随机跳跃的过程中,某一时刻所有猴子都位于奇数高度树枝的概率。
2.计算在 n 次独立重复试验中,事件 A 恰好发生 k 次的概率。
3.计算一个随机变量在区间 [0,1] 上的概率密度函数。
四、猿猴积分表的优缺点
1.优点:猿猴积分表作为一种概率论工具,可以帮助我们解决一些复杂的概率问题,具有较强的理论价值和实用价值。
2.缺点:猿猴积分表的计算过程较为复杂,需要一定的数学基础和技巧。
数据结构课程设计
数据结构课程设计----个人设计报告专业:班级:姓名:学号:指导教师:日期: 2016年X月XX日至XX日目录1 课程设计目的 (3)2 课程设计内容和要求 (3)3 任务完成情况 (3)4 设计报告 (4)4.1顺序表应用 (4)4.1.1 设计目的 (4)4.1.2 设计内容及要求 (4)4.1.3 需求分析 (5)4.1.4 概要设计 (7)4.1.5 详细代码 (8)4.1.6 使用说明 (8)4.1.7 测试结果与分析 (8)4.1.8 参考文献 (10)4.2链表应用 (10)4.2.1 设计目的 (10)4.2.2 设计内容及要求 (11)4.2.3 需求分析 (12)4.2.4 概要设计 (14)4.2.5 详细代码 (16)4.2.6 使用说明 (16)4.2.7 测试结果与分析 (16)4.2.8 参考文献 (18)4.3树和二叉树 (19)4.3.1 设计目的 (19)4.3.2 设计内容及要求 (19)4.3.3 需求分析 (19)4.3.4 概要设计 (20)4.3.5 详细代码 (21)4.3.6 使用说明 (21)4.3.7 测试结果与分析 (22)4.3.8 参考文献 (22)5 体会与感想 (23)附录: (24)设计一(顺序表应用)的代码 (24)设计二(链表的应用)的代码 (35)设计三(二叉树应用)的代码 (47)1 课程设计目的1、学习获取知识的方法;2、提高发现问题、分析问题和解决实际问题的能力;3、加强创新意识和创新精神;4、加强团队的分工与合作;5、掌握面向实际背景思考问题的方法。
2 课程设计内容和要求内容:(仅供参考,请根据实际完成情况填写)第一章前言第二章顺序表与链表的应用第三章树结构的应用第四章图结构的应用第五章赫夫曼编码的应用要求:完成第2章、第3章中每章的比作必做任务。
在完成个人任务的基础上,完成第4章第5章的小组任务。
每人必须在完成个人任务的基础上提交个人任务的设计报告,内容包括:任务名称、目的、具体内容、需求分析、概要设计、主要代码分析、测试结果、收获与体会。
猴子选大王(C语言实现)
题目:猴子选王一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
要求:m及n要求从键盘输入,存储方式采用向量及链表两种方式实现该问题求解。
#include <stdio.h>struct monkey{int num;monkey *next;};monkey *head,*tail;void creat(int n){int i;monkey *p,*q;p=new monkey; //为p分配内存空间p->num=1; //初始化p结点num域为1p->next=NULL; //初始化p结点next域为空head=p; //链表头指针head赋值为pq=p;for(i=2;i<=n;i=i+1) //循环存入猴子{p=new monkey; //为p配内存空间p->num=i; //初始化p结点num域为i,表示猴子号q->next=p; //将p点加到链表尾部q=p; //让指向链表尾部结点p->next=NULL; //链表尾部指向空}tail=q; //链表尾tail->next=head; //链表尾部指向链表头,形成循环链表}void select(int n){int x=0;monkey *p,*q;q=tail; //q赋值给tail,指向循环链表尾部do //直到型循环,用于循环删除指定间隔的结点{p=q->next; //p赋值给相邻的下一个结点x=x+1; //x加1if(x%n==0) //x是否整除m{printf("%d号猴子淘汰\n",p->num);q->next=p->next; //删除此结点delete p; //释放空间p=NULL;}else q=p; //q指向相邻的下一个结点p }while(q!=q->next); //剩余结点数不为1,则继续循环head=q; //head指向结点q,q为链表中剩余的一个结点}void main(){int n,m;head=NULL; //初始化head为空printf("请输入猴子的个数\n");scanf("%d",&m);printf("请输入n\n");scanf("%d",&n);creat(m); //调用函数creat建立循环链表select(n); //调用函数select,找出剩下的猴子printf("猴王是%d号\n",head->num); //输出猴王delete head; //删除循环中最后一个结点}#include<stdio.h>int main(){int a[1000];//定义一个较大的数组存储数据int m,n,x,count,i;//定义猴子数m、输入n、所需变量x、cout、iprintf("请输入猴子个数:\n");//提示输入mscanf("%d",&m);printf("请输入n:\n");//提示输入nscanf("%d",&n);for(i=1;i<=m;i++) //令数组与猴子编号对应a[i]=i;count=m;//令cout等于猴子个数x=0;//令x初始值为零for(i=0;count>1;i++)// 执行循环,淘汰的猴子值为-1,直到只剩一只猴子,即为猴王{if(a[i%m+1]!=-1) {x++;}if(x==n&&a[i%m+1]!=-1){a[i%m+1]=-1;count--;x=0;printf("%d号猴子淘汰\n",i%m+1);} }for(i=1;i<=m;i++) //输出值不为-1的猴子,即猴王if(a[i]!=-1) printf("猴王是%d号\n",i);}。
软件技术基础课程作业
第一章算法复习思考题设n为正整数,给出下列各种算法关于n的时间复杂度和空间复杂度①void fun1(int n){ j=1 ; k=100 ;while(j<n){ k=k+1 ; j=j+2 ; }}②void fun2(int b[n] , n){ for i=0 to n-1{ k=i ;for j=i+1 to n-1if(b[k]>b[j]) k=j ;x=b[i] ;b[i]=b[k] ;b[k]=x ;}}③void fun3(int n){ j=0 ; s=0 ;while(s<n){ j=j+1 ;s=s+j ;}}④ void fun4(int b[n] , n){ for i=0 to n-1if(b[i]>n) a[n]=b[i]-n ;for i=0 to n-1b[i]=a[i] ;}第二章基本数据结构及运算复习思考题教材 P152~154 2.2、2.4、2.5、2.7、2.8、2.9、2.10、2.11、2.12、2.14、2.15、2.16、2.18、2.19、2.20、2.21、2.22、2.25第三章查找与排序技术复习思考题教材 P232~233 3.1、3.2、3.4、3.9、3.11补充习题:采用本书的算法描述语言,编写链式存储结构下的简单选择排序算法。
第四章数据库技术复习思考题教材 P323~324 5.2、5.4、5.6、5.7、5.11(加“并转换为关系模式”)、5.12 补充习题:用SQL语句命令在D盘“学生成绩”目录下,建立一个叫“学生”的数据库,其数据库结构如5.7表5.36所示,并用SQL语句实现5.7的操作。
实习一、线性表(顺序存储)及其应用(分四个实验)实习目的:掌握顺序表的建立及基本操作。
问题:建立一个顺序表,表中元素为学生,每个学生信息包含姓名和学号两部分,对该表实现:①输出、②插入、③删除、④查找功能。
实习二、栈的应用(选做)实习目的:掌握栈的特点及其基本运算,用栈解决一个应用问题。
数据结构课程设计报告
浙江师范大学数理与信息学院数据结构与算法分析报告班级:计算机051班曹玮(05190101)葛生生(05190107)董毅(04190107)指导老师:瞿有甜数理与信息工程学院《数据结构与算法设计》课程设计组号:无设计主题: 数据结构相关实现程序指导老师: 瞿有甜组长(学号): 曹玮(05190101)组员(学号):葛生生(05190107)、董毅(04190107)完成时间: 2007年1月26日需求分析:该程序实现菜单化、可视化、界面良好的输入和输出效果,各部分之间用模块连接。
第一部分模块实现输入功能,用户可根据提示按要求输入;在选择数字后,就进入了各个分模块中。
第一模块是约瑟夫环(Joseph)问题,这是一个模拟报数的问题,用户根据提示输入总的人数和要循环报的数,通过运行程序输出最后剩下的人的编号。
第二部分是有关二叉树的层序和先序遍历问题,输入结点数,建立二叉树,然后层序和先序输出结果。
第三部分是有关哈夫曼树的建立,输入要建立的哈夫曼树各结点的权值,按照最优生成树的建立方法建立哈夫曼树,最后输出最小全值。
第四部分是纸牌游戏,用户按要求输入和输出,这是一道典型的模拟题。
第五部分是有关图的广度优先遍历和深度优先遍历问题,输入各边的两端点和长度,建立存储结构,按两种方法输出。
第六部分是有关运动会分数统计的问题。
概要设计:第一部分:有关运动会分数统计的问题,涉及排序、搜索算法,用到结构体,链表的运用以及数组等数据结构,按要求实现即可。
第二部分:飞机定票系统,通过结构体,和两个单链表的运用完成飞机定票系统的各项功能设计,再在主函数里实现这些功能。
第三部分:约瑟夫环(Joseph)问题实际上是一个模拟问题,我们可以利用链表这一数据结构来求解,利用链表的删除结点来模拟人的退出,直到最后只剩下一个结点。
第四部分:猴子选大王的思想和约瑟夫环一样,不做分析。
第五部分:二叉树的层序和先序遍历问题,我们可以通过建立二叉树来实现这一要求,遍历可以用递归或非递归算法实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计说明书课题名称:猴子选大王学生学号:专业班级:计算机科学与技术学生姓名:学生成绩:指导教师:课题工作时间:至摘要本次程序程序设计的主要目的是解决变相的“约瑟夫环”问题---猴子选大王。
从而使复杂的选举工作变得明朗化。
全程序以数据结构(C语言)中的循环单链表为主要的设计支柱,利用了C语言简洁紧凑、灵活方便,语法限制不太严格,程序设计自由度大,生成目标代码质量高,程序执行效率高等方面的优点。
循环单链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针域不再是结束标记,而是指向整个链表的第一个结点,从而使链表形成一个环,基于这样的特点,它适合处理具有环形结构的数据元素序列。
在程序代码的编写中,运用了结构体类型(struct Node),动态申请内存空间函数malloc(),释放动态申请内存空间函数free()等类型,同时也具有多种循环、条件语句控制程序流向,如:嵌套if else语句,多重for循环语句,还有链表中结点指针(p->next),从而使程序完全结构化。
这样编写出的完整程序代码可以实现“猴子选大王”功能,输入猴子的数目m,循环数n,对m个猴子进行编号,通过嵌套if else语句,for语句,一遍一遍的循环,判断,删除,直到只剩下最后一个猴子,即大王。
这样就可以实现所需的基本功能了。
关键词:数据结构;循环;单链表AbstractThe main purpose of the program design process to solve the form of "Joseph Ring" in the election --- monkey king. So complex it became clear the election.All procedures for data structures (C language) in single-cycle design of the main pillars of the list, using the C language simple and compact, flexible and convenient, the syntax is not strictly limited, program design flexibility to produce high quality object code, program execution the advantages of higher efficiency. Single-loop single-linked list is another form of list, its structural features is the last node list pointer field is no longer the end of the tag, but point to the list the first node, so that form a ring list, based on Such features, it has a ring structure for the data processing sequence of elements.The preparation of the program code, the use of a structure type (struct Node), dynamic application memory function malloc (), the release of dynamic memory functions for free () and other types, but also with a variety of loop, conditional statements control program flow such as: nested if else statements, multiple for loop, there is a linked list node pointer (p-> next), to make the program fully structured.Write such a code can achieve a complete "Monkey King selected" feature, enter the number of monkeys m, cycles n, for number of monkeys on the m-by nested if else statements, for statements, loop over and over again, judge, removed until there are only a monkey, or king. This can achieve the required basic function.Keywords: data structures; circulation; single linked list第一章课程设计目的与要求1.1 课程设计目的1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风1.2 课程设计的实验环境课程设计使用C语言工具,C语言作为一种最基本简单的程序设计语言,C语言发展迅速,而且成为最受欢迎的语言之一,主要因为它具有强大的功能。
许多著名的系统软件,如DBASE Ⅳ都是由C 语言编写的。
用C 语言加上一些汇编语言子程序,就更能显示C 语言的优势了,像PC- DOS 、WORDSTAR等就是用这种方法编写的。
常用的C语言IDE(集成开发环境)有Microsoft Visual C++,Dev-C++,Code::Blocks,Borland C++,Watcom C++ ,Borland C++ Builder,GNU DJGPP C++ ,Lccwin32 C Compiler 3.1,High C,Turbo C,C-Free, win-tc 等等……对于一个初学者,Microsoft Visual C++是一个比较好的软件。
界面友好,功能强大,调试也很方便1.3 课程设计的要求1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。
前期准备工作完备与否直接影响到后序上机调试工作的效率。
在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。
2、.设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。
3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;4、每位同学需提交可独立运行的程序;5 、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算);6、课程设计实践作为培养学生动手能力的一种手段,单独考核。
第二章课程设计内容2.1 问题描述1、一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
2、基本要求:输入数据:输入m,n 为整数3、输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能。
2.2需求分析一群猴子(m个)按照编号的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
程序规定:(1)在程序中输入猴子数m、要报的数n(2),对猴子进行编号(3)利用循环链表,依次序删除猴子,找出最后一个猴子,即为大王,输出这只猴子的编号2.3具体设计和实现1.对每一个猴子进行编号r=q=(listnode *)malloc(sizeof(listnode));for(i=1;i<n;i++){p=(listnode*)malloc(sizeof(listnode));q->data=i;q->next=p;q=p;}p->data=n;p->next=r;r=p;2.每数到n便删除该猴子,当循环单链表只剩一个时,输出该编号for(i=1;i<=n-1;i++){for(j=1;j<=k-1;j++)p=p->next;q=p->next;p->next=q->next;if(i % 10==0)free(q);}printf("\n");r=p;return r;}void outring(int n,linklist r){int i;listnode *p;p=r;printf("猴子大王:");printf("%4d\n",p->data);3.主函数int main(){linklist r;int n,k;linklist initring(int n,linklist r);linklist deletedeath(int n,int k,linklist r); void outring(int n,linklist r);printf("请输入猴子总数m:");scanf("%d",&n);printf("请输入n:");scanf("%d",&k);r=initring(n,r);r=deletedeath(n,k,r);outring(n,r);}2.4运行结果分析输入猴子的数目以及n最后得到结果运行结果如下:得到了预期结果第三章课程设计总结次课程设计在整整一周的时间内得以完成,全部内容主要包括:目录,课题设计背景,详细设计,设计结果及分析等方面的内容,主要通过上网收集资料,查找参考书目,了解图书管理的设计背景,明确设计方向和内容,在此基础上形成了该课程设计的的基础框架。