猴子吃桃问题数据结构课程设计Word文件下载.docx
- 文档编号:19541279
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:16
- 大小:196.65KB
猴子吃桃问题数据结构课程设计Word文件下载.docx
《猴子吃桃问题数据结构课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《猴子吃桃问题数据结构课程设计Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
请输入要选择的方法:
"
scanf("
%d"
&
n);
getchar();
system("
cls"
//刷新屏幕
while(n<
1||n>
5)
{
printf("
***输入错误!
请重新输入***\n"
scanf("
}
returnn;
}
四、算法概要设计
//采用链数据结构(栈)实现上述求解
typedefstruct
int*top;
int*base;
}stack;
//初始化一个栈
stackInit(stack*s)
s->
base=(int*)malloc(STACK_SIZE*sizeof(int));
if(s->
base==NULL)
Initfailed!
\n"
exit(-1);
top=s->
base;
return*s;
//二叉树
创建一个大小为DAYS(由用给出)的二叉树,二叉树的左孩子节点存放当天的桃子数,右节点存放数字1,即为多吃的一个桃子。
typedefstructTNode
intdata;
structTNode*lchild;
structTNode*rchild;
}tree;
//创建一个二叉树
treeCreatTree(tree*T)//T为指针类型
{
intn=0,i=0;
tree*p,*pr,*T1;
T=(tree*)malloc(sizeof(TNode));
T1=T;
T->
data=1;
//根节点内的数据为第DAYS天的桃子数
for(i=1;
i<
DAYS;
i++)
p=(tree*)malloc(sizeof(TNode));
pr=(tree*)malloc(sizeof(TNode));
pr->
lchild=NULL;
rchild=NULL;
p->
data=0;
T1->
lchild=p;
rchild=pr;
T1=p;
T1->
return*T;
//返回T的地址
//算法框架图
继续执行
N
YN
Y
5、算法详细设计
#include<
stdio.h>
stdlib.h>
#include"
peach.h"
//函数声明
intDesk(intn);
voidpeach_1(void);
stackInit(stack*s);
voidPush(stack*s,intnum);
voidPop(stack*s,int&
num);
voidpeach_2(stack*s);
voidpeach_3(intn,inti);
treeCreatTree(tree*T);
voidcalculate(tree*T);
voidpeach_4(tree*T);
intmain()
intdata=0;
intn=1,i=1;
stacks;
treeT;
s=Init(&
s);
T=CreatTree(&
T);
while
(1)
{
switch(Desk(n))
{
case1:
peach_1();
break;
case2:
peach_2(&
case3:
peach_3(n,i);
case4:
peach_4(&
case5:
exit(0);
}
return0;
//头文件代码
#defineDAYS10//定义给定的天数
#defineSTACK_SIZE5//栈的容量,实际只用了一个
#defineTRUE1
#defineERROR0
请选择要使用的方法:
//采用数组数据结构实现上述求解
voidpeach_1(void)
intpeach[50]={0};
inti=0,j=0;
peach[DAYS-1]=1;
//最后一天的桃子数
for(i=DAYS;
i>
0;
--i,j=i-1)
peach[j]=2*(peach[i]+1);
*********************\n"
*数组法*\n"
*这群猴子共摘了%d个桃子*\n"
peach[0]);
//采用链数据结构实现上述求解
//把当天的桃子数进栈
voidPush(stack*s,intnum)
*s->
top++=2*(num+1);
//把前一天的桃子数出栈
num)//&
num位地址传递,可以直接对参数进行修改
{
num=*--s->
top;
voidpeach_2(stack*s)
inti=0;
intnum=0;
Push(s,1);
//先把最后一天的桃子数进栈
i++;
while(i<
DAYS)
Pop(s,num);
Push(s,num);
i++;
*链表法*\n"
num);
voidpeach_3(intn,inti)
if(i==DAYS)//DAYS为递归终止条件由用户给出
*递归法*\n"
n);
else
n=2*(n+1);
peach_3(n,i+1);
//对二叉树进行赋值计算
voidcalculate(tree*T)
tree*T1,*T2,*T3;
//T1,T3分别为T2的左右孩子
T2=T;
for(i=0;
DAYS-1;
T1=T2->
lchild;
T3=T2->
rchild;
data=2*(T2->
data+T3->
data);
T2=T1;
//二叉树遍历最左下角的孩子节点
voidpeach_4(tree*T)
calculate(T);
while(T->
lchild!
=NULL)
T=T->
*二叉树法*\n"
T->
六、算法的测试
执行该功能
//主函数
T=CreatTree(&
switch(Desk(n))
case1:
peach_1();
break;
case2:
peach_2(&
case3:
peach_3(n,i);
case4:
peach_4(&
case5:
exit(0);
peach[j]=2*(peach[i]+1);
i++;
Pop(s,num);
Push(s,num);
*递归法*\n"
n=2*(n+1);
//循环体
T=T->
7、运行结果分析
1、数组法:
创建一个大小为DAYS的一维数组a[DAYS],a[0],a[1]...a[DAYS-1]分别存放当天的桃子数,其中a[n]=2*(a[n-1]+1)。
2、链表法:
创建一个链栈,先把第DAYS天的桃子数进栈,然后出栈,把出战的数据num进行处理,即num=2*(num+1),然后继续进栈,出栈如此反复循环DAYS次结束。
3、递归法:
首先确定递归的终止条件,即i=DAYS(假设i的初始值为1),循环体为
fac(n,i+1),在递归过程中对n进行如下处理,n=2*(n+1)。
4、二叉树法:
创建一个大小为DAYS的二叉树,其中根节点为第DAYS天的桃子数,其中根节点的左孩子为上一天的桃子数,右孩子只存一个固定数据,即数字1。
对二叉树作如下处理,对于一个根节点,其左孩子=2*(根节点+右孩子)。
经过一系列的调试运行,该程序可以正确执行,并能够按要求完成任务。
8、收获及体会
通过设计猴子吃桃子这一程序,是我对C语言以及数据结构有了更深的了解,通过编写代码,是我学习和掌握了C的理论知识和实践程序设计的各种技能。
在编写代码时也遇到了很多麻烦,例如在用递归编写时,突然忘了递归在系统栈内是如何运行的,于是我向同学和老师虚心请教。
另外在用二叉树时,根节点T总是没有正确定位,使其成为了野指针。
总而言之,通过这一课程设计的学习,我对C程序有了更深的认识。
我深信,一个良好的程序员需要不断去敲写代码,在实践中总结经验,从而提高自己的综合实践能力,去为社会最初更大的奉献。
最后我要感谢我的同学以及汪文彬老师对我的帮助,我所取得的进步与他们的热心帮助是离不开的。
九、主要参考文献:
[1]苏小红C语言大学实用教程(第二版)电子工业出版社
[2]数据结构C语言版严蔚敏清华大学出版社
[3]C程序设计谭浩强第三版清华大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 猴子 问题 数据结构 课程设计