数据结构期末复习资料.docx
《数据结构期末复习资料.docx》由会员分享,可在线阅读,更多相关《数据结构期末复习资料.docx(30页珍藏版)》请在冰豆网上搜索。
数据结构期末复习资料
第一章
1、数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科。
数据结构(DataStructure):
相互之间存在一种或多种特定关系的数据元素的集合。
2、数据结构的形式定义:
二元组Data_Structure=(D,S)其中,D是数据元素的有限集,S是D上关系的有限集。
3、数据元素之间关系的映像:
1、顺序映像(顺序存储结构):
以相对的存储位置表示后继关系。
2、非顺序映像(链式存储结构):
借助指针元素存储地址的指针表示数据元素之间的逻辑关系。
任何一个算法的设计取决于数据(逻辑)结构,其实现取决于物理结构。
4、算法的定义:
对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。
特性:
有穷性、确定性、可行性、输入、输出
5、算法的评价——衡量算法优劣的标准
正确性(correctness):
满足具体问题的需求
可读性(readability):
易读、易理解
健壮性(robustness):
当输入数据非法时,算法能够做出反应或进行处理
效率与低存储量:
执行时间短、存储空间小
作业的答案:
试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。
第二章
1、线性表是一种最简单的线性结构。
线性结构是一个数据元素的有序(次序)关系
特点:
存在唯一的一个“第一个”的数据元素;存在唯一的一个“最后一个”的数据元素;除第一个数据元素外,均有唯一的前驱;除最后一个数据元素外,均有唯一的后继
2、线性表类型的实现——顺序映像定义:
用一组地址连续的存储单元依次存放线性表中的数据元素。
⏹以“存储位置相邻”表示有序对,则有:
LOC(ai)=LOC(ai-1)+l其中l是一个数据元素所占存储量
LOC(ai)=LOC(a1)+(i-1)×l
⏹特点:
1、实现逻辑上相邻—物理地址相邻2、实现随机存取
3、若假定在线性表中任何一个位置上进行插入的概率都是相等的,则移动元素的期望值为:
若假定在线性表中任何一个位置上进行删除的概率都是相等的,则移动元素的期望值为:
4、线性表类型的实现——链式映像线性链表特点:
用一组地址任意的存储单元存放线性表中的数据元素。
5、在单链表中第i个结点之前进行插入的基本操作为:
找到线性表中第i-1个结点,然后修改其指向后继的指针。
s=(LinkList)malloc(sizeof(LNode));//生成新结点
s->data=e;s->next=p->next;p->next=s;//插入
在单链表中删除第i个结点的基本操作为:
找到线性表中第i-1个结点,修改其指向后继的指针。
q=p->next;p->next=q->next;e=q->data;free(q);
5、循环链表:
最后一个结点的指针域的指针又指回第一个结点的链表。
和单链表的差别仅在于:
判别链表中最后一个结点的条件不再是“后继是否为空”,而是“后继是否为头结点”。
6、双向链表的操作特点:
1、“查询”和单链表相同;2、“插入”和“删除”时需要同时修改两个方向上的指针
“插入”:
s->next=p->next;p->next=s;s->next->prior=s;s->prior=p;(s是插入的结点)
删除:
p->next=p->next->next;p->next->prior=p;(要删除的是p的下一个结点)
课后作业
P13:
2.3、2.5
P15:
2.8、2.9
(2)
第三章
1、栈、队列的特点:
☐从数据元素间的逻辑关系看是线性表
☐从操作方式与种类看不同于线性表:
栈与队列是操作受限的线性表
2、栈的基本概念栈---是限制仅在线性表的一端进行插入和删除运算的线性表。
栈顶(TOP)--允许插入和删除的一端。
栈底(bottom)--不允许插入和删除的一端。
空栈--表中没有元素。
栈--又称为后进先出的线性表
3、栈中元素的特性:
1、具有线性关系2、后进先出
4、栈的进栈出栈规则:
a)按序进栈:
有n个元素1,2,…,n,它们按1,2,…,n的次序进栈(i进栈时,1~(i-1)应该已经进栈);
b)栈顶出栈:
栈底最后出栈;
c)时进时出:
元素未完全进栈时,即可出栈。
5、栈的表示与实现
顺序栈即栈的顺序存储结构:
一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。
1、附设一个栈底指针base,总是指向栈底。
2、附设一个栈顶指针top。
空栈时,top=base;非空栈时,总是指向栈顶元素+1的位置。
☐插入一个栈顶元素,指针top增1;
☐删除一个栈顶元素,指针top减1;
☐非空栈中的栈顶指针始终在栈顶元素的下一个位置上
链栈:
注意:
链栈中指针的方向指向前驱结点!
6、队列
⏹队列:
只允许在表的一端进行插入,而在表的另一端进行删除的线性表。
☐队尾(rear)——允许插入的一端
☐队头(front)——允许删除的一端
⏹队列特点:
先进先出(FIFO)
7、队列类型的实现
⏹链队列——队列的链式表示和实现
⏹顺序队列——队列的顺序表示和实现用一组连续的存储单元依次存放队列中的元素
8、顺序队列运算时的头、尾指针变化
设两个指针front,rear,约定:
rear指示队尾元素;front指示队头元素前一位置初值front=rear=0
空队列条件:
Q.front==Q.rear
队列满:
Q.rear-Q.front=m
入队列:
Q.base[rear++]=x;
出队列:
x=Q.base[++front];
存在问题:
设数组维数为M,则:
⏹当rear-front=m时,再有元素入队发生溢出——真溢出
⏹当rear已指向队尾,但队列前端仍有空位置时,再有元素入队发生溢出——假溢出!
9、循环队列:
将数组首尾相接(即:
base[0]连在base[m-1]之后)。
入/出队列运算
利用“模运算”,则:
Ø入队:
Q.rear=(Q.rear+1)%m
Ø出队:
Q.front=(Q.front+1)%m
队满和队空判断条件:
少用一个元素空间:
队空:
Q.rear=(Q.front)
队满:
(Q.rear+1)%m=Q.front
10、栈和队列是限定插入和删除只能在表的“端点”进行的线性表。
a)栈具有“后进先出”的特性;
b)队列具有“先进先出”的特性。
11、栈的链式存储不需头结点。
课后作业
1.用栈结构计算中缀式2+(4-3)*6,画出计算过程栈的结构。
2.简述以下算法的功能(栈和队列的元素类型均为int)
voidalgo3(Queue&Q){
StackS;intd;
InitStack(S);
while(!
QueueEmpty(Q)){
DeQueue(Q,d);Push(S,d);
}
while(!
StackEmpty(S)){
Pop(S,d);EnQueue(Q,d);
}
}
第四章
一、1、串的基本概念
⏹串---由零个或多个字符组成的有限序列,一般记为:
s='a1a2...an'(n≥0)
⏹串中字符的个数n称为串的长度;零个字符,即长度为零的串称为空串,用或''表示。
空串不等于空格串,空格串:
由一个或多个空格组成的串
子串:
串中任意个连续的字符组成的子序列
主串:
包含子串的串相应地称为主串
相等:
两个串的长度相等,并且对应位置的字符都相同。
2、串结构与线性表结构的比较:
逻辑结构:
极为相似,区别仅在于串的数据对象约束为字符集。
基本操作:
有很大差别1、线性表大多以“单个元素”作为操作对象2、串通常以“串的整体”作为操作对象
3、串类型定义
4、串赋值StrAssign、串复制Strcopy、串比较StrCompare、求串长StrLength、串联接Concat以及求子串SubString等六种操作构成串类型的最小操作子集。
1、StrAssign(&T,chars)初始条件:
chars是字符串常量。
操作结果:
把chars赋为T的值。
等价于C语言中的strset函数
2、StrCopy(&T,S)初始条件:
串S存在。
操作结果:
由串S复制得串T。
等价于C语言中的strcpy函数
3、StrCompare(S,T)初始条件:
串S和T存在。
操作结果:
若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0。
等价于C语言中的strcmp函数(按ASCII码值进行大小比较)
4、StrLength(S)初始条件:
串S存在。
操作结果:
返回S的元素个数,称为串的长度。
等价于C语言中的strlen函数
5、Concat(&T,S1,S2)初始条件:
串S1和S2存在。
操作结果:
用T返回由S1和S2联接而成的新串。
例如:
Concate(T,man,kind)求得T=mankind等价于C语言中的strcat函数
6、SubString(&Sub,S,pos,len)初始条件:
串S存在,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1。
操作结果:
用Sub返回串S的第pos个字符起长度为len的子串。
子串为“串”中的一个字符子序列。
例如:
SubString(sub,'commander',4,3),求得sub='man';
SubString(sub,'commander',1,9),求得sub='commander';
SubString(sub,'commander',9,1),求得sub='r';
起始位置pos和子串长度len之间存在约束关系,pos+len<=StrLength(S)+1
SubString('student',5,0)=?
——长度为0的子串为“合法”串
5、Index(S,T,pos)初始条件:
串S和T存在,T是非空串,1≤pos≤StrLength(S)。
操作结果:
若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则函数值为0。
“子串在主串中的位置”指子串中的第一个字符在主串中的位序。
假设S=abcaabcaaabc,T=bcaIndex(S,T,1)=2Index(S,T,3)=6Index(S,T,8)=0
6、Replace(&S,T,V)初始条件:
串S,T和V均已存在,且T是非空串。
操作结果:
用V替换主串S中出现的所有与(模式串)T相等的不重叠的子串。
例如:
假设S=abcaabcaaabca,T=bca若V=x,则经置换后得到S=abcaabcaaabca
7、StrInsert(&S,pos,T)初始条件:
串S和T存在,1≤pos≤StrLength(S)+1。
操作结果:
在串S的第pos个字符之前插入串T
例如:
S='chater',T='rac',则执行StrInsert(S,4,T)之后得到S='character'
二、串的表示和实现
1、定长顺序存储表示:
用一组地址连续的存储单元存储串值的字符序列,称为顺序串。
可用一个数组来表示。
特点:
①串的实际长度可在这个预定义长度的范围内随意设定,超过预定义长度的串值则被舍去,称之为“截断”。
②按这种串的表示方法实现的串运算时,其基本操作为“字符序列的复制”
顺序存储结构中,串操作的基本操作为“字符序列的复制”,其时间复杂度基于复制的字符序列的长度。
2、堆分配存储表示:
特点:
仍以一组地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配而得的。
串操作实现的算法为:
先为新生成的串分配一个存储空间,然后进行串值的复制。
3、串的模式匹配算法
课堂练习
已知:
a=‘THIS’,f=‘ASAMPLE’,c=‘GOOD’,d=‘NE’,b=‘‘,
1、s=Concat(a,Concat(SubString(f,2,7),Concat(b,SubString(a,3,2)))),
2、t=Replace(f,SubString(f,3,6),c),
3、u=Concat(SubString(c,3,1),d),g=‘IS’,
4、v=Concat(s,Concat(b,Concat(t,Concat(b,u)))),
试问:
s,t,v,StrLength(s),Index(v,g),Index(u,g)各是什么?
1、‘THISSAMPLEIS’2、‘AGOOD’3、‘ONE’4、v=‘THISSAMPLEISAGOODONE’
课后作业
P28:
4.5(要求:
写出每一个函数执行后的结果)
1.已知:
s=‘(XYZ)+*’,t=‘(X+Z)*Y’。
试利用联接、求子串和置换等基本操作,将s转化为t。
SubString(&s1,s,3,1);'Y'
SubString(&s2,s,6,1);'+'
SubString(&s3,s,7,1);'*'
Replace(&s,s1,s2);'(X+Z)+*'
Concat(&s4,s3,s1);'*Y'
Concat(&t,SubString(&s5,s,1,5),s4);'(X+Z)*Y'
第五章
本章小结
⏹数组的两种存储映像方式:
☐行序为主
☐列序为主
⏹特殊矩阵的压缩存储,关键要确定下标之间的映射关系式。
⏹稀疏矩阵的三元组顺序表、行逻辑链接的顺序存储和十字链表存储,它们分别应用于矩阵的不同运算中。
要注意分析区别使用的场合。
⏹广义表的递归定义和存储结构。
1、数组---线性表的扩展,其表中的数据元素本身也是一个数据结构。
2、数组的顺序表示和实现
数组类型的特点:
①只有引用型操作,没有加工型操作(插入和删除),即不作插入和删除操作
②数组是多维的结构,而存储空间是一个一维的结构
有两种顺序映象的方式:
①以行序为主序(低下标优先)
二维数组A中任一元素ai,j的存储位置
LOC(i,j)=LOC(0,0)+(b2×i+j)×L其中LOC(0,0)称为基地址或基址
n维数组数据元素存储位置的映象关系:
LOC(j1,j2,...,jn)=LOC(0,0,...,0)+∑ciji其中cn=L,ci-1=bi×ci,1称式(5-2)为n维数组的映象函数。
数组元素的存储位置是其下标的线性函数。
例如:
设按低下标优先存储整数数组A9×3×5×8时,第一个元素的字节地址是100,每个整数占四个字节。
则LOC(a1111)=?
LOC(a3125)=?
解:
由题可知,b1=9,b2=3,b3=5,b4=8。
又L=4(字节),则
c4=4,c3=b4×c4=8×4=32,
c2=b3×c3=5×32=160,c1=b2×c2=3×160=480
LOC(a1111)=100+(480*1+160*1+32*1+4*1)=776
LOC(a3125)=100+(480*3+160*1+32*2+4*5)=1784
②以列序为主序(高下标优先)
3、矩阵的压缩存储
⑴特殊矩阵定义:
值相同的元素或者零元素在矩阵中的分布有一定规律的矩阵。
若n阶矩阵A中的元素满足下述性质:
aij=aji1≤i,j≤n则称为n阶对称矩阵。
存储方式:
以行序为主序存储矩阵的下三角(包括对角线)中的元。
存储空间:
n(n+1)/2
一维数组sa[n(n+1)/2]中元素sa[k]和矩阵元aij的对应关系:
⑵三角矩阵:
下(上)三角矩阵:
矩阵的上(下)三角(不包括对角线)中的元均为常数c或零的矩阵。
⑶对角矩阵:
所有的非零元素都集中在以主对角线为中心的带状区域中。
4、广义表的定义
广义表是递归定义的线性结构:
LS=(α1,α2,...,αn)
LS:
广义表的名称α1:
表头α2,...,αn:
表尾
αi可以是单个元素(原子),也可以是广义表(子表)
约定:
用大写字母表示广义表的名称,用小写字母表示原子。
例如:
A=()——长度为0;深度为1
F=(d,(e))——长度为2;深度为2
D=((a,(b,c)),F)——长度为2;深度为3
C=(A,D,F)——长度为3;深度为4
B=(a,B)=(a,(a,(a,...,)))——长度为2
广义表是一个多层次的线性结构:
⏹广义表的结构特点:
①广义表中的数据元素有相对次序;广义表的长度定义为最外层包含的元素个数;广义表的深度定义为所含括弧的重数;广义表可以共享;广义表可以是一个递归的表。
注意:
1.“原子”的深度为02.“空表”的深度为13.递归表的深度是无穷值,长度是有限值。
任何一个非空广义表LS=(α1,α2,…,αn)均可分解为:
表头:
Head(LS)=α1和表尾:
Tail(LS)=(α2,…,αn)两部分。
例如:
D=(E,F)=((a,(b,c)),F),则
Head(D)=ETail(D)=(F);Head(E)=aTail(E)=((b,c));Head(((b,c)))=(b,c)Tail(((b,c)))=();Head((b,c))=bTail((b,c))=(c);Head((c))=cTail((c))=()
5、广义表的存储结构:
通常采用头、尾指针的链表结构。
两种结构的结点:
表结点:
tag=1hptp用以表示列表原子结点:
tag=0data用以表示原子
构造存储结构的两种分析方法:
表头、表尾分析法:
空表ls=NIL若表头为原子,则为tag=0data
课堂练习
画出下列广义表的存储结构,并求出它的深度:
L=((()),a,((b,c),(),d),(((e))))
课后作业
1.给出广义表(a,(b),((),c,d))的存储结构。
第六章
本章小结
⏹二叉树的结构特性,各性质相应的证明方法。
⏹二叉树的各种存储结构的特点及适用范围。
⏹遍历二叉树是二叉树各种操作的基础,遍历的具体算法与所采用的存储结构有关。
⏹树和森林与二叉树的转换。
⏹最优二叉树的特性,掌握建立最优树和哈夫曼编码的方法。
-、树的定义
1、树型结构:
(非线性结构)至少存在一个数据元素有两个或两个以上的直接前驱(或直接后继)元素的数据结构。
树的定义:
是n(n≥0)个结点的有限集合T,对于任意一棵非空树,它满足:
有且仅有一个特定的称为根(root)的结点;当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,….,Tm,其中每个集合本身又是一棵树,称为根的子树。
上述树的定义是一个递归定义。
2、基本术语
结点:
包含一个数据元素及若干指向其子树的分支。
结点的度:
结点拥有的子树数。
叶子(或终端)结点:
度为零的结点。
分支(或非终端)结点:
度大于零的结点树的度:
树中所有结点的度的最大值结点的层次:
根结点的层次为1,第l层的结点的子树的根结点的层次为l+1。
树的深度:
树中叶子结点所在的最大层次。
任何一棵非空树是一个二元组Tree=(root,F)其中:
root被称为根结点F被称为子树森林
二、二叉树
1、二叉树的定义是n(n>=0)个结点的有限集合,它或为空树(n=0),或由一个根结点和至多两棵称为根的左子树和右子树的互不相交的二叉树组成。
注:
二叉树中不存在度大于2的结点,并且二叉树的子树有左子树和右子树之分。
2、二叉树的五种基本形态:
空树只含根结点右子树为空树左子树为空树左右子树均不为空树
3、二叉树的性质
性质1:
在二叉树的第i层上至多有2i-1个结点(i≥1)。
其中2i-1为2的i-1次方
性质2:
深度为k的二叉树上至多含2k-1个结点(k≥1)。
其中2k-1为2的k次方减一
性质3:
对任何一棵二叉树,若它含有n0个叶子结点、n2个度为2的结点,则必存在关系式:
n0=n2+1。
证明:
设二叉树上结点总数n=n0+n1+n2,∵二叉树上分支总数b=n1+2n2,①而b=n-1=n0+n1+n2–1②由①②,n0=n2+1。
除根结点外,其余结点都有一个分支进入,设b为分支总数,则n=b+1
性质4:
具有n个结点的完全二叉树的深度为log2n+1。
其中log2n为不大于log2n的最大整数
性质5:
若对含n个结点的完全二叉树从上到下且从左至右进行1至n的编号,则对完全二叉树中任意一个编号为i的结点:
(1)若i=1,则该结点是二叉树的根,无双亲,否则,编号为i/2的结点为其双亲结点;
(2)若2i>n,则该结点无左孩子,否则,编号为2i的结点为其左孩子结点;
(3)若2i+1>n,则该结点无右孩子结点,否则,编号为2i+1的结点为其右孩子结点。
4、两类特殊的二叉树:
满二叉树:
指的是深度为k且含有2k-1个结点的二叉树。
其中2k-1为2的k次方减一
特点:
是每一层上的结点数都是最大结点数。
完全二叉树:
树中所含的n个结点和满二叉树中编号为1至n的结点一一对应。
特点:
⑴叶子结点只可能在层次最大的两层出现;⑵对任一结点,若其右分支下的子孙的最大层次为l,则其左
分支下的子孙的最大层次为l或l+1。
⏹性质练习:
1.一棵二叉树在其第五层中有17个结点,可不可能?
第i层上至多有2i-1个结点,则25-1=16。
所以,不可能。
2.二叉树的根结点属于第0层还是属于第1层?
第1层
3.已知一棵二叉树有20个结点,其中6个结点为叶子,则该树中度为2的结点数为5?
度为0的结点为6?
由性质3:
n0=n2+1,则n2=n0-1=6-1=5。
4.已知一棵完全二叉树中编号为101的结点有LC和RC结点,则其LC结点编号为202,RC结点编号为203?
由性质5,可知左孩子为2i,右孩子为2i+1
5.一棵深度为h的完全k叉树,如果按层次自顶向下、同一层自左向右、顺序从1开始对全部结点进行编号,试问:
该树上最多有多少个结点?
最少有多少个结点?
由性质1和定义,可知除第h层外,其余各层都是满的,所以:
1+k+k2+...+kh-2=(kh-1-1)/(k-1),则最多有:
(kh-1-1)/(k-1)+kh-1=(kh-1)/(k-1);
最少有:
(kh-1-1)/(k-1)+1
三、二叉树的存储结构
1、顺序存储结构