数据结构知识总结
- 格式:docx
- 大小:31.68 KB
- 文档页数:9
数据结构知识点总结一、基本概念数据:所有能被输入到计算机并被处理的符号的集合。
数据元素:数据的基本单位,也称为结点、节点或记录。
数据项:构成数据元素的不可分割的最小单位。
抽象数据类型:抽象数据组织和与之相关的操作,通常采用数据对象、数据关系、基本操作集这样的三元组来表示。
二、逻辑结构数据的逻辑结构是从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
数据元素之间的关系(逻辑结构)可分为四类:集合结构:数据元素之间除了“属于同一集合”的关系外,别无其它关系。
线性结构:数据元素之间存在一对一的关系,如数组、链表、队列和栈等。
树形结构:数据元素之间存在一对多的关系,如二叉树、多叉树等。
图结构或网状结构:数据元素之间存在多对多的关系。
三、存储结构数据对象在计算机中的存储表示称为数据的存储结构,也称物理结构。
数据元素在计算机中有两种基本的储存结构:顺序存储结构:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,通常借助程序设计语言的数组类型来描述。
链式存储结构:无需占用一整块存储空间,数据元素的存储位置不必连续,而是通过指针链接形成逻辑关系。
四、数据结构的运算数据结构中的运算包括插入、删除、查找、遍历等,这些运算的实现依赖于具体的逻辑结构和存储结构。
五、数据结构的应用数据结构在各个领域都有广泛的应用,如数据库系统、计算机网络、图形处理等。
通过合理地选择和设计数据结构,可以提高程序的运行效率,降低存储空间的占用。
六、数据结构与算法的关系数据结构和算法是相辅相成的。
数据结构是算法的基础,算法的实现依赖于特定的数据结构。
同时,算法的优化也往往需要对数据结构进行改进和调整。
总结来说,数据结构是计算机科学中的核心概念之一,它涉及数据的组织、存储和运算等多个方面。
理解和掌握数据结构的基本知识点和原理,对于提高编程能力和解决实际问题具有重要意义。
数据结构知识点总结数据结构是计算机科学中非常重要的一个概念,它是指一组数据的组织方式,以及对这组数据进行操作的方法。
数据结构可以分为线性结构和非线性结构两种。
下面将对常见的数据结构进行总结,希望能对读者有所帮助。
一、线性结构1. 数组:数组是一种最基本的数据结构,它可以存储一组具有相同类型的数据。
数组的访问时间复杂度为O(1),但插入和删除的时间复杂度较高,为O(n)。
2. 链表:链表是由一系列的节点组成,每个节点包含数据以及指向下一个节点的指针。
链表的访问时间复杂度为O(n),但插入和删除的时间复杂度较低,为O(1)。
3. 栈:栈是一种具有后进先出(LIFO)特点的数据结构,只能在栈顶进行插入和删除操作。
栈的访问、插入、删除的时间复杂度均为O(1)。
4. 队列:队列是一种具有先进先出(FIFO)特点的数据结构,只能在队尾插入元素,在队头删除元素。
队列的访问、插入、删除的时间复杂度均为O(1)。
5. 双向链表:双向链表是在链表的基础上发展而来的数据结构,每个节点不仅包含指向下一个节点的指针,还包含指向上一个节点的指针。
双向链表的插入和删除操作时间复杂度为O(1)。
二、非线性结构1. 树:树是一种由节点和边组成的数据结构,每个节点可以有多个子节点。
树有很多种类型,如二叉树、AVL树、红黑树等。
树的遍历可以分为前序遍历、中序遍历、后序遍历和层序遍历等。
2. 图:图是一种由顶点和边组成的数据结构,每个顶点可以与其他顶点相连。
图可以分为有向图和无向图,常用的应用场景有社交网络和地图导航等。
图的遍历可以分为深度优先搜索和广度优先搜索等算法。
3. 堆:堆是一种特殊的树结构,具有以下特点:每个节点的值都大于等于(或小于等于)其子节点的值,且左子树和右子树都是堆。
堆常用来实现优先队列,常见的堆有二叉堆和斐波那契堆。
4. 哈希表:哈希表是一种根据关键码值(Key value)而直接进行访问的数据结构,通过将关键码值映射到表中的某个位置来实现访问的。
数据结构大纲知识点一、绪论。
1. 数据结构的基本概念。
- 数据、数据元素、数据项。
- 数据结构的定义(逻辑结构、存储结构、数据的运算)- 数据结构的三要素之间的关系。
2. 算法的基本概念。
- 算法的定义、特性(有穷性、确定性、可行性、输入、输出)- 算法的评价指标(时间复杂度、空间复杂度的计算方法)二、线性表。
1. 线性表的定义和基本操作。
- 线性表的逻辑结构特点(线性关系)- 线性表的基本操作(如初始化、插入、删除、查找等操作的定义)2. 顺序存储结构。
- 顺序表的定义(用数组实现线性表)- 顺序表的基本操作实现(插入、删除操作的时间复杂度分析)- 顺序表的优缺点。
3. 链式存储结构。
- 单链表的定义(结点结构,头指针、头结点的概念)- 单链表的基本操作实现(建立单链表、插入、删除、查找等操作的代码实现及时间复杂度分析)- 循环链表(与单链表的区别,操作特点)- 双向链表(结点结构,基本操作的实现及特点)三、栈和队列。
1. 栈。
- 栈的定义(后进先出的线性表)- 栈的基本操作(入栈、出栈、取栈顶元素等操作的定义)- 顺序栈的实现(存储结构,基本操作的代码实现)- 链栈的实现(与单链表的联系,基本操作的实现)- 栈的应用(表达式求值、函数调用栈等)2. 队列。
- 队列的定义(先进先出的线性表)- 队列的基本操作(入队、出队、取队头元素等操作的定义)- 顺序队列(存在的问题,如假溢出)- 循环队列的实现(存储结构,基本操作的代码实现,队空和队满的判断条件)- 链队列的实现(结点结构,基本操作的实现)- 队列的应用(如操作系统中的进程调度等)四、串。
1. 串的定义和基本操作。
- 串的概念(字符序列)- 串的基本操作(如连接、求子串、比较等操作的定义)2. 串的存储结构。
- 顺序存储结构(定长顺序存储和堆分配存储)- 链式存储结构(块链存储结构)3. 串的模式匹配算法。
- 简单的模式匹配算法(Brute - Force算法)的实现及时间复杂度分析。
复习提纲第一章数据构造概述根本概念与术语〔P3〕1.数据构造是一门研究非数值计算程序设计问题中计算机的操作对象以及他们之间的关系和操作的学科.2.数据是用来描述现实世界的数字,字符,图像,声音,以及能够输入到计算机中并能被计算机识别的符号的集合2.数据元素是数据的根本单位3.数据对象一样性质的数据元素的集合4.数据构造三方面容:数据的逻辑构造.数据的存储构造.数据的操作.〔1〕数据的逻辑构造指数据元素之间固有的逻辑关系.〔2〕数据的存储构造指数据元素及其关系在计算机的表示( 3 ) 数据的操作指在数据逻辑构造上定义的操作算法,如插入,删除等.5.时间复杂度分析--------------------------------------------------------------------------------------------------------------------1、名词解释:数据构造、二元组2、根据数据元素之间关系的不同,数据的逻辑构造可以分为集合、线性构造、树形构造和图状构造四种类型。
3、常见的数据存储构造一般有四种类型,它们分别是___顺序存储构造_____、___链式存储构造_____、___索引存储构造_____和___散列存储构造_____。
4、以下程序段的时间复杂度为___O(N2)_____。
int i,j,*;for(i=0;i<n:i++) n+1for(j=0;j<n;j++) n+1*+=i;------------------------------------------------------------------------------------------------------------------第二章线性表1.顺序表构造由n(n>=0)个具有一样性质的数据元素a1,a2,a3……,an组成的有穷序列//顺序表构造#define MA*SIZE 100typedef int DataType;Typedef struct{DataType items[MA*SIZE];Int length;}Sqlist,*LinkList;2.单链表(1)链表结点构造//链表的节点构造Typedef struct Node{int data;struct Node *ne*t;} Lnode,*Pnode,*LinkList;(2)结点遍历void TraverseList(LinkList t){LinkList p;while(t){p=t;t=t->ne*tfree(p);}}(3)链表操作算法:初始化、插入、输出、删除void InitList(LinkList *h){*h=(LinkList)malloc(sizeof(LNode));if(!h){print("初始化错误〞);return;}(*h)->ne*t=NULL;}void InsertList(LinkList h,int pos,datatype *){ LinkList p=h,q;int i=0;while(p&&i<pos-1){p=p->ne*t;i++;}if(!p||i>pos-1)print("插入位置出错!!〞);InitList(&q);q->ne*t=NULL;q->data=*;}void DeleteList(LinkList h,int pos){LinkList p=h,q;int i=0;while(p&&i<pos-1){p=p->ne*t;i++;}if(!p||i>pos-1){cout<<〞删除位置错误〞;return;}q=p->ne*t;p->ne*t=q->ne*t;free(q);}-----------------------------------------------------------------------------------------------------------------1、线性表中,第一个元素没有直接前驱,最后一个元素没有直接后驱。
数据结构知识点概括第一章概论数据就是指能够被计算机识别、存储和加工处理的信息的载体。
数据元素是数据的基本单位,可以由若干个数据项组成。
数据项是具有独立含义的最小标识单位。
数据结构的定义:·逻辑结构:从逻辑结构上描述数据,独立于计算机。
·线性结构:一对一关系。
·线性结构:多对多关系。
·存储结构:是逻辑结构用计算机语言的实现。
·顺序存储结构:如数组。
·链式存储结构:如链表。
·索引存储结构:·稠密索引:每个结点都有索引项。
·稀疏索引:每组结点都有索引项。
·散列存储结构:如散列表。
·数据运算。
·对数据的操作。
定义在逻辑结构上,每种逻辑结构都有一个运算集合。
·常用的有:检索、插入、删除、更新、排序。
数据类型:是一个值的集合以及在这些值上定义的一组操作的总称。
·结构类型:由用户借助于描述机制定义,是导出类型。
抽象数据类型ADT:·是抽象数据的组织和与之的操作。
相当于在概念层上描述问题。
·优点是将数据和操作封装在一起实现了信息隐藏。
程序设计的实质是对实际问题选择一种好的数据结构,设计一个好的算法。
算法取决于数据结构。
算法是一个良定义的计算过程,以一个或多个值输入,并以一个或多个值输出。
评价算法的好坏的因素:·算法是正确的;·执行算法的时间;·执行算法的存储空间(主要是辅助存储空间);·算法易于理解、编码、调试。
时间复杂度:是某个算法的时间耗费,它是该算法所求解问题规模n的函数。
渐近时间复杂度:是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。
评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度。
算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。
时间复杂度按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、……k次方阶O(n^k)、指数阶O(2^n)。
第1章绪论1.1 数据结构的基本概念数据元是数据的基本单位,一个数据元素可由若干个数据项完成,数据项是构成数据元素的不可分割的最小单位。
例如,学生记录就是一个数据元素,它由学号、姓名、性别等数据项组成。
数据对象是具有相同性质的数据元素的集合,是数据的一个子集。
数据类型是一个值的集合和定义在此集合上一组操作的总称。
•原子类型:其值不可再分的数据类型•结构类型:其值可以再分解为若干成分(分量)的数据类型•抽象数据类型:抽象数据组织和与之相关的操作抽象数据类型(ADT)是指一个数学模型以及定义在该模型上的一组操作。
抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。
通常用(数据对象、数据关系、基本操作集)这样的三元组来表示。
#关键词:数据,数据元素,数据对象,数据类型,数据结构数据结构的三要素:1.逻辑结构是指数据元素之间的逻辑关系,即从逻辑关系上描述数据,独立于计算机。
分为线性结构和非线性结构,线性表、栈、队列属于线性结构,树、图、集合属于非线性结构。
2.存储结构是指数据结构在计算机中的表示(又称映像),也称物理结构,包括数据元素的表示和关系的表示,依赖于计算机语言,分为顺序存储(随机存取)、链式存储(无碎片)、索引存储(检索速度快)、散列存储(检索、增加、删除快)。
3.数据的运算:包括运算的定义和实现。
运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤。
1.2 算法和算法评价算法是对特定问题求解步骤的一种描述,有五个特性:有穷性、确定性、可行性、输入、输出。
一个算法有零个或多个的输入,有一个或多个的输出。
时间复杂度是指该语句在算法中被重复执行的次数,不仅依赖于问题的规模n,也取决于待输入数据的性质。
一般指最坏情况下的时间复杂度。
空间复杂度定义为该算法所耗费的存储空间。
算法原地工作是指算法所需辅助空间是常量,即O(1)。
第2章线性表2.1 线性表的定义和基本操作线性表是具有相同数据类型的n个数据元素的有限序列。
数据结构知识点总结数据结构知识点总结1.数组●定义:一组相同类型的数据元素连续存储在内存中。
●特点:快速访问任意元素,但不适用于频繁的插入和删除操作。
●常见操作:访问、插入、删除、查找、排序。
2.链表●定义:由节点组成的数据结构,每个节点包含数据和指向下一个节点的指针。
●特点:插入和删除效率高,但访问元素需要遍历整个链表。
●常见类型:单向链表、双向链表、循环链表。
●常见操作:插入、删除、查找、反转、合并。
3.栈●定义:先进后出的数据结构。
●特点:只允许在栈顶进行插入和删除操作。
●常见操作:入栈、出栈、获取栈顶元素、判断栈是否为空。
4.队列●定义:先进先出的数据结构。
●特点:只允许在队尾插入元素,在队头删除元素。
●常见类型:普通队列、优先队列、双端队列。
●常见操作:入队、出队、获取队头元素、获取队列长度。
5.树●定义:由节点和边组成的非线性数据结构。
●特点:每个节点最多有一个父节点和多个子节点。
●常见类型:二叉树、二叉搜索树、平衡二叉树、红黑树、B 树。
●常见操作:插入、删除、查找、遍历。
6.图●定义:由节点和边组成的非线性数据结构。
●特点:节点之间可以有多个连接,形成复杂的关系。
●常见类型:有向图、无向图、加权图、稀疏图、稠密图。
●常见操作:插入节点、插入边、删除节点、删除边、遍历。
7.哈希表●定义:根据关键码值直接进行访问的数据结构。
●特点:通过哈希函数将关键码值映射到地质,快速查找元素。
●常见操作:插入、删除、查找、冲突解决。
8.堆●定义:一种完全二叉树的数据结构。
●特点:父节点的值总是大于或小于(最大堆、最小堆)它的子节点。
●常见操作:插入、删除、堆化、合并。
附件:暂无附件。
法律名词及注释:●数据结构:在法律范畴中,是指对数据进行存储和组织的方法和规则。
●数组:在法律范畴中,是指一种数据结构,被视为可进行相关操作的一种基本单位。
●链表:在法律范畴中,是指一种数据结构,可视为单个操作的集合。
数据结构知识点总结一、数据结构基础概念数据结构是指数据元素之间的关系,以及对数据元素进行操作的方法的总称。
数据结构是计算机科学中非常基础的概念,它为计算机程序的设计和实现提供了基础架构。
数据结构的研究内容包括数据的逻辑结构、数据的存储结构以及对数据进行操作的算法。
1.1 数据结构的分类数据结构可以根据数据的逻辑关系和数据的物理存储方式进行分类,常见的数据结构分类包括线性结构、树形结构、图结构等。
1.2 数据结构的基本概念(1)数据元素:数据结构中的基本单位,可以是原子类型或者复合类型。
(2)数据项:数据元素中的一个组成部分,通常是基本类型。
(3)数据结构的逻辑结构:指数据元素之间的逻辑关系,包括线性结构、树形结构、图结构等。
(4)数据结构的存储结构:指数据元素在计算机内存中的存储方式,包括顺序存储结构和链式存储结构等。
1.3 数据结构的特点数据结构具有以下几个特点:(1)抽象性:数据结构是对现实世界中的数据进行抽象和模型化的结果。
(2)实用性:数据结构是在解决实际问题中得出的经验总结,是具有广泛应用价值的。
(3)形式化:数据结构具有精确的数学定义和描述,可以进行分析和证明。
(4)计算性:数据结构是为了使计算机程序更加高效而存在的。
二、线性结构线性结构是数据元素之间存在一对一的关系,是一种最简单的数据结构。
常见的线性结构包括数组、链表、栈和队列等。
2.1 线性表线性表是数据元素之间存在一对一的关系的数据结构,可以采用顺序存储结构或者链式存储结构实现。
(1)顺序存储结构:线性表采用数组的方式进行存储,数据元素在内存中连续存储。
(2)链式存储结构:线性表采用链表的方式进行存储,数据元素在内存中非连续存储,通过指针将它们进行连接。
2.2 栈栈是一种特殊的线性表,只允许在一端进行插入和删除操作,这一端称为栈顶。
栈的操作遵循后进先出(LIFO)的原则。
2.3 队列队列也是一种特殊的线性表,允许在一端进行插入操作,另一端进行删除操作,这两端分别称为队尾和队首。
第1章绪论内容提要:◆数据结构研究的内容。
针对非数值计算的程序设计问题,研究计算机的操作对象以及它们之间的关系和操作。
数据结构涵盖的内容:◆基本概念:数据、数据元素、数据对象、数据结构、数据类型、抽象数据类型。
数据——所有能被计算机识别、存储和处理的符号的集合。
数据元素——是数据的基本单位,具有完整确定的实际意义。
数据对象——具有相同性质的数据元素的集合,是数据的一个子集。
数据结构——是相互之间存在一种或多种特定关系的数据元素的集合,表示为:Data_Structure=(D, R)数据类型——是一个值的集合和定义在该值上的一组操作的总称。
抽象数据类型——由用户定义的一个数学模型与定义在该模型上的一组操作,它由基本的数据类型构成。
◆算法的定义及五个特征。
算法——是对特定问题求解步骤的一种描述,它是指令的有限序列,是一系列输入转换为输出的计算步骤。
算法的基本特性:输入、输出、有穷性、确定性、可行性◆算法设计要求。
①正确性、②可读性、③健壮性、④效率与低存储量需求◆算法分析。
时间复杂度、空间复杂度、稳定性学习重点:◆数据结构的“三要素”:逻辑结构、物理(存储)结构及在这种结构上所定义的操作(运算)。
◆用计算语句频度来估算算法的时间复杂度。
第二章线性表内容提要:◆线性表的逻辑结构定义,对线性表定义的操作。
线性表的定义:用数据元素的有限序列表示◆线性表的存储结构:顺序存储结构和链式存储结构。
顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。
链式存储结构: 其结点在存储器中的位置是随意的,即逻辑上相邻的数据元素在物理上不一定相邻。
通过指针来实现!◆线性表的操作在两种存储结构中的实现。
数据结构的基本运算:修改、插入、删除、查找、排序1)修改——通过数组的下标便可访问某个特定元素并修改之。
核心语句:V[i]=x;顺序表修改操作的时间效率是O(1)2) 插入——在线性表的第i个位置前插入一个元素实现步骤:①将第n至第i 位的元素向后移动一个位置;②将要插入的元素写到第i个位置;③表长加1。
数据结构知识点归纳数据结构知识点归纳1、线性表1.1 数组- 定义:一种连续存储数据的结构,数据在内存中占据一段连续的地质空间。
- 特点:支持随机访问,插入和删除操作效率较低。
- 使用场景:适用于读取频繁,插入和删除较少的情况。
1.2 链表- 定义:一种非连续存储数据的结构,数据在内存中的位置可以是任意的。
- 特点:插入和删除操作效率较高,但访问某个元素需要遍历链表。
- 使用场景:适用于插入和删除频繁,读取较少的情况。
2、栈和队列2.1 栈- 定义:一种先进后出(FILO)的数据结构。
- 特点:只能在栈顶进行插入和删除操作。
- 使用场景:适用于需要记录操作历史、递归等应用场景。
2.2 队列- 定义:一种先进先出(FIFO)的数据结构。
- 特点:只能在队尾插入,在队首删除。
- 使用场景:适用于任务调度、消息处理等应用场景。
3、树3.1 二叉树- 定义:每个节点最多只有两个子节点的树结构。
- 特点:可以快速搜索、插入和删除数据。
- 使用场景:适用于需要快速查找数据的情况。
3.2 平衡二叉树- 定义:左右子树的高度差不超过1的二叉树。
- 特点:可以提高二叉树的操作效率。
- 使用场景:适用于需要频繁插入和删除数据的情况。
3.3 B树- 定义:多路平衡查找树。
- 特点:适用于大规模数据存储和高效查找的场景。
- 使用场景:适用于数据库索引和文件系统的实现。
4、图4.1 有向图- 定义:边有方向的图结构。
- 特点:可以表示有向关系和依赖关系。
- 使用场景:适用于拓扑排序、关系网络等问题。
4.2 无向图- 定义:边无方向的图结构。
- 特点:可以表示无向关系和社交网络。
- 使用场景:适用于最短路径、连通性等问题。
附件:无法律名词及注释:无。
数据结构全书知识梳理总结第一章绪论数据就是指能够被计算机识别、存储和加工处理的信息的载体。
数据元素是数据的基本单位,有时一个数据元素可以由若干个数据项组成。
数据项是具有独立含义的最小标识单位。
如整数这个集合中,10 这个数就可称是一个数据元素.又比如在一个数据库(关系式数据库)中,一个记录可称为一个数据元素,而这个元素中的某一字段就是一个数据项。
数据结构的定义包括以下三方面内容:逻辑结构、存储结构、和对数据的操作。
数据的逻辑结构分为:线性结构、树形结构、复杂结构数据的存储结构分为:顺序表示、链接表示、散列表示、索引表示时间复杂度和渐近时间复杂度:前者是某个算法的时间耗费,它是该算法所求解问题规模n 的函数,而后者是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。
当我们评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度,因此,在算法分析时,往往对两者不予区分,经常是将渐近时间复杂度T(n)=O(f(n))简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度。
算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。
但是我们总是考虑在最坏的情况下的时间复杂度。
以保证算法的运行时间不会比它更长。
第二章线性表线性表的逻辑结构特征是很容易理解的,如其名,它的逻辑结构特征就好象是一条线,上面打了一个个结,很形象的,如果这条线上面有结,那么它就是非空表,只能有一个开始结点,有且只能有一个终端结点,其它的结前后所相邻的也只能是一个结点(直接前趋和直接后继)。
关于线性表上定义的基本运算,主要有构造空表、求表长、取结点、查找、插入、删除等。
线性表的逻辑结构和存储结构之间的关系。
在计算机中,如何把线性表的结点存放到存储单元中,就有许多方法,最简单的方法就是按顺序存储。
就是按线性表的逻辑结构次序依次存放在一组地址连续的存储单元中。
在存储单元中的各元素的物理位置和逻辑结构中各结点相邻关系是一致的。
在顺序表中实现的基本运算主要讨论了插入和删除两种运算。
对于顺序表的插入和删除运算,其平均时间复杂度均为O(n)。
线性表的链式存储结构。
它与顺序表不同,链表是用一组任意的存储单元来存放线性表的结点,这组存储单元可以分布在内存中任何位置上。
因此,链表中结点的逻辑次序和物理次序不一定相同。
所以为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还存储了其后继结点的地址信息(即指针或链)。
这两部分信息组成链表中的结点结构。
对于单链表,其操作运算主要有建立单链表(头插法、尾插法和在链表开始结点前附加一个头结点的算法)、查找(按序号和按值)、插入运算、删除运算等。
以上各运算的平均时间复杂度均为O(n).其主要时间是耗费在查找操作上。
循环链表是一种首尾相接的链表。
也就是终端结点的指针域不是指向NULL空而是指向开始结点(也可设置一个头结点),形成一个环。
采用循环链表在实用中多采用尾指针表示单循环链表。
这样做的好处是查找头指针和尾指针的时间都是O(1),不用遍历整个链表了。
判别链表终止的条件也不同于单链表,它是以指针是否等于某一指定指针如头指针或尾指针来确定。
双链表就是双向链表,就是在单链表的每个结点里再增加一个指向其直接前趋的指针域prior,这样形成的链表就有两条不同方向的链。
使得从已知结点查找其直接前趋结点可以和查找其直接后继结点的时间一样缩短为O(1)。
双链表一般也由头指针head惟一确定。
双链表也可以头尾相链接构成双(向)循环链表。
顺序表和链表的比较具体要求顺序表链表基于空间适于线性表长度变化不大,易于事先确定其大小时采用。
适于当线性表长度变化大,难以估计其存储规模时采用。
基于时间由于顺序表是一种随机存储结构,当线性表的操作主要是查找时,宜采用。
链表中对任何位置进行插入和删除都只需修改指针,所以这类操作为主的线性表宜采用链表做存储结构。
若插入和删除主要发生在表的首尾两端,则宜采用尾指针表示的单循环链表。
第三章字符串串就是字符串,是一种特殊的线性表,它的每个结点仅由一个字符组成。
空串:是指长度为零的串,也就是串中不包含任何字符(结点)。
空白串:指串中包含一个或多个空格字符的串。
不同与空串,它的结点就是一个空格字符。
在一个串中任意个连续字符组成的子序列称为该串的子串,包含子串的串就称为主串。
子串在主串中的序号就是指子串在主串中首次出现的位置。
如A="I love you",B="love",则B在A 中的序号为3,注意空格也是字符。
空串是任意串的子串,任意串是他自身的子串。
串是特殊的线性表(结点是字符),所以串的存储结构与线性表的存储结构类似。
串的顺序存储结构简称为顺序串,顺序串又可按存储分配的不同分为静态存储分配的顺序串和动态存储分配的顺序串。
静态的意思可简单地理解为一个确定的存储空间,它的长度是不可变的。
如直接使用定长的字符数组来定义一个串。
它的优点是涉及串长的操作速度快,因为它的最大长度是不变的。
动态存储分配就是在定义串时不分配存储空间,直到需要使用时按所需串的长度分配存储单元给它,并且在运行中还可以根据需要变化串的长度,这就是动态分配。
不过这样的串仍是顺序存储的,也就是说指针指向串的首地址,后面的结点是连续存储的。
串的链式存储就是用单链表的方式存储串值,串的这种链式存储结构简称为链串。
链串与单链表的差异只是它的结点数据域为单个字符。
这种存储结构方便于串的插入和删除操作,但是空间利用率不高,因为存放每一个字符要"搭配"一个指向下一字符的地址,而地址所占空间是比较大的。
为了解决这种"存储密度"过低的状况,可以让一个结点存储多个字符,事实上这是顺序串和链串的综合(折衷)。
子串定位运算又称串的"模式匹配"或"串匹配",就是在主串中查找出子串出现的位置,这在应用中非常广泛,比如文本编辑中的"查找和替换"用到的就是子串定位运算的算法。
第四章栈与队列栈的逻辑结构和我们先前学过的线性表相同,如果它是非空的,则有且只有一个开始结点,有且只能有一个终端结点,其它的结点前后所相邻的也只能是一个结点(直接前趋和直接后继),但是栈的运算规则与线性表相比有更多的限制,栈(Stack)是仅限制在表的一端进行插入和删除运算的线性表,通常称插入、删除这一端为栈顶,另一端称为栈底。
表中无元素时为空栈。
栈的修改是按后进先出的原则进行的,我们又称栈为LIFO表(Last In First Out).栈的基本运算有六种:构造空栈:InitStack(S)、判栈空: StackEmpty(S)、判栈满:StackFull(S)、进栈:Push(S,x)、可形象地理解为压入,这时栈中会多一个元素退栈:Pop(S) 、可形象地理解为弹出,弹出后栈中就无此元素了。
取栈顶元素:StackTop(S),不同与弹出,只是使用栈顶元素的值,该元素仍在栈顶不会改变。
由于栈也是线性表,因此线性表的存储结构对栈也适用,通常栈有顺序栈和链栈两种存储结构,这两种存储结构的不同,则使得实现栈的基本运算的算法也有所不同。
队列也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的一端进行(只进不出),而删除只能在表的另一端进行(只出不进),允许删除的一端称为队尾(rear),允许插入的一端称为队头(Front) ,队列的操作原则是先进先出的,所以队列又称作FIFO 表(First In First Out)队列的基本运算也有六种:置空队:InitQueue(Q)判队空:QueueEmpty(Q)判队满:QueueFull(Q)入队:EnQueue(Q,x)出队:DeQueue(Q)取队头元素:QueueFront(Q),不同与出队,队头元素仍然保留队列也有顺序存储和链式存储两种存储结构,前者称顺序队列,后者为链队。
为了克服空间浪费,我们引入循环向量的概念,就好比是把向量空间弯起来,形成一个头尾相接的环形,这样,当存于其中的队列头尾指针移到向量空间的上界(尾部)时,再加1 的操作(入队或出队)就使指针指向向量的下界,也就是从头开始。
这时的队列就称循环队列。
通常我们应用的大都是循环队列。
由于循环的原因,光看头尾指针重叠在一起我们并不能判断队列是空的还是满的,这时就需要处理一些边界条件,以区别队列是空还是满。
方法至少有三种,一种是另设一个布尔变量来判断(就是请别人看着,是空还是满由他说了算),第二种是少用一个元素空间,当入队时,先测试入队后尾指针是不是会等于头指针,如果相等就算队已满,不许入队。
第三种就是用一个计数器记录队列中的元素的总数,这样就可以随时知道队列的长度了,只要队列中的元素个数等于向量空间的长度,就是队满。
队列的链式存储结构称为链队列,一个链队列就是一个操作受限的单链表。
为了便于在表尾进行插入(入队)的操作,在表尾增加一个尾指针,一个链队列就由一个头指针和一个尾指针唯一地确定。
链队列不存在队满和上溢的问题。
在链队列的出队算法中,要注意当原队中只有一个结点时,出队后要同进修改头尾指针并使队列变空。
第五章二叉树与树树的逻辑结构特征是:树中任一结点都可以有零个或多个直接后继(孩子)结点,但至多只能有一个直接前趋(双亲)结点。
树形结构是非线性结构。
二叉树的定义:二叉树是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的分别称作这个根的左子树和右子树的二叉树组成。
一般二叉树的3个重要性质:第i层至多有2i个结点高度为k 的二叉树中,最多有2 k+1-1 个结点叶子数=度2 结点数-1二叉树的顺序存储结构就是把二叉树的所有结点按照一定次序(从根结点起,从上层到下层,从左往右编号就得到了存放的次序)存储到一片连续的存储单元中用顺序存储方式对于完全二叉树而言其结构简单又节省空间,但是对于一般二叉树并不合适。
因此树的存储结构更多的是用链式存储。
结点的结构为两个指针域lchild和rchild 分别指向该结点的左孩子和右孩子,另有一个数据域data 存放结点数据。
把所有二叉树的结点,加上一个指向根结点的指针就构成了二叉树的链式存储结构,称为二叉链表。
它就是由根指针root唯一确定的。
根据访问结点的次序不同可得三种遍历:先序遍历(前序遍历或先根遍历),中序遍历(或中根遍历)、后序遍历(或后根遍历)。
遍历的算法就是一个递归算法,以中序遍历为例,它的定义为若二叉树非空,则依次执行如下操作:(1) 遍历左子树;(2) 访问根结点;(3) 遍历右子树。
将(1)(2)对调则得先序遍历,将(2)(3)对调则得后序遍历。
利用二叉链表中的n+1 个空指针域来存放指向某种遍历次序下的前趋结点和后继结点的指针,这些附加的指针就称为"线索",加上线索的二叉链表就称为线索链表。