列已满,不能进行入队运算,这种情况称为“上溢”。
②.退队运算:指从队列(循环队列)的队头删除一个数据元素,并赋给指定的变量;即将将排头指针进一(front=front+1),并当front=m+1时置front=1。然后将排头指针指向的元素赋给指定的变量。
当循环队列为空(s=0)是不能进行退队运算,这种情况称为“下溢”。
§1.5 链表
在链式存储方式中,要求每个结点由两部分组成:一部分用于存放数据元素值,称为数据域;另一部分用于存放指针,称为指针域。其中指针用于指向该结点的前一个或后一个结点(即前件或后件)。 链式存储方式既可用于表示线性结构,也可用于表示非线性结构。
(1)线性链表
线性表的链式存储结构称为线性链表。
在某些应用中,对线性链表中的每个结点设置两个指针,一个称为左指针,用以指向其前件结点;另一个称为右指针,用以指向其后件结点。这样的表称为双向链表。
在线性链表中,各数据元素结点的存储空间可以是不连续的,且各数据元素的存储顺序与逻辑顺序可以不一致。在线性链表中进行插入与删除,不需要移动链表中的元素。
线性单链表中,HEAD称为头指针,HEAD=NULL(或0)称为空表。 如果是双项链表的两指针:左指针(Llink)指向前件结点,右指针(Rlink)指向后件结点。
线性链表的基本运算:查找、插入、删除、排序、复制、逆转、分解、合并等。 (2)带链的栈
栈也是线性表,也可以采用链式存储结构。带链的栈可以用来收集计算机存储空间中所有空闲的存储结点,这种带链的栈称为可利用栈。
§1.6 树与二叉树 1.6.1 树的基本概念
树是一种简单的非线性结构,在数这种数据结构中,所有数据元素之间的关系具有明显的层次特性如图所示。在树的图形表示中,总是认为在用直线连起来的两端结点中,上端结点是前件,下端结点是后件,这样,表示前后件关系的箭头就可以省略。(现实生
活中的例子很多,如学校的行政关系结构图1.27)
在树结构中,每一个结点只有一个前件,称为父结点,没有前件的结点只有一个,称为树的根结点,简称树的根。如右图结点R树的根结点。
在树结构中,每个结点可以有多个后件,它们都称为该结点的子结点。没有后件的结点称为叶子结点。一个结点所拥有的后件个数称为该结点的度,如根结点R的度为4,结点T的度为3。在树中,所有结点中
最大的度称为树的度,如上图树的度为4??
树的最大层次称为数的深度如图1.26所示的树的深度为5,根结点在第一层,叶子结点没有子树??在计算机中,可以用树结构来表示算术表达式(这里不详讲解) 1.6.2 二叉树概念及其基本性质 1. 二叉树及其基本概念
二叉树是一种很有用的非线性结构,具有以下两个特点: ①.非空二叉树只有一个根结点;
②.每一个结点最多有两棵子树,且分别称为该结点的左子树和右子树。
在二叉树中,每一个结点的度最大为2,即所有子树(左子树或右子树)也均为二叉树。另外,二叉树中的每个结点的子树被明显地分为左子树和右子树。
在二叉树中,一个结点可以只有左子树而没有右子树,也可以只有右子树而没有左子树。当一个结点既没有左子树也没有右子树时,该结点即为叶子结点。
例如,一个家族中的族谱关系如图1-1所示:
A有后代B,C;B有后代D,E;C有后代F。
图1典型的二叉树如图右图1-1所示:
详细讲解二叉树的基本概念,见下表1-2。
2. 二叉树基本性质。
二叉树具有以下几个性质:
性质1:在二叉树的第k层上,最多有2k?1(k≥1)个结点。 性质2:深度为m(即二叉树有m层)的二叉树最多有2m--1个结点。
性质3:在任意一棵二叉树中,度为0的结点(即叶子结点)总是比度为2的结点多一个。
性质4:具有n个结点的二叉树,其深度至少为[logn]+1,其
2
中[logn]表示取logn的整数部分。
223. 满二叉树与完全二叉树
ⅰ.满二叉树是指这样的一种二叉树:除最后一层外,每一层上的所有结点都有两个子结点。在满二叉树中,每一层上的结点数都达到最大值,即在满二叉树的第k层上有个结2k?1点,且深度为m的满二叉树有2m--1个结点。如下图的a、b、c分别是深度为2、3、4的满二叉树。
ⅱ.完全二叉树是指这样的二叉树:除最后一层外,每一层上的结点数均达到最
大值;在最后一层上只缺少右边的若干结点。如下图所示的a、b分别是深度为3、4的完全二叉树。
对于完全二叉树来说,叶子结点只可能在层次最大的两层上出现:对于任何一个结点,若其右分支下的子孙结点的最大层次为p,则其左分支下的子孙结点的最大层次或为p,或为p+1。
完全二叉树具有以下两个性质:
性质1:具有n个结点的完全二叉树的深度为[logn]+1。
2性质2:设完全二叉树共有n个结点。如果从根结点开始,按层次(每一层从左到右)用自然数1,2,??,n给结点进行编号,则对于编号为k(k=1,2,??,n)的结点有以下结论:
① 若k=1,则该结点为根结点,它没有父结点;若k>1,则该结点的父结点编号为INT(k/2);
② 若2k≤n,则编号为k的结点的左子结点编号为2k;否则该结点无左子结点(显然也没有右子结点);
③ 若2k+1≤n,则编号为k的结点的右子结点编号为2k+1;否则该结点无右子结点。
ⅲ.在计算机中,二叉树的存储通常采用链式存储结构(也称为二叉链表)。其中,用于存储二叉树中各元素的存储结点由两部分组
成:数据域,指针域(指针域有2个:一是用于指向该结点的左子结点的存储地址,称为左指针域;另一个用于指向该结点的右子结点的存储地址,称为右指针域)。
1.6.3 二叉树(是一种非线性结构)的遍历(指不重复地访问二叉树中的所有结点)
在遍历二叉树的过程中,一般先遍历左子树,再遍历右子树。在先左后右的原则下,根据访问根结点的次序,二叉树的遍历分为三类:前序遍历、中序遍历和后序遍历。
(1)前序遍历(DLR)
先访问根结点,然后遍历左子树,最后遍历右子树;并且在遍历左、右子树时,仍需先访问根结点,然后遍历左子树,最后遍历右子树。例如,对右图1-1中的二叉树进行前序遍历的结果(或称为该二叉树的前序序列)为:A,B,D,E,C,F。
(2)中序遍历(LDR)
先遍历左子树、然后访问根结点,最后遍历右子树;并且,在遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。例如,对右图1-1中的二叉树进行中序遍历的结果(或称为该二叉树的中序序列)为: D,B,E,A,C,F。
(3)后序遍历(LRD)
先遍历左子树、然后遍历右子树,最后访问根结点;并且,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。例如,对右图1-1中的二叉树进行后序遍历的结果(或称为该二叉树的后序序列)为: D, E,B, F,C,A。 §1.7 查找
1.7.1 顺序查找
查找是指在一个给定的数据结构中查找某个指定的元素。顺序查找(顺序搜索)是指从线性表的第一个元素开始,依次将线性表中的元素与被查找的元素相比较,若相等则表示查找成功;若线性表中所有的元素都与被查找元素进行了比较但都不相等,则表示查找失败。
例如,在一维数组[21,46,24,99,57,77,86]中,查找数据元素99,首先从第1个元素21开始进行比较,比较结果与要查找的数据不相等,接着与第2个元素46进行比较,以此类推,当进行到与第4个元素比较时,它们相等,所以查找成功。如果查找数据元素