数据结构实现猴子吃桃.docx
《数据结构实现猴子吃桃.docx》由会员分享,可在线阅读,更多相关《数据结构实现猴子吃桃.docx(9页珍藏版)》请在冰豆网上搜索。
![数据结构实现猴子吃桃.docx](https://file1.bdocx.com/fileroot1/2022-11/29/add49b54-e1bb-4c36-93c9-f65da5ad2c7d/add49b54-e1bb-4c36-93c9-f65da5ad2c7d1.gif)
数据结构实现猴子吃桃
哈尔滨师范大学
学 年 设计
题目数据结构实现——猴子吃桃
学生朱光杰
指导教师付伟讲师
年级2006级
专业课件教育
系别计算机科学系
学院计算机科学与信息工程学院
哈尔滨师范大学
2008年9月
论 文 提 要
初步分析说明数据结构和抽象数类型等基本概念;从抽象数据类型的角度,通过数学应用的分析,把问题进行分析,整理,面后通过观察选择适当的逻辑结构、存储结构入及其相应的算法来解决问题,数据结构课程主要是为了培养我们对数据的抽象能力和对算法在时间和空间和复杂度上进行优化,猴子吃桃这一数学方面的例题是很典型的一道程序例题,在这里主要以C语言作为数据结构和描述语言,分析并采用链数据结构实现上述问题。
实现课题——猴子吃桃
摘要:
猴子吃桃这一典型的数学课题,其主要实现的过程是将其数学课题公式化,用一些简单的数据定义、初使化、通过一系列的条件判断和循环用来实现学数公式的计算机化。
通过C语言基础分析和数据结构初步了解,我们使用C语言,利用C和数据结构的结合使用,让我们在短时间内建立起对数据结构的进一步认识。
然后,形成正确的对算法和优有个的理解观念。
关键词:
C语言的基本了解,数据结构的基本了解,数据中数组的使用,用C语言实现数据链表
题目:
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少?
要求:
采用链数据结构实现上述求解
一、数据结构的由来
自1946第一台计算机问世以来,计算机产业的飞速发殿已远远超出人们对它的预料,在某些生产线上,甚至几秒种就能生产出一台微型计算机,产量猛增,价格低廉,这廉就范围迅速扩展。
如今,计算机已深入到人类社会的各个领域。
计算机的应用已不再局限于科学计算,而是多地用于控制、管理及数据处理等非数值计算的处理工作。
与此相应,计算机加工处理的对象由纯粹的数值发展到字符、表格和图像等各种具有一定结构的数据,这就给程序设计带来一些新的问题。
这了编写出一个“好”的程序,必须分析待处理的对象的特性以及各处理对象之间存在的关系。
也是如此“数据结构”渐渐的发展成为了一门新的学科。
二、数据结构的发展
“数据结构”作为一门独立的课程在国外是从1968年才开始设立的。
在这之前,它的某些内容曾在其他课程,如表处理语言中有所阐述。
1968年在美国一些大学的计算机系的教学计划中,虽然也把“数据结构”规定为一门课程,但对课程的范围也没有作明确规定。
当时,包括网络、集合代数论、特别是和表、树的理论为同义语。
随后,数据结构这个概念被扩充到由于数据必须在计算机中进行处理,因此,不仅考虑数据本身的数学性质,而且还必须考虑数据的存储结构,这就进一步扩大了数据结构的内容。
近年来,随时着数据库系统的不断发展,在“数据结构”课程中又增加了文件管理的内容。
1968年美国唐·欧·克努特教授开创了“数据结构”的最初体系,他所鞭策的《计算机程序设计技巧》第一卷《基本算法》是第上本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。
从20世纪60年代末70年代初,出现了大型程序,软件也相对独立,结构程序设计成为程序设计方法学的主要内容,人们就越来越重视“数据结构”,认为程序设计的实质是对确定的总是选择一种好的结构,加上设计一种好的算法。
从20世纪70年代中期到80年代初,各种版本的数据结构相继出现。
“数据结构”在计算机科学中是一门综合性的专业基础。
“数据结构”的研究不仅涉及到计算机硬件的研究范围,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。
在研究信息检索时也必须考虑如何组织数据,以便查找和存取数据元素更为方便。
因此,可以认为“数据结构”不仅是一般程序设计的基础,而且是设计和实现编译程序、操作系统、数据库系统及鞭他系统程序和大型应用程序的重要基础。
“数据结构”的发展并未因为成形的时间也终结,一方面,它向各专门领域中特殊总是的数据结构研究和发展,如多维图形的数据结构等;另一方面,从抽象数据类型的观点来讨论数据结构,已成为一种新的趋势,越来越被人们所重视。
三、基本概念和要点
数据结构的逻辑结构、存储结构及数据运算的含义及其相互关系。
数据结构的两大类逻辑结构和四种常用的存储表示方法。
数据就是指能够被计算机识别、存储和加工处理的信息的载体。
数据元素是数据的基本单位,有时一个数据元素可以由若干个数据项组成。
数据项是具有独立含义的最小标识单位。
如整数这个集合中,10这个数就可称是一个数据元素.又比如在一个数据库(关系式数据库)中,一个记录可称为一个数据元素,而这个元素中的某一字段就是一个数据项。
数据结构的定义虽然没有标准,但是它包括以下三方面内容:
逻辑结构、存储结构、和对数据的操作 。
这一段比较重要,用自己的语言来说就比如一个 表 ( 数据库 ),我们就称它为一个数据结构,它由很多 记录 ( 数据元素 )组成,每个元素又包括很多字 ( 数据项 )组成。
那么这张表的逻辑结构是怎么样的呢?
我们分析数据结构都是从 结点 (其实也就是元素、记录、顶点,虽然在各种情况下所用名字不同,但说的是同一个东东)之间的关系来分析的,对于这个表中的任一个记录(结点),它只有一个 直接前趋 ,只有一个 直接后继 (前趋后继就是前相邻后相邻的意思),整个表只有一个 开始结点 和一个 终端结点 ,那我们知道了这些关系就能明白这个表的逻辑结构了。
◆ 数据 :
指能够被计算机识别、存储和加工处理的信息载体。
◆ 数据元素 :
就是数据的基本单位,在某些情况下,数据元素也称为元素、结点、顶点、记录。
数据元素有时可以由若干 数据项 组成。
◆ 数据类型 :
是一个值的集合以及在这些值上定义的一组操作的总称。
◆ 数据结构 :
指的是数据之间的相互关系,即数据的组织形式。
一般包括三个方面的内容:
数据的 逻辑结构 、 存储结构 和 数据的运算 。
◆ 逻辑结构 :
指各数据元素之间的逻辑关系。
◆ 存储结构 :
就是数据的逻辑结构用计算机语言的实现。
◆ 线性结构 :
数据逻辑结构中的一类,它的特征是若结构为非空集,则该结构有且只有一个 开始结点 和一个 终端结点 ,并且所有结点都最多只有一个 直接前趋 和一个 直接后继 。
线性表就是一个典型的线性结构。
存储结构则是指用计算机语言来表示结点之间的这种关系。
如上面的表,在计算机语言中描述为连续存放在一片内存单元中,还是随机的存放在内存中再用指针把它们链接在一起,这两种表示法就成为两种不同的存储结构。
数据的运算 ,比如一张表格,我们需要进行查找,增加,修改,删除记录等工作,而怎么样才能进行这样的操作呢?
这也就是数据的运算,它不仅仅是加减乘除这些算术运算了,在数据结构中,这些运算常常涉及算法问题。
通常我们就将数据的逻辑结构称之为数据结构 ,数据的逻辑结构分两大类:
线性结构 和 非线性结构 (这两个很容易理解)
数据的存储方法有四种:
顺序存储方法 、 链接存储方法 、 索引存储方法和散列存储方法 。
◆ 顺序存储方法 :
它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。
由此得到的存储表示称为 顺序存储结构 。
◆ 链接存储方法 :
它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。
由此得到的存储表示称为 链式存储结构 。
◆ 索引存储方法 :
除建立存储结点信息外,还建立附加的索引表来标识结点的地址。
◆ 散列存储方法 :
就是根据结点的关键字直接计算出该结点的存储地址。
四、举例分析
题目:
“猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。
求第一天共摘了多少?
”我们要通过对这一例子的简要分析,不对这四种存储方法之中的链表进行一下分析。
先将数学问题分析得到公式:
求出桃子总数Y
程序分析:
采取逆向思维的方法,从后往前推断。
C程序源代码:
main()
{
intday,x1,x2;
day=9;
x2=1;
while(day>0)
{x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/
x2=x1;
day--;
}
printf("thetotalis%d\n",x1);
根据分析图1,它的运算方式和数据结构中的链表相本相似,其实数学结构中链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组单元可以是连续的,也可以是不连续的。
因此,为了表示每个数据元素ai与其直接后继数据元素ai+1之间的关系,对数据ai来说除了存储本身的信息之外,还需存储一个指示其直接后继的住处即直接后继的存储位置。
这两部分住处组成数据元素ai的存储映象,称为结点(node)。
它包括两个域:
其中存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域。
指针域中存储的信息称做指针或链。
n个结点(ai(1≤i≤n)的存储映像)链结成一个链表,即为线性表
(a1,a2,……,an)的链式存储结构。
又由于此链表的每个结点中只包含一个指针域,故又称线性链表或单链表:
(Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8,Y9,Y10)的线性存储结构,必须从头指针开始进行,头指针指示链表中第一个结点,即第一个数据元素的存储映像的存储位置。
同时,由于最后一个数据元素没有直接后继,则线性链表中最后一个结点的指针为“空”NULL。
如图2
图3
用线性链表表示线性表时,数据元素之间的逻辑关系是由结点中指针指示的。
指针为数据元素之间的逻辑关系的映像,则逻辑上相邻的两个数据元素其存储的物理位置不一定相邻。
通常我们把链表画成用箭头相链接的结点的序列,结点之间的箭头表示链域中的指针如图2的线性链表可表示成图3的形式,这是国为在使用链表时,关心的只是它所表示的线性表中数据元素之间的逻辑顺序,而不是每个数据元素在存储器中的实际位置。
由些可见,单链表可由头指会惟一确定,在C语言可用“结构指针”来描述:
猴子吃桃:
采用链式结构实现编程如下;
#include
#include
#defineNULL0
typedefstructlinknode
{
intdata;
structlinknode*next;//链表指针
}node;
node*head;//头结点
voidcreat()//创建链表
{node*p,*s;
intpeaches=1;//第十天时只剩下一个桃子
intday=10;
head=(node*)malloc(sizeof(node));
p=head;
while(day>0)
{
s=(node*)malloc(sizeof(node));//分配存属空间
s->data=peaches;//用来存放结点数据
p->next=s;//把结点插入链表中
p=s;
peaches=(peaches+1)*2;//第一天的桃子数是第二天桃子数加后的2倍;
day--;
}
p->next=NULL;
p=head;
head=head->next;//使头指针指向头结点
free(p);//释放指针P
}
voidprint()//输出从这十天每天的桃子数
{node*p;
p=head;
intday=10;
while(p&&day>0)
{printf("第%d天的桃子数:
%d个\n",day,p->data);
p=p->next;
day--;
}
}
voidmain()//主函数
{
creat();
print();
}
四、总结
通对对猴子吃桃这一典型例题的分析、理解到最后的解决都有助于我们对数据结构这门课程的正解认识和体会,能更好的培养我的学习分析能力,在分析中得到最有效率的算法,也更加说明了这门课程的重要性和应用于的广泛。
参考文献
[1]严蔚敏.吴伟民.数据结构(C语言版)清华大学出版社.2007年9月
[2]王森.C语言编程基础.电子工业出版社.2001年12月
学年论文(设计)成绩表
论文题目
猴子吃桃
作 者
朱光杰
指导教师
付伟
职 称
讲师
指
导
教
师
评
语
该生论文观点明确,语言表达流畅,论证充分全面。
论文整体水平高,有独立分析问题、解决问题的能力。
书写工整,格式及标点规范。
说明书、图纸完备、整洁、正确、符合规范。
指导教师签字
付伟
等级
9