猴子吃桃子问题数据结构课程.docx

上传人:b****2 文档编号:2050235 上传时间:2022-10-26 格式:DOCX 页数:14 大小:48.65KB
下载 相关 举报
猴子吃桃子问题数据结构课程.docx_第1页
第1页 / 共14页
猴子吃桃子问题数据结构课程.docx_第2页
第2页 / 共14页
猴子吃桃子问题数据结构课程.docx_第3页
第3页 / 共14页
猴子吃桃子问题数据结构课程.docx_第4页
第4页 / 共14页
猴子吃桃子问题数据结构课程.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

猴子吃桃子问题数据结构课程.docx

《猴子吃桃子问题数据结构课程.docx》由会员分享,可在线阅读,更多相关《猴子吃桃子问题数据结构课程.docx(14页珍藏版)》请在冰豆网上搜索。

猴子吃桃子问题数据结构课程.docx

猴子吃桃子问题数据结构课程

1、需求分析

1、猴子吃桃子问题

有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。

用多种方法实现求出原来这群猴子共摘了多少个桃子。

 要求:

1) 采用数组数据结构实现上述求解

2) 采用链数据结构实现上述求解

3) 采用栈实现上述求解

4) 采用递归实现上述求解

2、概要设计

2.1.用数组数据结构实现上述求解

在taozi函数中定义一个一维数组,分别存储每天的桃子个数,根据题目的内容找出各个数之间的关系,用数组元素表示出来,根据用户输入要计算哪一天的桃子,用for循环控制结束。

在main函数中让用户输入要计算的哪一天,调用taozi函数,以便用户可查出任意一天的桃子个数,用switch语句判断用户要执行的功能,然后用while循环控制,直到用户输入0为止。

2.2.用链数据结构实现上述求解

先写出预定义常量和类型,写出结点的类型定义,创建结点,初始化链表,定义变量并初始化,找出结点与其后继结点之间的联系,然后在主函数中控制。

2.3用栈数据结构实现求解

本部分包括预定义常量和类型,顺序栈的定义,InitStack函数,Push函数,和main函数,在InitStack函数构造一个空栈,在Push函数中调用该函数,并在其中编写控制栈顶指针和栈底指针移动的语句,找出指针所指向的数据之间的关系,在main函数中编写控制循环结束的语句,最后再用main函数去调用Push函数。

2.4用递归实现上述求解

这种方法跟上述几种不同,在函数的执行函数的过程中,需多次进行自我调用,递归函数的运行过程类似与多个函数的嵌套调用,只是调用函数和被调用函数是同一个函数,从主函数开始调用,一次更深一层,退出时一步一步返回到上一层,所以不需写控制循环语句,不需要写控制循环语句,比上几种方法简单点。

3、运行环境

3.1硬件环境

PC

3.2软件环境

(1)WindowsXP

(2)MicrosoftVisualC++6.0

4、详细设计

4.1系统流程图

 

4.2用数组数据结构实现上述求解

//计算桃子的个数

voidtaozi(intn,intm)

