}
4、对于带头结点的链队列,掌握队列为空的条件,熟悉入队、出队的基本操作方法。
voidInitQueue(LiQueue*&q)
{q=(LiQueue*)malloc(sizeof(LiQueue));
q->front=q->rear-NULL;
}//初始化
intQueueEmpty(LiQueue*q)
{if(q->rear==NULL)return1;
elsereturn0;
}//判空
voidenQueue(LiQueue*&q,ElemTypee)
{QNode*s;s=(QNode*)malloc(sizeof(QNode));
s->data=e;
s->next=NULL;
if(q->rear==NULL)
q->front=q->rear=s;
else
{q->rear->next=s;q->rear=s;
}
}
//入队
intdeQueue(LiQueue*&q,ElemType&e)
{QNode*t;if(q->rear==NULL)
return0;
t=q->front;if(q->front==q->rear)
q->front=q->rear=NULL;
else
q->front=q->front->next;
e=t->data;
free(t);
return1;
}
//出队
intdeQueue(LiQueue*&q,ElemType&e)
{QNode*t;if(q->rear==NULL)
return0;
t=q->front;if(q->front==q->rear)
q->front=q->rear=NULL;
else
q->front=q->front->next;
e=t->data;
break;
free(t);
return1;
}
//取队头
5、对于采用顺序存储结构的循环队列,掌握队列为空、队列满的条件,及队列的基本操作。
循环队列判断空满有两种方法:
1.另设一个标志位以区分队列空满;
2.少用一个元素空间,当队头指针在队尾指针下一位时,队列为满,当队头指针与队尾指针相同是队列为空。
在循环队列下,仍定义front=rear时为队空,而判断队满则用两种办法,一是用“牺牲一个单元”,即rear+1=front(准确记是(rear+1)%m=front,m是队列容量)时为队满。
另一种解法是“设标记”方法,如设标记tag,tag等于0情况下,若删除时导致front=rear为队空;tag=1情况下,若因插入导致front=rear则为队满。
第五章串和数组
重点内容及要求:
1、掌握字符串类型的定义及存储表示方法。
一般情况之下用char定义,
串(String),或称字符串是由零个或多个字符组成的有限序列。
记作:
S=''a0a1…ai…an-1''(n≥0)
其中,ai属于字符集,n为串的长度,当n=0时串为空串
存储特点
串的实际长度可在这个予定义长度的范围内随意设定,超过予定义长度的串值则被舍去,称之为“截断”
按这种串的表示方法实现的串的运算时,其基本操作为“字符序列的复制”
2、掌握数组的定义和存储结构,熟悉二维数组中数据元素按行存储的基本方法,会计算元素的存储地址。
数组的定义和存储结构
数组是线性表的一种扩充,一维数组即为线性表,二维数组定义为“其数组元素为一维数组”的线性表
3、了解矩阵压缩存储的目的、原理及基本思路和方法。
矩阵压缩存储的目的
1)零值元素占了很大空间;
2)计算中进行了很多和零值的运算,
遇除法,还需判别除数是否为零。
原理及基本思路和方法
1)尽可能少存或不存零值元素;
2)尽可能减少没有实际意义的运算;
3)操作方便。
即:
能尽可能快地找到与下标值(i,j)对应的元素,能尽可能快地找到同一行或同一列的非零值元。
4、了解随机稀疏矩阵的压缩存储方法(三元组顺序表、十字链表)。
三元组顺序表
十字链表
第六章二叉树
重点内容及要求:
1、掌握二叉树的定义、特点及相关概念。
结点的层次:
假设根结点的层次为1,第l层的结点的子树根结点的层次为l+1
树的深度:
树中叶子结点所在的最大层次
二叉树的定义
二叉树是n(n≥0)个元素的有限集,它或为空树,或是由一个根结点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。
2、了解二叉树的性质和存储结构特点,掌握二叉树的顺序存储结构主要用于完全二叉树。
二叉树的性质:
1.在二叉树的第i层上至多有2i-1个结点(i≥1)。
2.深度为k的二叉树上至多含2k-1个结点(k≥1)。
3.对任何一棵二叉树,若它含有n0个叶子结点、n2个度为2的结点,则必存在关系式:
n0=n2+1。
4.具有n个结点的完全二叉树的深度为⎣log2n⎦+1。
若对含n个结点的完全二叉树从上到下且从左至右进行1至n的编号,则对完全二叉树中任意一个编号为i的结点:
(1)若i=1,则该结点是二叉树的根,无双亲,
否则,编号为⎣i/2⎦的结点为其双亲结点;
(2)若2i>n,则该结点无左孩子,
否则,编号为2i的结点为其左孩子结点;
(3)若2i+1>n,则该结点无右孩子结点,
否则,编号为2i+1的结点为其右孩子结点。
3、掌握二叉树的二叉链表存储结构。
4、了解二叉树遍历的基本方法(先根次序、中根次序及后根次序遍历二叉树)。
5、了解堆排序的基本方法、了解二叉排序树的基本特点以及如何构造一棵哈夫曼树。
树和森林
树和森林的存储结构
第七章图
重点内容及要求:
1、了解图的基本概念和相关术语。
图是较树结构更复杂的非线性结构
图Graph是由一个顶点集V和一个弧集E构成的数据结构,记作Graph=(V,E)。
其中,图的顶点为数据结构中的数据元素,弧的集合E是定义在顶点集合V上的一个关系。
有序对表示从v到w的一条弧,并称v为弧头,w为弧尾。
谓词P(v,w)定义了弧的意义或信息
由于“弧”是有方向的,因此称由顶点集和弧集构成的图为有向图
2、了解图的存储结构特点(邻接矩阵、邻接表存储结构)。
邻接矩阵:
邻接表存储
3、了解图的遍历方法(深度优先搜索DFS和广度优先搜索BFS)。
深度优先搜索DFS
连通图的深度优先搜索遍历
从图中某个顶点V0出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到。
voidDFS(GraphG,intv){
//从顶点v出发,深度优先搜索遍历连通图G
visited[v]=TRUE;VisitFunc(v);
for(w=FirstAdjVex(G,v);
w!
=0;w=NextAdjVex(G,v,w))
if(!
visited[w])DFS(G,w);
//对v的尚未访问的邻接顶点w
//递归调用DFS
}//DFS
非连通图的深度优先搜索遍历
首先将图中每个顶点的访问标志设为FALSE,之后搜索图中每个顶点,如果未被访问,则以该顶点为起始点,进行深度优先搜索遍历,否则继续检查下一顶点。
voidDFSTraverse(GraphG){
//对图G作深度优先遍历
for(v=0;vvisited[v]=FALSE;//访问标志数组初始化
for(v=0;vif(!
visited[v])DFS(G,v);
//对尚未访问的顶点调用DFS
}
广度优先搜索BFS
从图中的某个顶点V0出发,并在访问此顶点之后依次访问V0的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有和V0有路径相通的顶点都被访问到。
voidBFSTraverse(GraphG,intv){
for(v=0;vvisited[v]=FALSE;//初始化访问标志
InitQueue(Q);//置空的辅助队列Q
for(v=0;vif(!
visited[v]){//v尚未访问
}
}//BFSTraverse
以深度优先搜索DFS和广度优先搜索BFS的算法为框架,可以派生出很多有实用价值的应用。
1.求一条从顶点i到顶点s的简单路径;
2.求两个顶点之间的一条路径长度最短的路径;
3.求迷宫的最短路径。
4、了解连通网的最小生成树和单源最短路径算法。
连通网的最小生成树
构造网的一