数据结构复习题16章Word文件下载.docx
《数据结构复习题16章Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构复习题16章Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
next=p->
next;
p->
next=s;
B.p->
next=s->
s->
next=p;
C.q->
D.p->
next=q;
单链表的插入操作,画图可得。
10.向一个栈项指针为hs的链栈中插入一个*s结点时,则执行C。
A.hs->
B.s->
next=hs->
hs->
C.s->
next=hs;
hs=s;
D.s->
next=hs;
hs=hs->
栈的链式存储结构称为链栈,是运算受限的单链表。
其插入和删除操作只能在表头位置上进行。
因此,链栈没有必要像单链表那样附加头结点,栈顶指针top就是链表的头指针。
相当于就是要将*S压栈
11.在一个链队列中,假定front和rear分别为队首指针和队尾指针,则进行插入*s结点的操作时应执行B。
A.front->
front=s;
B.rear->
rear=s;
C.front=front->
D.front=rear->
如下所示
12.线性表是A。
A.一个有限序列,可以为空B.一个有限序列,不能为空
C.一个无限序列,可以为空D.一个无限序列,不能为空
线性表是一个线性结构,它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。
一般地,一个线性表可以表示成一个线性序列:
k1,k2,…,kn,其中k1是开始结点,kn是终端结点。
13.对顺序存储的线性表,设其长度为n,在任何位置上插入或删除操作都是等概率的,删除一个元素时大约要移动表中的C个元素。
A.n+1B.n-1C.(n-1)/2D.n
14.线性表采用链式存储时,其地址D。
A.必须是连续的B.部分地址必须是连续的
C.一定是不连续的D.连续与否均可以
15.设单链表中指针p指着结点(数据域为m),指针f指着将要插入的新结点(数据域为x),当x插在结点m之后时,只要先修改B后修改p->
link=f即可。
A.f->
link=p;
B.f->
link=p->
link;
C.p->
link=f->
D.f=nil;
单链表的插入:
16.在双向链表存储结构中,删除p所指的结点时需修改指针B。
A.((p->
rlink)->
rlink=(p->
rlink;
B.(p->
llink)->
rlink=p->
(p->
llink=p->
llink;
llink=(p->
((p->
rlink=p;
D.((p->
解析:
①插入时仅仅指出直接前驱结点,钩链时必须注意先后次序是:
“先右后左”。
部分语句组如下:
S=(DulNode*)malloc(sizeof(DulNode));
S->
data=e;
next->
prior=S;
p->
next=S;
S->
prior=p;
②插入时同时指出直接前驱结点p和直接后继结点q,钩链时无须注意先后次序。
q->
(2)双向链表的结点删除
设要删除的结点为p,删除时可以不引入新的辅助指针变量,可以直接先断链,再释放结点。
prior->
prior=p->
prior;
free(p);
注意:
与单链表的插入和删除操作不同的是,在双向链表中插入和删除必须同时修改两个方向上的指针域的指向。
17.在双向链表存储结构中,删除p所指的结点的前趋结点(若存在)时需修改指针A。
B.((p->
llink=p;
C.(p->
18.根据线性表的链式存储结构,每个结点所含指针的个数,链表分为单链表和B。
A.循环链表B.多重链表C.普通链表D.无头结点链表
19.在数据结构中,与所使用的计算机无关的数据叫C结构。
A.存储B.物理C.逻辑D.物理和存储
20.二分法查找A存储结构。
A.只适用于顺序B.只适用于链式C.既适用于顺序也适用于链式
D.既不适合于顺序也不适合于链式
21.在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上B。
A.一定相邻B.不一定相邻C.有时相邻
22.设字符串s1='
abcdefg'
s2='
pqrst'
,则运算
s=concat(sub(s1,2,len(s2)),sub(s1,len(s2),2))后串值为D。
A.'
bcdef'
B.'
bcdefg'
C.'
bcpqrst'
D.'
bcdefef'
sub函数是截取
Concat函数是连接
23.假定在一棵二叉树中,双分支结点数为15个,单分支结点数为32个,则叶子结点数为B。
A.15B.16C.17D.47
性质1:
在非空二叉树中,第i层上至多有2i-1个结点(i≧1)。
性质2:
深度为k的二叉树至多有2k-1个结点(k≧1)。
性质3:
对任何一棵二叉树,若其叶子结点数为n0,度为2的结点数为n2,则n0=n2+1。
性质4:
n个结点的完全二叉树深度为:
㏒2n+1。
性质5:
若对一棵有n个结点的完全二叉树(深度为└㏒2n┘+1)的结点按层(从第1层到第㏒2n+1层)序自左至右进行编号,则对于编号为i(1≦i≦n)的结点:
⑴若i=1:
则结点i是二叉树的根,无双亲结点;
否则,若i>
1,则其双亲结点编号是i/2。
⑵如果2i>
n:
则结点i为叶子结点,无左孩子;
否则,其左孩子结点编号是2i。
⑶如果2i+1>
则结点i无右孩子;
否则,其右孩子结点编号是2i+1。
24.假定一棵二叉树的结点数为18个,则它的最小高度B。
A.4B.5C.6D.18
性质2:
25.在一棵二叉树中第五层上的结点数最多为C。
A.8B.15C.16D.32
满2叉树节点肯定最多。
深度为k的二叉树至多有2k-1个结点(k≧1)。
26.在一棵具有五层的满二叉树中,结点总数为A。
A.31B.32C.33D.16
27.已知8个数据元素为(34、76、45、18、26、54、92、65),按照依次插入结点的方法生成一棵二叉排序树后,最后两层上的结点总数为B。
A.1B.2C.3D.4
28.由分别带权为9、2、5、7的四个叶子结点构造一棵哈夫曼树,该树的带权路径长度为C。
A.23B.37C.44D.46
首先构造哈夫曼树然后求带权路径长度
29.在树中除根结点外,其余结点分成m(m≥0)个A的集合T1,T2,T3...Tm,每个集合又都是树,此时结点T称为Ti的父结点,Ti称为T的子结点(1≤i≤m)。
A.互不相交B.可以相交
C.叶结点可以相交D.树枝结点可以相交
30.在完全二叉树中,当i为奇数且不等于1时,结点i的左兄弟是结点D,否则没有左兄弟。
A.2i-1B.i+1C.2i+1D.i-1
完全二叉树概念
二、填空题
1.在线性结构中第一结点[1]无前驱结点,其余每个结点有且只有[2]一个前驱结点;
最后一个结点[3]无后继结点,其余每个结点有且只有[4]一个后继结点。
2.在树型结构中,树根结点没有[1]前趋结点,其余每个结点有且仅有[2]一个前驱结点;
树叶结点没有[3]后继结点,其余每个结点的[4]后继结点数不受限制。
3.一个数据结构用二元组表示时,它包括[1]数据元素的集合K和K上[2]二元关系的集合R。
**4.对于一个二维数组A[1..m,1..n],若按行序为主序存储,则任一元素A[i,j]的相对地址(即偏移地址)为[1](i-1)*n+j-1。
以“行优先顺序”存储
⑴第1行中的每个元素对应的(首)地址是:
LOC[a1j]=LOC[a11]+(j-1)lj=1,2,…,n
(2)第2行中的每个元素对应的(首)地址是:
LOC[a2j]=LOC[a11]+nl+(j-1)lj=1,2,…,n
………
⑶第m行中的每个元素对应的(首)地址是:
LOC[amj]=LOC[a11]+(m-1)nl+(j-1)lj=1,2,…,n
5.对于顺序存储的线性表,当随机插入或删除一个元素时,约需平均移动表长[1]一半的元素。
6.对于长度为n的顺序表,插入或删除元素的时间复杂性为[1]O(n);
对于顺序栈或队列,插入或删除元素的时间复杂性为[2]O
(1)。
7.在具有n个单元、顺序存储的循环队列中,队满时共有[1]n-1个元素。
8.从顺序表中删除第i个元素时,首先把第i个元素赋给[1]变参或函数名带回,接着从[2]链接指针开始向后的所有元素均[3]前移一个位置,最后使线性表的长度[4]减1。
9.在线性表的顺序存储中,元素之间的逻辑关系是通过[1]相邻位置决定的;
在线性表的链接存储中,元素之间的逻辑关系是通过[2]链接指针决定的。
10.一个单链表中删除*p结点时,应执行如下操作:
(1)q=p->
(2)p->
data=p->
data;
(3)p->
next=[1]q->
next或p->
next;
(4)free(q);
11.若要在一个单链表中的*p结点之前插入一个*s结点时,可执行如下操作:
(1)s->
next=[1]p->
(3)t=p->
(4)p->
data=[2]s->
data;
(5)s->
data=[3]t;
12.对于线性表的顺序存储,需要预先分配好存储空间,若分配太多则容易造成存储空间的[1]浪费,若分配太少又容易在算法中造成[2]溢出,因此适应于数据量变化不大的情况;
对于线性表的链接存储(假定采用动态结点),不需要[3]预先分配存储空间,存储器中的整个[4]动态存储区都可供使用,分配和回收结点都非常方便,能够有效地利用存储空间,在算法中不必考虑[5]溢出的发生,因此适应数据量变化较大的情况。
13.无论对于顺序存储还是链接存储的栈和队列来说,进行插入或删除运算的时间复杂性均相同,则为[1]O
(1)。
┏0020┓
**14.一个稀疏矩阵为┃3000┃,则对应的三元组线性表为
┃00-15┃((1,3,2),(2,1,3),(3,3,-1),(3,4,5))。
┗0000┛
15.对于一棵具有n个结点的树,则该树中所有结点的度之和为n-1。
16.在一棵二叉树中,度为0的结点的个数为n0,度为2的结点的个数为n2,则:
n0=n2+1。
17.在二叉树的顺序存储中,对于下标为5的结点,它的双亲结点的下标为[1]2,若它存在左孩子,则左孩子结点的下标为[2]10,若它存在右孩子,则右孩子结点的下标为[3]11。
20.由分别带权为3,9,6,2,5的共五个叶子结点构成一棵哈夫曼树,则带权路径长度为
55。
┏━━┳━━┳━━━┓
21.假定在二叉树的链接存储中,每个结点的结构为┃left┃data┃right┃,其中
┗━━┻━━┻━━━┛
data为值域,left和right分别为链接左、右孩子结点的指针域,请在下面中序遍历算法中画有横线的地方填写合适的语句。
voidinorder(bt);
{ifbt!
=nil{
(1)[1]inorder(bt->
left);
(2)[2]printf(bt->
data);
(3)[3]inorder(bt->
right);
}
}
3、判断题
1.数据元素是数据的最小单位(×
)。
2.数据项是数据的基本单位(×
3.顺序存储的线性表可以随机存取(√)。
4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此,是属于同一数据对象(√)。
5.在单链表中,任何两个元素的存储位置之间都有固定的联系,因为可以从头结点查找任何一个元素(×
6.在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构(×
7.链表的每个结点中,都恰好包含一个指针(×
**8.数组是同类型值的集合(×
//不是集合//
**9.使用三元组表示稀疏矩阵的元素,有时并不能节省存储时间(√)。
**10.线性表可以看成是广义表的特例,如果广义表中的每个元素都是原子,则广义表便成为线性表(√)。
11.由树转换成二叉树,其根结点的右子树总是空的(√)。
12.后序遍历树和中序遍历与该树对应的二叉树,其结果不同(×
13.若有一个结点是某二叉树子树的中序遍历序列中的最后一个结点,则它必是该子树的前序遍历序列中的最后一个结点(×
14.若一个树叶是某子树的中序遍历序列中的最后一个结点,则它必是该子树的前序遍历序列中的最后一个结点(√)。
15.已知二叉树的前序遍历和后序遍历序列并不能唯一地确定这棵树,因为不知道树的根结点是哪一个(×
16.在哈夫曼编码中,当两个字符出现的频率相同时,其编码也相同,对于这种情况应作特殊处理(×
四、综合题
1.线性表有两种存储结构:
一是顺序表,二是链表。
试问:
(1)两种存储表示各有哪些主要优缺点?
(2)如果有n个线性表同时并存,并且在处理过程中各表的长度会动态发生变化,线性表的总数也会自动地改变。
在此情况下,应选用哪种存储结构?
为什么?
(3)若线性表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取线性表中的元素,那么,应采用哪种存储结构?
1.解答:
(1)顺序存储是按索引(隐含的)直接存取数据元素,方便灵活,效率高,但插入、删除操作时将引起元素移动,因而降低效率;
链接存储内存采用动态分配,利用率高,但需增设指示结点之间有序关系的指针域,存取数据元素不如顺序存储方便,但结点的插入、删除操作十分简单。
(2)应选用链接表存储结构。
其理由是,链式存储结构用一组任意的存储单元依次存储线性表里各元素,这里存储单元可以是连续的,也可以是不连续的。
这种存储结构,在对元素作插入或删除运算时,不需要移动元素,仅修改指针即可。
所以很容易实现表的容量扩充。
(3)应选用顺序存储结构。
其理由是,每个数据元素的存储位置和线性表的起始位置相差一个和数据元素在线性表中的序号成正比的常数。
由此,只要确定了起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。
而链表则是一种顺序存取的存储结构。
2.用线性表的顺序结构来描述一个城市的设计和规划合适吗?
2.解答:
不合适。
因为一个城市的设计和规划涉及非常多的项目,很复杂,经常需要修改、扩充和删除各种信息,才能适应不断发展的需要。
有鉴于此,顺序线性表不能很好适应其需要,故是不合适的。
3.在单链表和双向表中,能否从当前结点出发访问到任一结点?
3.解答:
在单链表中只能由当前结点访问其后的任一结点,因为没有指向其前驱结点的指针。
而在双向链表中,既有指向后继结点的指针又有指向前驱结点的指针,故可由当前结点出发访问链表中任一结点。
4.试述栈的基本性质?
4.解答:
由栈的定义可知,这种结构的基本性质综述如下:
(1)集合性。
栈是由若干个元素集合而成,当没有元素的空集合称为空栈;
(2)线性结构。
除栈底元素和栈顶元素外,栈中任一元素均有唯一的前驱元素和后继元素;
(3)受限制的运算。
只允许在栈顶实施压入或弹出操作,且栈顶位置由栈指针所指示;
(4)数学性质。
当多个编号元素依某种顺序压入,且可任意时刻弹出时,所获得的编号元素排列的数目,恰好满足卡塔南数列的计算,即:
Cn=Cn2n/(n+1)
其中,n为编号元素的个数,Cn是可能的排列数目。
5.何谓队列的上溢现象?
解决它有哪些方法,且分别简述其工作原理。
5.解答:
在队列的顺序存储结构中,设队头指针为front,队尾指针为rear,队的容量(存储空间的大小)为m。
当有元素要加入队列时,若rear=m(初始时reat=0),则发生队列的上溢现象,该元素不能加入队列。
这里要特别注意的是:
队列的假溢出现象,队列中还有空余的空间,但元素不能进队列。
造成这种现象的原因是由于队列的操作方式所致。
解决队列的上溢有以下几种方法:
(1)建立一个足够大的存储空间,但这样做往往会造成空间使用的效率低。
(2)当出现假溢出时,可采用以下几种方法:
①采用平移元素的方法。
每当队列中加入一个元素时,队列中已有的元素向队头移动一个位置(当然要有空余的空间可移);
②每当删去一个队头元素时,则依次序移队中的元素,始终使front指针指向队列中的第一个位置;
③采用循环队列方式。
把队头队尾看成是一个首尾相邻的循环队列,虽然物理上队尾在队首之前,但逻辑上队首依然在前,作插入和删除运算时仍按“先进先出”的原则。
6.两个字符串相等的充要条件是什么?
6.解答:
两个字符串相等的充要条件是:
两个串的长度相等,且对应位置的字符相等。
9.试证明:
已知一棵二叉树的前序序列和中序序列,则可唯一地确定一棵二叉树。
9.证明
利用前序遍历的结果序列能够得到各子树的根,即从左到右检查前序遍历序列,当得到根结点之后,利用根结点在中序遍历序列中的位置可以确定其左右子树,这样便可逐次确定整个二叉树。
假设BT为二叉树的根,P1,P2,…,Pn为前序遍历序列,I1,I2,…,In为中序遍历序列。
由前序遍历序列可以得到BT=P1。
在中序遍历序列中查找等于P1的结点,设该结点为Ii,则有Ii=P1。
根据二叉树中序遍历的原理,则该二叉树可被分成左右两棵子树:
对于左子树,在中序遍历序列中有I1,I2,…,Ii-1,依此序列在前序遍历序列中可以得到其左子树为P2,P3,…,Pi;
同理,对于右子树有
Ii+1,Ii+2,…,In
Pi+1,Pi+2,…,Pn
对于这两棵子树而言,其左子树的根为P2,其右子树的根为Pi+1。
依此类推,用同样的方法就可以确定整个二叉树。
22.编写下列算法,假定单链表的表头指针用HL表示,类型为linklist。
(1)将一个