{

intday[10];//初始化变量,用数组元素分别存储每天的桃子个数

inti;//控制循环执行的次数

day[0]=n;//最后一天的桃子个数

for(i=0;i<10-m;i++)

day[i+1]=2*(day[i]+1);//相邻元素之间的关系

printf("第%d天的桃子为:

%d\n",m,day[10-m]);

}

voidmain()

{

intm;//用户要计算的是第几天

printf("请输入要求第几天剩下的桃子:

\n");

scanf("%d",&m);

taozi(1,m);//调用

while

(1){

intj;//循环控制条件

printf("请输入j的值0:

退出1:

继续:

\n");

scanf("%d",&j);

switch(j){

//当j=1时,用户可以输入多次想要的数值

case1:

printf("请输入要求第几天剩下的桃子:

\n");

scanf("%d",&m);

taozi(1,m);

break;//跳出

//当j=0时,跳出switch结构

case0:

return;

break;

//当用户输入除0和1以外的数值时,会让你重新输入,直到输入正确为止

default:

printf("输入有误请重新输入!

");

}

}

}

4.3用链数据结构实现上述求解

//预定义常量和类型

#defineNULL0

//单链表的存储结构

typedefstructLNode{

intdata;//数据域

structLNode*next;//指针域

}LNode;

LNode*L;

LNode*p,*s;

//计算桃子的个数

intCreateList_L(inte,intm)//e是第十天的桃子的个数,m是将要计算的是第几天

{

inti;

L=(LNode*)malloc(sizeof(LNode));//生成新结点

p=(LNode*)malloc(sizeof(LNode));

L->next=NULL;//创建一个带头结点的单链表

L->next=p;//插入到表头

L->next->data=e;//初始化第一个结点

for(i=m-1;i>0;i--)

{

s=(LNode*)malloc(sizeof(LNode));

p->next=s;

s->data=2*(p->data+1);//结点与下一结点之间的联系

p=s;//指针P总是指向最后一个结点

s->next=NULL;

}

printf("第%d天的桃子为:

%d\n",11-m,p->data);

}

4.4用栈数据结构实现求解

//储存空间初始分配量

#defineSTACK_INIT_SIZE100

//顺序栈的定义

typedefstruct

{

int*base;//栈底指针

int*top;//栈顶指针

intstacksize;//当前已分配的存储空间

}SqStack;

SqStacks;

//构造一个空栈

intInitStack()

{

s.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));

if(!

s.base)

exit(OVERFLOW);//存储分配失败

s.top=s.base;//刚开始栈为空

s.stacksize=20;

returnOK;

}

//计算桃子个数的函数

voidPush(inte,intm)//m是要计算的是第几天

{

inti;

InitStack();

*s.top++=e;//给栈底元素初始化

for(i=0;i<10-m;i++)

{

*s.top=2*(*(s.top-1)+1);//栈顶元素和刚插入的元素之间的关系

s.top++;//每插入一个栈顶元素,指针就要自加1

}

printf("第%d天的桃子为:

%d\n",m,*(s.top-1));

}

4.5用递归实现上述求解

inti=9;//初始化全局变量

//递归函数

inttaozi(intx)

{

inty;

while(i>0)

{

y=2*(x+1);

i--;//循环控制条件

taozi(y);

printf("%d\n",y);

}

}

5、调试分析

1在用链数据结构实现时,运行时没有显示错误,但输出不是预测的结果,代码如下:

for(i=m-1;i>0;i--)

{

s=(LNode*)malloc(sizeof(LNode));

p->next=s;

s->data=2*(p->data+1);

s->next=NULL;

}

在指针的移动时,由于p总是第一个结点,在for循环前已经被赋值,指针P应该总是指向最后一个结点的,所以在这句s->next=NULL前加上一句p=s就行了,就能输出正确结果。

2在生成新结点时,一定要用强制类型转换,要不就要出错。

不能把s=(LNode*)malloc(sizeof(LNode))写成s=(LNode)malloc(sizeof(LNode));因为它们不属于同一类型。

3在用栈数据结构实现的过程中,虽然只有一个错误,但却显示了好多错误。

主要原因是由于一个参数是在main函数中定义的,但却被其它函数调用,只要把该参数定义成全局变量就行了。

4在用while循环时,由于控制条件的不恰当导致的错误,不过只要再认真分析一下,就正确了。

5还有些其它方面的错误,不过只要看一眼,就能改正,是粗心造成的。

6、运行结果

链数组和栈实现结果:

递归实现结果:

课程设计总结

通过这一周的实践学习,我认识到学好计算机要重视实践操作,不仅仅是学习数据结构,以及其它的计算机方面的知识都要重在实践,很多以前学过的东西,在运用时都不能很熟练,也说明理论知识和实践之间的差别。

这就告诉了我们在以后的学习过程中要培养自己的动手能力,要将学过的知识转化为实践。

作为一个计科专业的学生,通过这周的学习,使我更加明白了动手能力的重要性。

在这次的课程设计中,我不断地去找书本知识和查阅其它有关资料,不仅巩固了对课本知识的掌握,还有利于以后更好的进步,提高了对课外知识的了解,虽然花费了不少时间,但只要学到有价值的东西,我认为都是值得的。

在完成该试验的过程中,我问了同学和老师,还查阅了很多和链表有关系的书籍,通过学习,翻看以前学过的知识,使我明白了我在学习知识上的很多不足。

不过在此同时又重新复习了课本,从中学到了许多以前未学到的知识,感觉非常有成就感,让我对自己更加有信心,让我对数据结构这门课程也更感兴趣了,以前我一直感觉枯燥难学的数据结构,现在我也愿意去认真研究学习了。

这次数据结构课程设计中,多亏了我的指导老师黄磊老师的悉心教导。

在以后的学习过程中,我要认真负责地对待课本中的每一个知识点,进一步充实自己,提高自己。

参考文献

[1]黄同成,黄俊民,董建寅.数据结构[M].北京:

中国电力出版社,2008

[2]董建寅,黄俊民,黄同成.数据结构实验指导与题解[M].北京:

中国电力出版社,2008

[3]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:

清华大学出版社,2002

[4]刘振鹏,张晓莉,郝杰.数据结构[M].北京:

中国铁道出版社,2003

附录:

源代码如下

1用数组数据结构编写

#include

voidtaozi(intn,intm)

{

intday[10];

inti;

day[0]=n;

for(i=0;i<10-m;i++)

day[i+1]=2*(day[i]+1);

printf("第%d天的桃子为:

%d\n",m,day[10-m]);

}

voidmain()

{

intm;

printf("请输入要求第几天剩下的桃子:

\n");

scanf("%d",&m);

taozi(1,m);

while

(1){

intj;

printf("请输入j的值0:

退出1:

继续:

\n");

scanf("%d",&j);

switch(j){

case1:

printf("请输入要求第几天剩下的桃子:

\n");

scanf("%d",&m);

taozi(1,m);

break;

case0:

return;

break;

default:

printf("输入有误请重新输入!

");

}

}

}

2用链数据结构编写

#include

#include

#defineNULL0

typedefstructLNode{

intdata;

structLNode*next;

}LNode;

LNode*L;

LNode*p,*s;

intCreateList_L(inte,intm)

{

inti;

L=(LNode*)malloc(s

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1