数据结构复习大纲文档格式.docx
《数据结构复习大纲文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构复习大纲文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
L->
length||L->
length>
=MaxSize)
return0;
for(j=L->
length-1;
j>
=i;
j--)
L->
elem[j+1]=L->
elem[j];
elem[i]=item;
length++;
return1;
}
●算法:
在顺序线性表L中删除第i个位置的元素(要求掌握程序)
intListDelete_Sq(structSeqList*L,inti){
length-1||L->
length==0)
for(j=i+1;
j<
length;
j++)
L.elem[j-1]=L->
length--;
第三节线性表的链式表示和实现
★顺序结构和链式结构各自的优缺点:
顺序结构:
优点:
实现了所谓的随机存取
缺点:
在作插入或删除操作时,需移动大量元素。
链式结构:
在作插入或删除操作时,不需移动大量元素,只需要修改结点
指针。
缺点:
不支持对元素的随机存取。
一、线性链表P27
1、线性链表(又称为单链表)及其相关概念
★
(1)线性表的链式存储结构的特点是采用动态的存储分配,结点可以不顺序存放。
(2)结点:
一个链表是由一系列结点组成的。
结点包含两个域:
存储数据元素的数据域和存放指向该链表的下一个结点的指针的指针域
(3)单链表(线性链表、单向链表):
这种链表每一个结点只包含一个指针域。
★2、●算法:
在带头结点的单链线性表L中插入或删除一个数据元素(要求掌握程序)P29
(1)单链表插入程序:
intListInsert(structnode*head,inti,ElemTypex){
p=head;
j=0;
while((j<
i-1)&
&
(p->
next!
=NULL)){
p=p->
next;
j++;
}
if((j=i-1)&
next!
=NULL)){
s=malloc(sizeof(sturctnode));
s->
data=x;
s->
next=p->
p->
next=s;
}else
(2)单链表删除程序:
intListDelete(structnode*head,structnode*p){
if(head->
next==NULL)return0;
q=head;
while(q->
=p)
q=q->
q->
free(p);
二、循环链表
1、循环链表
★循环链表的概念:
是另一种形式的链式存储结构。
它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。
循环链表算法中的循环条件:
判断p或者p->
next是否等于头指针(p->
next==head)
三、双向链表
★链表中每个结点有两个指针域,一个指向前驱,一个指向后继。
第三章栈和队列
第一节栈
一、栈的定义P44
★1、栈(Stack)的概念:
堆栈是限定仅在表尾进行插入或删除操作的线性表.
★2、栈的相关概念:
栈顶:
对栈来说,表尾端称为栈顶(允许插入和删除的一端)
栈底:
对栈来说,表头端称为栈底
空栈:
不含元素的空表。
★栈又被称为后进先出(FirstInLastOut,FILO)的线性表
二、栈的表示和实现
★1、顺序栈:
即栈的存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈的位置
★2、基本操作的算法描述
注意分析以下几个操作:
(要求掌握程序)
⑴栈初始化
⑵进栈
⑶出栈
栈的顺序存储表示
structstack{
ElemTypeelem[MAXSIZE];
inttop;
};
⑴栈初始化
viodInitStack(structstack*s){
s=malloc(sizeof(structstack));
top=0;
//栈顶的下一位置
intpush(structstack*s,ElemTypex){
if(s->
top<
MAXSIZE-1){
s->
elem[s->
top]=x;
top++;
voidpop(structstack*s){
top!
=0)
top--;
第四节队列
一、队列的定义P58
★1、队列(Queue)的概念:
队列是一种先进先出(FirstInFirstOut,FIFO)的线性表,它只允许在表的一端进行插入,而在表的另一端删除元素
★2、队列的相关概念:
队尾(rear):
在队列中允许插入的一端
队头(front):
在队列中允许删除的一端
不含元素的空表称为空队列。
3、队列的两种存储结构:
顺序存储结构(顺序队列,循环(顺序)队列)
链式存储结构(链队列)
二、循环队列-队列的顺序表示和实现
1、为什么要采用循环队列?
假设当前为队列分配的最大空间为n,则当队列的n位也存入数据(其它位不一定有存数据)的状态时,不可再继续插入新的队尾元素,否则会因数组越界而遭致程序代码被破坏,然而此时又不宜如顺序栈那样,进行存储再分配扩大数组空间,因为队列的实际可用并未占满,所以,一个较巧妙的办法是将顺序队列臆造为一个环状的空间,则称之为循环队列。
2、构造循环队列的策略
少用一个元素空间,约定以队列头指针在队列尾指针的下一个位置作为队列满的标志。
3、基本操作的算法描述
★注意分析以下几个操作:
▲(要求掌握程序)
⑴初始化队列
⑵入队列
⑶出队列
★队空的判断条件:
Q->
front=Q->
rear
★队满的判断条件:
(Q->
rear+1)%MAXQSIZE==Q->
front
★入队:
rear=(Q->
rear+1)%MAXQSIZE;
★出队:
front=(Q->
front+1)%MAXQSIZE;
//队列的顺序存储结构
#defineMAXQSIZE100//最大队列长度
typedefstruct{
ElemTypeelem[MAXSIZE];
;
//存放队列中的元素
intfront;
//头指针,若队列不空,指向队列头元素
intrear;
//尾指针,若队列不空,指向队列尾元素的下一个位置
}SqQueue;
循环队列的基本操作的算法描述:
SqQueue*InitQueue(SqQueue*Q)//初始化一个空队列
{Q=(SqQueue*)malloc(sizeof(SqQueue));
Q->
front=0;
Q->
rear=0;
printf("
初始化成功\n"
);
returnQ;
SqQueue*EnQueue(SqQueue*Q,intx)
{
if((Q->
rear+1)%MAXSIZE==Q->
front)//判断队列是否满
printf("
队列已满:
\n"
else
elem[Q->
rear]=x;
rear+1)%MAXSIZE;
}
⑶出队列
SqQueue*DeQueue(SqQueue*Q)
intx;
if(Q->
rear!
=Q->
front)//判断队列是否为空
{x=Q->
front];
front=(Q->
front+1)%MAXSIZE;
出队元素是:
%d\n"
x);
}
else
printf("
队列已空,无法删除.\n"
三、链队列-队列的链式表示和实现
1、链队列:
用链表表示的队列
头指针和尾指针:
头指针指向头结点
空的链队列的判决条件为头指针和尾指针均指向头结点
第六章树和二叉树
第一节树的定义和基本术语
1、树和子树
树:
树是n个结点(n≥1)的有限集
子树:
其中每一个集合本身又是一颗树,我们将T1,…,Tm称为根的子树。
2、结点的度和树的度
结点的度:
结点拥有的子树称为结点的度
树的度:
树内各结点的度的最大值
★3、叶结点(终端结点)、非终端结点(分支结点)
叶结点(终端结点):
度为0的结点称为叶结点或终端结点
非终端结点(分支结点):
度不为0的结点。
★4、孩子、双亲、兄弟、祖先、子孙
孩子、双亲:
结点的子树的根称为该结点的孩子,而该结点称为孩子的双亲
兄弟:
同一个双亲的孩子之间互称兄弟
祖先:
结点的祖先是从根到该结点所经分支上的所有结点
子孙:
以某结点为根的子树中的任一结点都称为该结点的子孙
★5、结点的层次、树的深度
结点的层次:
从根开始定义起,根称为第一层,根的孩子称为第二层;
若某结点在第l层,则其子树的根就在第l+1层
树的深度:
树中结点的最大层次称为树的深度
第二节二叉树
一、二叉树的定义
★二叉树的定义
二叉树:
是n(n0)个结点的有限集合,它或为空树(n=0),或由一个根结点和两棵分别称为根的左子树和右子树的、互不相交的二叉树组成,且左右子树次序不能颠倒,(二叉树不是树的特殊情况)。
对于任意给定的结点,它的度不超过2。
★二叉树的五种基本形态
二、二叉树的性质
★1、二叉树的五条重要性质(要求能够根据性质进行计算)P123~125
性质一:
在二叉树的第i层上至多有2i-1个结点(i1)
性质二:
深度为k的二叉树至多有2k-1个结点(k1)
性质三:
对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1
性质四:
具有n个结点的完全二叉树的深度为」log2n」+1
性质五:
假设对一棵有n个结点的完全二叉树(其深度为」log2n+1」)的结点按照层序编号(从第一层到第」log2n」+1层,每层从左到右),则对任一结点i(1≤i≤n),有
⑴如果i=1,则结点i是二叉树的根,无双亲;
如果i>
1,则其双亲PARENT(i)是结点[i/2]
⑵若2i>
n,则结点i无左孩子(结点i为叶子结点);
否则其左孩子LCHILD(i)是结点2i
⑶若2i+1>
n,则结点i无右孩子;
否则其右孩子RCHILD(i)是结点2i+1
★2、概念:
满二叉树、完全二叉树
满二叉树:
一棵深度为k且具有2k-1个结点的二叉树称为满二叉树。
完全二叉树:
深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树编号从1至n的结点一一对应时,称之为完全二叉树。
(能根据定义识别这两种二叉树)
三、二叉树的存储结构
★1、顺序存储结构:
(分析其缺点)
顺序存储结构的二叉树仅适用于完全二叉树。
★2、链式存储结构
二叉树的链式存储结构通常有二叉链表和三叉链表两种形式。
二叉链表存储结构:
structBTnode{
ElemTypedata;
structBTnode*lchild,*rchild;
●(能够根据给定的二叉树画出它的二叉链表结构。
)
如下所示:
一棵二叉树其对应的二叉链表
第三节遍历二叉树
1、遍历二叉树的概念
遍历二叉树是指如何按某条搜索路径巡访树中的每个结点,使得每个结点均被访问一次,而且仅被访问一次
★●2、遍历二叉树的方法:
1)先序遍历
2)中序遍历
3)后序遍历
(要求掌握各种遍历的思想,并能根据给定的二叉树得出它的各种遍历序列。
第四节树和森林
★1、树的存储结构有:
1)双亲表示法
2)孩子表示法
3)孩子兄弟表示法
2、树和与二叉树的相互转换
★由树转换后的二叉树具有的特点:
①二叉树的根结点只有左子树,没有右孩子;
②二叉树中结点的左孩子是它在树中最左的孩子,右孩子是原来树中的下一个兄弟。
★3、树的遍历方法:
1)先根遍历
2)后根遍历
3)层次遍历
第六节赫夫曼树及其应用
1、概念:
路径长度、树的路径长度、树的带权路径长度
路径长度:
路径上分支数目称作路径长度
树的路径长度:
从树根到每一个结点的路径长度之和
树的带权路径长度:
为树中所有叶子结点的带权路径长度之和,
通常记为WPL=
其中:
n——叶子结点数
Wi——第i个叶子结点的权值
Li——根到该叶子结点间的路径长度
2、概念:
最优二叉树(赫夫曼树)
带权路径长度WPL最小的二叉树称作最优二叉树或赫夫曼树
3、●赫夫曼算法(要求掌握算法的思想而不是程序)
★★掌握如何构造赫夫曼树P144
构造赫夫曼树:
赫夫曼最早给出了一个带有一般规律的算法,俗称赫夫曼算法
⑴根据给定的n个权值{ω1,ω2,…,ωn}构成n棵二叉树的集合F={T1,T2,…,Tn},其中每棵二叉树Ti中只有一个带权为ωi的根结点,其左右子树均空
⑵在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树
且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和
⑶在F中删除这两棵树,同时将新得到的二叉树加入F中
⑷重复⑵⑶步,直到F只含一棵树为止,这棵树就是赫夫曼树
(能根据算法思想根据给定的权值构建哈夫曼树)
第七章图
第一节图的定义和术语
1、顶点、有向图、弧、弧头、弧尾、无向图、边P157
2、权、网
权:
有时图的边或弧具有与它相关的数,这种与图的边或弧相关的数叫做权。
网:
这种带权的图通常称为网。
★3、邻接点、相关联
对于无向图G=(V,{E}),如果边(V,W)∈E,则称顶点V和W互为邻接点,称边(v,w)和顶点v与w相关联。
★4、入度、出度
对于有向图:
入度:
以顶点v为头的边的数目称为v的入度,记为ID(v)
出度:
以顶点v为尾的边的数目称为v的出度,记为OD(v)
顶点v的度为TD(v)=ID(v)+OD(v)
5、路径、简单路径、回路(环)
路径:
顶点v到w的路径是从顶点v到顶点w的一个顶点序列
简单路径:
序列中顶点不重复出现的路径称为简单路径。
回路(环):
第一个顶点和最后一个顶点相同的路径称为回路或环。
★6、连通、连通图、连通分量
连通:
在无向图G中,如果从顶点V到顶点W有路径,则称V和W是连通的。
连通图:
对于图中任意两个顶点都是连通的,则称图G是连通图。
连通分量:
指的是无向图中的极大连通子图。
★7、生成树
生成树:
一个连通图的生成树是一个极小连通子图,它含有图中的全部顶点,但只有足以构成一棵树的n-1条边
(有n-1条边的不一定是生成树。
第二节图的存储结构(常用有邻接表、邻接多重表和十字链表)
一、数组表示法P161
★1、图没有顺序存储结构
数组表示法:
利用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息
★2、邻接矩阵:
(有向图的邻接矩阵、无向图的邻接矩阵、利用邻接矩阵计算各个顶点的入度和出度)
邻接矩阵存放的是边的信息,它不是图的存储结构。
无向图:
顶点vi的度是邻接矩阵中第i行(或第i列)的元素之和,即
有向图:
对于有向图,第i行的元素之和为顶点vi的出度OD(vi),第j列的元素之和为顶点vj的入度ID(vi)。
★二、邻接表P163
1、邻接表:
邻接表是图的一种链式存储结构
表头结点:
每一个链表上附设一个表头结点
表头结点包括数据域和指针域:
数据域中存储顶点的信息,指针域中为该顶点的单链表的头指针。
链表结点:
对图中每个结点建立一个单链表,第i个单链表中的结点表示依附于顶点vi的边(对于有向图是以顶点vi为尾的弧)
每个表结点由2个域组成:
邻接点域(adjvex):
指示与顶点vi邻接的点在图中的位置;
指针域(nextarc):
指示下一条边或弧的结点;
(能根据图邻接表计算每个结点的入度和出度)
第三节图的遍历
图的遍历的概念
从图中的某一个顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历。
一、深度优先遍历P168
★1、深度优先遍历(DFS)的算法:
(类似树的先根遍历)
★2、深度优先遍历的算法思想
⑴从图中某一顶点v开始,访问该顶点;
⑵每次从v的邻接点中选取一个未被访问的顶点进行深度优先遍历,直至图中所有和v有路径相通的顶点都被访问过;
⑶如果图中还有未被访问的顶点,则选择一个未被访问的顶点作为起始点,重复上述过程,直到图中所有顶点被访问过。
注:
图的深度优先遍历序列不是唯一的
(能根据遍历算法思想,写出一个给定图的遍历序列)
二、广度优先遍历
★1、广度优先遍历(DFS)的算法:
(类似树的按层次遍历)
★2、广度优先遍历的算法思想:
⑵依次访问v的各个未被访问的邻接点;
⑶分别从v的这些邻接点出发访问它们各自的所有邻接点。
要求:
先被访问的顶点,其邻接点先被访问;
⑷如果图中还有未被访问的顶点,则选择一个未被访问的顶点作为起始点,重复上述过程,直到图中所有顶点被访问过。
图的广度优先遍历序列不是唯一的
第四节图的连通性问题
★●最小生成树
1、最小生成树的概念:
构造连通网的最小代价生成树(就是生成树中各边的权值之和),简称为最小生成树。
★2、最小生成树的算法:
1)普里姆算法:
设G=(V,E)是连通网,构造的最小生成树为T=(U,TE)。
⑴初始时,U={u0},TE={};
⑵在所有uU、v(V-U)的边(u,v)中选择一条代价最小的边(u0,v0)加入集合TE中,同时将顶点v0加入集合U中;
⑶重复步骤⑵,直到U=V为止。
(能根据普里姆算法思想,计算出一个给定图的最小生成树)
2)克鲁斯卡尔算法:
设G=(V,E)是连通网,构造的最小生成树为T=(V,TE)。
⑴初始状态TE={},即生成树T中只有连通网G的全部顶点而没有边,每个顶点自成一个连通分量。
⑵在G的边的集合E中选择权值最小的边,若该边依附的顶点在生成树T中不同的连通分量上,则将此边加入T中;
否则选择下一条权值最小的边。
⑶重复步骤⑵,直到T中所有顶点都在同一连通分量上。
(能根据克鲁斯卡尔算法思想,计算出一个给定图的最小生成树)
第五节有向无环图及其应用
一、有向无环图
1、有向无环图(DAG图)的概念
一个无环的有向图称为有向无环图,简称DAG图
有向无环图的作用:
可实现对相同子式的共享,从而节省存储空间
★二、拓扑排序P180
拓扑排序的算法P182
拓扑排序的算法:
⑴在有向图中选择一个没有前驱的顶点且输出之
⑵从图中删除该顶点和所有以它为尾的弧
重复上述两步,直到全部顶点均已全部输出,或者当前图中不存在无前驱的顶点为止(后一种情况则说明有向图中肯定存在环,有环存在则说明工程不能顺序结束)
注意:
因为加入了人为的因素所以拓扑序列不是唯一的。
(能根据拓扑排序的算法思想,计算一个给定图的拓扑序列)
第九章查找
动态查找和静态查找
第一节静态查找表
★一、顺序表的查找
★1、顺序查找主要用于对顺序表和线性链表进行查找。
★2、顺序查找的过程和算法(要求掌握程序)
顺序查找过程:
从表中的最后一个记录开始,逐个进行记录的关键字和给定值的比较。
若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录。
反之,若直至第一个记录,其关键字同给定值的比较都不相等,则表明表中没有所查记录,查找不成功。
程序:
这里采用顺序存储结构来实现顺序查找表。
查找表的存储结构:
typedefstructsq{
keytypekey;
//定义关键字
elemtypedata;
}sqlist;
sqlistst[MAX];
intSearch_seq(sqlistst[],intn,intkey){
inti=n;
st[0].