(软考软件设计师)专题九数据结构知识

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

书山有路勤为径FROM:及时雨专题九:数据结构知识数据结构是计算机软件的一门基础课程,计算机科学各个领域及有关的应用软件都要用到各种数据结构.语言编译要使用栈、散列表及语法树;操作系统中用队列、存储管理表及目录树等;数据库系统运用线性表、多链表及索引树等进行数据管理;而在人工智能领域,依求解问题性质的差异将涉及到各种不同的数据结构,如广义表、集合、搜索树及各种有向图等等。学习数据结构目的是要熟悉一些最常用的数据结构,明确数据结构内在的逻辑关系,知道它们在计算机中的存储表示,并结合各种典型应用说明它们在进行各种操作时的动态性质及实际的执行算法,进一步提高软件计和编程水平。通过对不同存储结构和相应算法的对比,增强我们根据求解问题的性质选择合理的数据结构,并将问题求解算法的空间、时间及复杂性控制在一定范围的能力。软件设计师考试大纲对数据结构部分的要求是熟练掌握常用数据结构和常用算法,因此,本专题从数据结构的概述出发,对基本的概念引出常用的数据结构类型的介绍和讲解,同时在讲解各种数据结构中间采用算法与数据结构相结合的方式,在算法步骤中使用数据结构,对数据结构的重点、难点进行了分析,最后讲解了与数据结构紧密相关的排序和查找算法,以及一些以往考试题的分析。1.数据结构概述数据结构研究了计算机需要处理的数据对象和对象之间的关系;刻画了应用中涉及到的数据的逻辑组织;也描述了数据在计算机中如何存储、传送、转换。学习数据结构注意的问题:系统掌握基本数据结构的特点及其不同实现。了解并掌握各种数据结构上主要操作的实现及其性能(时间、空间)的分析。掌握各种数据结构的使用特性,在算法设计中能够进行选择。掌握常用的递归、回溯、迭代、递推等方法的设计掌握自顶向下、逐步求精的程序设计方法。掌握自顶向下、逐步求精的程序设计方法。在学习数据结构的知识之前,我们要了解一下数据结构中的基本概念。数据:对客观事物的符号表示,在计算机中就是指所有能输入到计算机中并被计算机程序所处理的符号的总称。数据项:是数据的不可分割的最小单位;书山有路勤为径FROM:及时雨数据元素:是数据的基本单位,在计算机程序中通常作为一个整体进行处理;一个数据元素可由若干个数据项组成。数据对象:是性质相同的数据元素的集合,是数据的一个子集。数据结构上的基本操作:◆插入操作◆删除操作◆更新操作◆查找操作◆排序操作数据结构是指数据对象及相互关系和构造方法,一个数据结构B形式上可以用一个二元组表示为B=(A,R)。其中,A是数据结构中的数据(称为结点)的非空有限集合,R是定义在A上的关系的非空有限集合。根据数据元素之间的关系的不同特性,通常有下列4类基本结构。集合——结构中的数据元素除了“同属于一个集合”的关系外,别无其他关系。线性结构——结构中的数据元素之间存在一个对一个的关系。树形结构——结构中的元素之间存在一个对多个的关系。图状结构或网状结构——结构中的元素之间存在多个对多个的关系。数据结构中,结点与结点间的相互关系是数据的逻辑结构。数据结构在计算机中的表示(又称为映象)称为数据的物理结构,也称存储结构。数据元素之间的关系在计算机中有两种不同的表示方式:顺序映象和非顺序映象,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。任何一个算法的设计取决于选定的数据(逻辑)结构,而算法的实现依赖于采用的存储结构。数据的逻辑结构分为两类:线性结构:线性表、栈、队列和串非线性结构:树、图数据的存储方法有四类:顺序存储方法链接存储方法索引存储方法散列存储方法2.常用数据结构2.1线性表在数据结构中,线性结构常称为线性表,是最简单、最常用的一种数据结构,它是由n个相同数据类型的结点组成的有限序列。书山有路勤为径FROM:及时雨其特点是:在数据元素的非空有限集合中,◆存在唯一的一个被称做“第一个”的数据元素◆存在唯一的一个被称做“最后一个”的元素数据元素◆除第一个之外,集合中的每个数据元素均只有一个前驱◆除最后一个之外,集合中每个数据元素均只有一个后继一个由n个结点e0,e1…,en-1组成的线性表记为:(e0,e1…,en-1)。线性表的结点个数称为线性表的长度,长度为0的线性表称为空的线性表,简称空表。对于非空线性表,e0是线性表的第一个结点,en-1是线性表的最后一个结点。线性表的结点构成了一个序列,对序列中两个相邻结点ei和ei-1,称前者是后者的前驱结点,后者是前者的后继结点。线性表最重要的性质是线性表中结点和相对位置是确定的。线性表的结点也称为表元,或称为记录,要求线性表的结点一定是同一类型的数据。线性表的结点可由若干个成分组成,其中唯一标识表元的成分成为关键字,简称键。线性表是一个相当灵活的数据结构,它的长度可以根据需要增长或缩短。对线性表的基本运算如下:INITIATE(L)初始化操作LENGTH(L)求长度函数GET(L,i)取元素函数PRIOR(L,elm)求前驱函数NEXT(L,elm)求后继函数LOCATE(L,x)定位函数INSERT(L,i,b)插入操作DELETE(L,i)删除操作有多种存储方式能将线性表存储在计算机内,其中最常用的是顺序存储和链接存储。根据存储方式的不同,其上述的运算实现也不一样。顺序存储:是最简单的存储方式,其特点是逻辑关系上相邻的两个元素在物理位置上也相邻。通常使用一个足够大的数组,从数组的第一个元素开始,将线性表的结点依次存储在数组中。顺序存储方式优点:能直接访问线性表中的任意结点。线性表的第i个元素a[i]的存储位置可以使用以下公式求得:LOC(ai)=LOC(a1)+(i-1)*l书山有路勤为径FROM:及时雨式中LOC(a1)是线性表的第一个数据元素a1的存储位置,通常称做线性表的起始位置或基地址。顺序存储的缺点:1)线性表的大小固定,浪费大量的存储空间,不利于节点的增加和减少;执行线性表的插入和删除操作要移动其他元素,不够方便;◆链式存储线性表链接存储是用链表来存储线性表。单链表(线性链表):从链表的第一个表元开始,将线性表的结点依次存储在链表的各表元中。链表的每个表元除要存储线性表结点的信息以外,还要有一个成分来存储其后继结点的指针。线性链表的特点是:每个链表都有一个头指针,整个链表的存取必须从头指针开始,头指针指向第一个数据元素的位置,最后的节点指针为空。当链表为空时,头指针为空值;链表非空时,头指针指向第一个节点。链式存储的缺点:1)由于要存储地址指针,所以浪费空间;直接访问节点不方便;循环链表:循环链表是另一种形式的链式存储结构,是单链表的变形。它的特点就是表中最后一个结点的指针域指向头结点,整个链表形成一个环。因此,从表中任意一个结点出发都可以找到表中的其他结点。循环链表和单向链表基本一致,差别仅在于算法中循环的条件不是结点的指针是否为空,而是他们的指针是否等于头指针,循环链表最后一个结点的link指针不为0(NULL),而是指向了表的前端。为简化操作,在循环链表中往往加入表头结点。循环链表的特点是:只要知道表中某一结点的地址,就可搜寻到所有其他结点的地址。循环链表的示例:带表头结点的循环链表:书山有路勤为径FROM:及时雨双向链表:双向链表是另一种形式的链式结构,双向链表的结点中有两个指针域,其一指向直接后继,另一指向直接前趋。双向链表克服了单链表的单向性的缺点。前驱方向后继方向双向链表也可以有循环表,链表中存在两个环。一个结点的前趋的后继和该结点的后继的前趋都是指向该结点的。p==p→lLink→rLink==p→rLink→lLink2.2栈栈(Stack)是限定仅在表尾进行插入或删除操作的线性表。表尾端称栈顶(top),表头端称栈底(bottom)。若有栈S=(s0,s1,…,sn-1)则s0为栈底结点,sn-1为栈顶结点。通常称栈的结点插入为进栈,栈的结点删除为出栈。因为最后进栈的结点必定最先出栈,所以栈具有后进先出的特点。可以用一下一个图形来形象的表示:书山有路勤为径FROM:及时雨栈有两种存储结构:顺序栈和链栈顺序栈即栈的顺序存储结构是,利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时设指针top指示栈顶元素的当前位置。栈也可以用链表实现,链式存储结构的栈简称链栈。若同时需两个以上的栈,则最好采用这种结构。对于栈上的操作,总结如下,大家可以仔细看一下这些程序,一个大的程序都是由一些对数据结构的小的操作组成的。顺序存储的栈的基本操作如下:判断栈满:intstackfull(seqstack*s){return(s-top==stacksize-1);}进栈:voidpush(seqstack*s,datatypex){if(stackfull(s))error(“stackverflow”);s-data[++s-top]=x;}判断栈空:书山有路勤为径FROM:及时雨intstackempty(seqstack*s){return(s-top==-1)}出栈:datatypepop(seqstack*s){if(stackempty(s))error(“stackunderflow”);x=s-data[top];s-top--;return(x);}链接存储栈:用链表实现的栈,链表第一个元素是栈顶元素,链表的末尾是栈底节点,链表的头指针就是栈顶指针,栈顶指针为空则是空栈。若同时需要两个以上的栈,最好采用链表作存储结构链接存储的栈的操作如下:进栈:Voidpush(linkstack*p,datatypex){stacknode*qq=(stacknode*)malloc(sizeof(stacknode));q–data=x;q–next=p–top;p–top=q;}书山有路勤为径FROM:及时雨出栈:Datatypepop(linkstack*p){datatypex;stacknode*q=p–top;if(stackempty(p)error(“stackunderflow.”);x=q–data;p–top=q–next;free(q);returnx;}多栈处理栈浮动技术:n个栈共享一个数组空间V[m]n设立栈顶指针数组t[n+1]和栈底指针数组b[n+1],t[i]和b[i]分别指示第i个栈的栈顶与栈底,b[n]作为控制量,指到数组最高下标各栈初始分配空间s=m/n指针初始值t[0]=b[0]=-1b[n]=m-1t[i]=b[i]=b[i-1]+s,i=1,2,…,n-12.3队列队列是只允许在一端进行插入,另一端进行删除运算的线性表。允许删除的那一端称为队首(front),允许插入运算的另一端称为队尾(rear)。通常称队列的结点插入为进队,队列的结点删除为出队。若有队列书山有路勤为径FROM:及时雨Q=(q0,q1,…,qn-1)则q0为队首结点,qn-1为队尾结点。因最先进入队列的结点将最先出队,所以队列具有先进先出的特性。可以用顺序存储线性表来表示队列,也可以用链表实现,用链表实现的队列称为链队列。队列操作:①intpush(PNODE*top,inte)是进栈函数,形参top是栈顶指针的指针,形参e是入栈元素。②intpop(PNODE*top,intoe)是出栈函数,形参top是栈顶指针的指针,形参e作为返回出栈元素使用。③intenQueue(PNODE*tail,inte)是入队函数,形参tail是队尾指针的指针,形参e是入队元素。④intdeQueue(PNODE*tail,int*e)是出队函数,形参tail是队尾指针的指针,形参e作为返回出队元素使用。定义结点的结构如下:typedefstructnode{intvalue;structnode*next;书山有路勤为径FROM:及时雨}NODE,*PNODE;[函数①]intpush(PNODE*top,inte){PNODEp=(PNODE)malloc(sizeof(NODE));if(!p)return–1;p-value=e;p-next=*

1 / 47
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功