最后将表长n减1,删除成功,函数返回值为0。
算法和求T(n)的方法:
P24
2.链式存储结构
1)单链表:
只有一个链域的链表称单链表。
链式存储结构定义
typedefstructLNode{//Fig2-3
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
单链表的基本运算:
PPT33-53
建立单链表(头插法建表、尾插建表法);
查找运算(按序号查找、按值查找);
插入运算(后插操作、前插操作Fig2-4);
删除运算
注意:
带头结点的单链表
对链表设置头结点的作用:
(1)对带头结点的链表,在表的任何结点之前插入结点或删除表中任何结点,所要做的都是修改前一结点的指针域,因为任何元素结点都有前驱结点。
若链表没有头结点,则首元素结点没有前驱结点,在其前插入结点或删除该结点时操作会复杂些。
(2)对带头结点的链表,表头指针是指向头结点的非空指针,因此空表与非空表的处理是一样的。
2)循环链表、双向链表PPT54-57
3.线性表的应用--一元多项式的表示及相加(了解)
第三章栈、队列
(一)栈
1.栈的基本概念
栈是限制仅在表的一端进行插入和删除运算的线性表又称为后进先出表(LIFO表)。
插入、删除端称为栈顶,另一端称栈底。
表中无元素称空栈。
2.栈的存储结构
顺序栈Fig3-1
链栈Fig3-2
3.栈的基本运算:
1)initstack(s),构造一个空栈;
2)stackempty(s),判栈空;
3)stackfull(s),判栈满;
4)push(s,x),进栈;
5)pop(s),退栈;
6)GetTop(s),取栈顶元素。
(二)队列
1队列的基本概念
队列是一种运算受限的线性表,允许删除的一端称队首,允许插入的一端称队尾。
队列又称为先进先出线性表,FIFO表。
2队列的存储结构
链式存储Fig3-3
顺序存储结构-循环队列Fig3-4
3.队列的基本运算:
1)initqueue(q),置空队;
2)queueempty(q),判队空;
3)queuefull(q),判队满;
4)enqueue(q,x),入队/插入;
5)dequeue(q),出队/删除;
6)queuefront(q),返回队头元素。
(三)了解栈和队列的应用
第四章串
(一)基本概念
1.串:
是由零个或多个字符组成的有限序列;包含字符的个数称串的长度;
2.空串:
长度为零的串称空串;
3.空格串:
仅由空格组成的的串;
4.串的长度:
串中字符的数目n
(二)串的3种机内表示方式:
1定长顺序存储表示(静态存储)-用一组地址连续的存储单元存储串值的字符序列。
2堆分配存储表示(动态存储)-以一组地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配的。
3串的块链存储表示(动态存储)-串的链式存储结构中每个结点包含字符域和结点链接指针域,字符域用于存放字符,指针域用于存放指向下一个结点的指针,因此,串可用单链表表示。
(三)串的基本运算
Index(StringS,StringT,intpos)//定位
Concat(&T,S1,S2)//串连接
SubString(&Sub,S,pos,len)//求子串
strassign(hstringt,char*chars)//生成一个值等于串常量chars的串T
Replace(Stringtype&S,StringtypeT,StringtypeV)//替换
第六章树与二叉树
(一)树的概念
树(tree)是n(n>0)个结点的有限集T,其中:
(1)有且仅有一个特定的结点,称为树的根(root)
(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,……Tm,其中每一个集合本身又是一棵树,称为根的子树(subtree)
基本术语
结点、结点的度、
叶子、孩子、双亲、兄弟、
树的度、结点的层次、深度、森林
(二)二叉树
1.二叉树的定义及其主要二叉树性质
定义:
二叉树是n(n0)个结点的有限集,它或为空树(n=0),或由一个根结点和两棵分别称为左子树和右子树的互不相交的二叉树构成
二叉树性质及其证明:
1)
2)深度为k的二叉树至多有
个结点(k1)
3)对任何一棵二叉树T,如果其终端结点/叶子数为n0,度为2的结点数为n2,则n0=n2+1
4)具有n个结点的完全二叉树的深度为
5)如果对一棵有n个结点的完全二叉树的结点按层序编号,则对任一结点i(1in),有:
(1)如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是i/2
(2)如果2i>n,则结点i无左孩子;如果2in,则其左孩子是2i
(3)如果2i+1>n,则结点i无右孩子;如果2i+1n,则其右孩子是2i+1
2.二叉树的顺序存储结构和链式存储结构
顺序存储结构:
按满二叉树的结点层次编号,依次存放二叉树中的数据元素
链式存储结构:
Fig6-1
在二叉树中所有类型为BiTNode的结点和一个指向开始结点的*BiTree类型的头指针构成二叉树的链式存储结构称二叉链表。
二叉链表由根指针唯一确定。
在n个结点的二叉链表中有2n个指针域,其中n+1个为空。
3.二叉树的遍历以及应用PPT26-47
前序遍历、中序遍历、后序遍历。
时间复杂度为O(n)
4.线索二叉树的基本概念和构造
线索二叉树:
利用二叉链表中的n+1个空指针域存放指向某种遍历次序下的前趋和后继结点的指针,这种指针称线索。
加线索的二叉链表称线索链表。
相应二叉树称线索二叉树。
构造:
Fig6-2
了解遍历中序线索二叉树
(三)树、森林
1.树的存储结构
(1)双亲链表表示法:
为每个结点设置一个parent指针,就可唯一表示任何一棵树。
Data|parent
(2)孩子链表表示法:
为每个结点设置一个firstchild指针,指向孩子链表头指针,链表中存放孩子结点序号。
Data|firstchild。
(3)双亲孩子链表表示法:
将以上方法结合。
Data|parent|firstchild
(4)孩子兄弟链表表示法:
附加两个指向左孩子和右兄弟的指针。
Leftmostchild|data|rightsibling
2.森林与二叉树的转换(了解)
(1)树、森林与二叉树的转换
1)树与二叉树的转换:
1}所有兄弟间连线;2}保留与长子的连线,去除其它连线。
该二叉树的根结点的右子树必为空。
2)森林与二叉树的转换:
1}将所有树转换成二叉树;2}将所有树根连线。
(2)二叉树与树、森林的转换。
是以上的逆过程。
3.树和森林的遍历
前序遍历一棵树等价于前序遍历对应二叉树;
后序遍历等价于中序遍历对应二叉树。
(四)树的应用
哈夫曼(Huffman)树和哈夫曼编码PPT73-88
第七章图
(一)图的概念
1.图:
图G是由顶点集V和边集E组成,顶点集是有穷非空集,边集是有穷集;
2.G中每条边都有方向称有向图;有向边称弧;边的始点称弧尾;边的终点称弧头;G中每条边都没有方向的称无向图。
3.顶点n与边数e的关系:
无向图的边数e介于0~n(n-1)/2之间,有n(n-1)/2条边的称无向完全图;有向图的边数e介于0~n(n-1)之间,有n(n-1)条边的称有向完全图;
4.无向图中顶点的度是关联与顶点的边数;有向图中顶点的度是入度与出度的和。
所有图均满足:
所有顶点的度数和的一半为边数。
5.图G(V,E),如V’是V的子集,E’是E的子集,且E’中关联的顶点均在V’中,则G’(V’,E’)是G的子图。
6.在无向图中,任意两个顶点都有路径连通称连通图;极大连通子图称连通分量;
7.在有向图中,任意顺序两个顶点都有路径连通称强连通图;极大连通子图称强连通分量;
8.将图中每条边赋上权,则称带权图为网络。
(二)图的存储及基本操作
1.邻接矩阵法--邻接矩阵是表示顶点间相邻关系的矩阵。
n个顶点就是n阶方阵。
无向图是对称矩阵;有向图行是出度,列是入度。
定义:
设G=(V,E)是有n1个顶点的图,G的邻接矩阵A是具有以下性质的n阶方阵:
数据结构:
Fig7-1
2.邻接表法--为图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边(有向图中指以Vi为尾的弧)。
数据结构:
Fig7-2
3.邻接矩阵表示法与邻接表表示法的比较:
1)邻接矩阵是唯一的,邻接表不唯一;
2)存储稀疏图用邻接表,存储稠密图用邻接矩阵;
3)求无向图顶点的度都容易,求有向图顶点的度邻接矩阵较方便;
4)判断是否是图中的边,邻接矩阵容易,邻接表最坏时间为O(n);
5)求边数e,邻接矩阵耗时为O(n^2),与e无关,邻接表的耗时为O(e+n);
4.基本操作
InsertVex(G,v),InsertARC(G,v,w),DeleteVex(G,v),DeleteARC(G,v,w)
(三)图的遍历PPT55-64
1.深度优先搜索(DFS)/遍历方法与算法(了解算法)
2.广度优先搜索(BFS)/遍历方法与算法(了解算法)
(四)图的基本应用及其复杂度分析
1.生成树--所有顶点均由边连接在一起,但不存在回路的图。
有深度优先生成树与广度优先生成树。
构造连通网的最小代价生成树(最小生成树)问题,常用算法:
PPT69-78
(1)普里姆(Prim)算法
(2)克鲁斯卡尔(Kruskal)算法
2.拓扑排序--把AOV网络中各顶点按照它们相互之间的优先关系排列成一个线性序列的过程。
拓扑排序的方法:
1)在有向图中选一个没有前驱的顶点且输出之
2)从图中删除该顶点和所有以它为尾的弧
3)重复上述两步,直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止
3.关键路径--路径长度最长的路径。
求关键路径步骤。
4.最短路径--从某个源点到其余各顶点的最短路径
迪杰斯特拉(Dijkstra)算法实现:
(1)S:
表示已找到从v出发的最短路径的终点的集合;S={v}(初值)
D[i]:
表示当前所找到的从v到终点vi的最短路径的长度.vi∈V
(2)选择vj,使得D[j]=min{D[i]|vi∈V-S},
vj为当前求得的从v出发的最短路径的终点,令S=S∪{j}
(3)修改从v出发到集合V-S上任一顶点Vk可达的最短路径长度.
ifD[j]+arcs[j,k](4)重复
(2)、(3)共n-1次;
即可求得从v到图上其余各顶点的最短路径
第九章查找
(一)查找的基本概念
1.查找的同时对表做修改操作(如插入或删除)则相应的表称之为动态查找表,否则称之为静态查找表。
2.衡量一个查找算法次序优劣的标准是在查找过程中对关键字需要执行的平均比较次数(即平均查找长度ASL).
(二)线性表上进行查找的方法主要有三种:
(静态查找表)
顺序查找、折半查找/二分查找和分块查找/索引顺序表查找。
各种查找包括:
1)查找过程
2)数据结构与算法
3)查找方法的ASL
(三)二叉排序树(动态查找表)
1.二叉排序树定义:
它或者是一棵空树,或者是一棵具有如下特征的非空二叉树:
1)若它的左子树非空,则左子树上所有结点的关键字均小于根结点的关键字;
2)若它的右子树非空,则右子树上所有结点的关键字均大于等于根结点的关键字;
3)左、右子树本身又都是一棵二叉排序树。
2.基本操作
二叉排序树的查找Fig9-1
若二叉排序树为空,则查找不成功;
否则
1)若给定值等于根结点的关键字,则查找成功;
2)若给定值小于根结点的关键字,则继续在左子树上进行查找;
3)若给定值大于根结点的关键字,则继续在右子树上进行查找。
二叉排序树的插入和删除
二叉排序树查找分析Fig9-2
(四)平衡二叉树(了解)
(五)哈希表/散列(Hash)表及其查找
基本思想:
在记录的存储地址和它的关键字之间建立一个确定的对应关系;这样,不经过比较,一次存取就能得到所查元素的查找方法
哈希函数——在记录的关键字与记录的存储地址之间建立的一种对应关系
哈希函数的构造方法:
直接定址法、数字分析法、平方取中法、折叠法、除留余数法、随机数法等。
处理冲突的方法:
开放定址法、再哈希法、链地址法。
哈希查找过程、哈希表的插入
哈希表查找分析
第十章内部排序
(一)排序的基本概念
排序定义——将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列叫~
(二)排序分类
按待排序记录所在位置
内部排序:
待排序记录存放在内存
外部排序:
排序过程中需对外存进行访问的排序
按排序依据原则
插入排序:
直接插入排序、折半插入排序、希尔排序
交换排序:
冒泡排序、快速排序
选择排序:
简单选择排序、堆排序
归并排序:
2-路归并排序
基数排序
1.排序算法的基本操作:
1)比较关键字的大小;2)改变指向记录的指针或移动记录本身。
2.评价排序方法的标准:
1)执行时间;2)所需辅助空间,辅助空间为O
(1)称就地排序;另要注意算法的复杂程度。
(三)各种内部排序算法的比较
排序方法
平均时间
最坏情况
最好情况
辅助空间
稳定性
插入排序
O(n2)
O(n2)
O(n)
O
(1)
√
选择排序
O(n2)
O(n2)
O(n2)
O
(1)
√
冒泡排序
O(n2)
O(n2)
O(n)
O
(1)
√
快速排序
O(nlogn)
O(n2)
O(nlogn)
O(nlogn)
×
归并排序
O(nlogn)
O(nlogn)
O(nlogn)
O(n)
√
堆排序
O(nlogn)
O(nlogn)
O(nlogn)
O
(1)
×
基数排序
O(d*n)
O(d*n)
O(d*n)
O(n)
√
考试题型
1选择题10
2填空题16
3简答题54
4算法20