软件班数据结构复习题.docx
《软件班数据结构复习题.docx》由会员分享,可在线阅读,更多相关《软件班数据结构复习题.docx(14页珍藏版)》请在冰豆网上搜索。
软件班数据结构复习题
数据结构复习样题2
一.单项选择题
【】1.组成数据的基本单位是
[A]数据项[B]数据元素[C]数据类型[D]数据变量
【】2.采用链式存储结构便于实现对线性表的
[A]插入[B]遍历[C]查找[D]定位
【】3.若循环队列用数组A[0..m-1]存放元素,其头尾指针分别为front和rear,则当前队列的长度是
[A](rear–front+m)%m[B]rear–front+1
[C]rear–front–1[D](rear–front)%m
【】4.已知广义表A=((a,b,c),(d,e,f)),从表A中取出原子e的运算是
[A]tail(tail(head(A)))[B]head(tail(tail(A)))
[C]tail(head(tail(head(A))))[D]head(tail(head(tail(A))))
【】5.具有2000个结点的二叉树,其高度至少为
[A]9[B]10[C]11[D]12
【】6.在邻接矩阵A中,第i顶点的入度为A中
[A]第i行非∞元素个数[B]第i列非∞元素个数
[C]第i行非∞且非0元素个数[D]第i列非∞且非0元素个数
【】7.对一个长度为12的有序表进行等概率的折半查找,查找成功所需的关键字比较平均次数为
[A]35/12[B]37/12[C]39/12[D]43/12
【】8.在下列所示的平衡二叉树中插入关键字48后得到一棵新平衡二叉树,在新平衡二叉树中,关键字37所在结点的左、右子结点保存的关键字分别是()
A.13,48
B.24,48
C.24,53
D.24,90
二.填空题
9.构成抽象数据类型的三个要素是数据对象、数据关系和___________________。
10.循环链表的主要优点是___________________________________。
11.具有后进先出特点的数据结构是。
12.在队列结构中,允许插入的一端称为______________________________。
13.前序和中序序列相同的二叉树的特征是____________________________________。
三.解答题
17.请直接在以下二叉树中添加后序线索。
18.已知一个长度为12的表为
(Jan,Feb,Mar,Apr,May,June,July,Aug,Sep,Oct,Nov,Dec)
(1)试将表中元素依次插入到一棵初始为空的二叉排序树(字符串之间按字典顺序比较大小)。
画出该二叉排序树,并求出等概率情况下查找成功的平均查找长度。
(2)设哈希表长度为13,哈希函数H(k)=i/2,其中i为关键字k中第一个字母在字母表中的序号(例如A和D的序号分别为1和4),用链地址法解决冲突。
请画出通过依次插入表中元素所构造的散列表,并求出在等概率情况下查找成功的平均查找长度。
19.假设电文中仅由a到h共8个字母组成,字母在电文中出现的频度依次为7,19,2,6,32,3,21,10
请画出由此构造的哈夫曼树(要求树中所有结点的左右孩子必须是左大右小),并写出这8个字母相应的哈夫曼编码。
20.若对序列(25,19,7,41,29,12,23,26)按升序排序,请分别给出
(1)步长为4的一趟希尔排序的结果;
(2)初始大根堆。
21.对于右边的带权图G,请
(1)画出G的邻接矩阵;
(2)画出G的最小生成树。
四.算法题
22.函数f22定义如下,其中函数调用Insert(L,i,k)在顺序表L的第i位置插入k。
voidf22(SqList&L,inti){
if(i>0){
f22(L,i-1);
for(intk=1;k<=i;k++)
Insert(L,i,k);
}
}
设有空顺序表L=(),请写出调用递归函数f22(L,3)后
(1)L的长度:
(2)L=()
23.算法f23(L)将带头结点的单链表L逆置。
请在画线处填空。
voidf23(LinkList&L){
LinkListp=L->next;
L->next=;
while(p){
LinkLists=;
p->next=L->next;
L->next=;
p=s;
}
}
24.s是一个升序静态查找表,请简要说明函数调用f24(s,1,s.length,k)的意义。
intf24(SSTables,intlow,inthigh,KeyTypek){
if(low>high)return0;
intmid=(low+high)/2;
if(k==s.elem[mid].key)returnmid;
if(k>s.elem[mid].key)returnf24(s,mid+1,high,k);
elsereturnf24(s,low,mid-1,k);
}
25.请对以下函数填空,实现求二叉树T中各结点的子孙总数,并填入结点的DescNum域中的算法。
intf25(BiTreeT){
if()return-1;
else{
T->DescNum=f25(T->lchild)+
+
;
returnT->DescNum;
}
}
26.图的邻接矩阵表示和算法f26描述如下:
#defineMaxNum5
typedefstruct{
charvexs[MaxNum];intarcs[MaxNum][MaxNum];intn,e;
}MGraph;
intf26(MGraphG,inti){
intd=0;
for(intj=0;jif(G.arcs[i][j])d++;
if(G.arcs[j][i])d++;
}
returnd;
}
已知一个图G的邻接矩阵如下所示,
(1)给出执行算法调用f26(G,4)的返回值;
(2)简述该算法返回值的意义。
五、算法设计题
请设计实现删除单链表中值相同的多余结点的算法,写出算法的C语言描述。
函数定义:
voidpurge(LinkListL)
单链表类型定义如下:
typedefstructLNode{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
六、附加题
注意:
不答题或打错不扣分。
如答题得到的相应分数累加到总分
编写递归算法,计算二叉树中叶子结点的数目。
要求实现下列函数:
voidLeaves(BiTreebt,int&x);
/*CounttheleafnodeoftheBiTree*/
/*whoserootnodeisbttox.*/
二叉链表类型定义:
typedefstructBiTNode{
TElemTypedata;
BiTNode*lchild,*rchild;
}BiTNode,*BiTree;
数据结构复习样题答案2
一.单项选择题
1.B2.A3.A4.D5.C6.D7.B8.C
二.填空题
9.基本操作
10.从表中任一结点出发均可找到表中其他结点
11.栈
12.队尾
13.各结点均无左孩子
三.解答题
17.后序线索
18.已知一个长度为12的表为
(Jan,Feb,Mar,Apr,May,June,July,Aug,Sep,Oct,Nov,Dec)
(3)试将表中元素依次插入到一棵初始为空的二叉排序树(字符串之间按字典顺序比较大小)。
画出该二叉排序树,并求出等概率情况下查找成功的平均查找长度。
(4)设哈希表长度为13,哈希函数H(k)=i/2,其中i为关键字k中第一个字母在字母表中的序号(例如A和D的序号分别为1和4),用链地址法解决冲突。
请画出通过依次插入表中元素所构造的散列表,并求出在等概率情况下查找成功的平均查找长度。
0
1
2
3
4
5
6
7
8
9
10
11
12
May
Aug
Sep
Nov
Dec
Feb
July
Mar
Apr
Oct
June
Jan
成功的平均查找长度=18/12
19.假设电文中仅由a到h共8个字母组成,字母在电文中出现的频度依次为
7,19,2,6,32,3,21,10
请画出由此构造的哈夫曼树(要求树中所有结点的左右孩子必须是左大右小),并写出这8个字母相应的哈夫曼编码。
字符
哈夫曼码
a
0101
b
11
c
01111
d
0110
e
00
f
01110
g
10
h
0100
20.若对序列(25,19,7,41,29,12,23,26)按升序排序,请分别给出
(3)步长为4的一趟希尔排序的结果;
(4)初始大根堆。
答:
(1)(25,12,7,26,29,19,23,41)
(2)(41,29,23,26,25,12,7,19)
21.对于右边的带权图G,请
(3)画出G的邻接矩阵;
(4)画出G的最小生成树。
答:
(1)
(2)
四.算法题
22.函数f22定义如下,其中函数调用Insert(L,i,k)在顺序表L的第i位置插入k。
voidf22(SqList&L,inti){
if(i>0){
f22(L,i-1);
for(intk=1;k<=i;k++)
Insert(L,i,k);
}
}
设有空顺序表L=(),请写出调用递归函数f22(L,3)后
(1)L的长度:
6
(2)L=(1,2,3,2,1,1)
23.算法f23(L)将带头结点的单链表L逆置。
请在画线处填空。
voidf23(LinkList&L){
LinkListp=L->next;
L->next=NULL;
while(p){
LinkLists=p->next;
p->next=L->next;
L->next=p;
p=s;
}
}
24.s是一个升序静态查找表,请简要说明函数调用f24(s,1,s.length,k)的意义。
intf24(SSTables,intlow,inthigh,KeyTypek){
if(low>high)return0;
intmid=(low+high)/2;
if(k==s.elem[mid].key)returnmid;
if(k>s.elem[mid].key)returnf24(s,mid+1,high,k);
elsereturnf24(s,low,mid-1,k);
}
答:
在s中递归折半查找k。
25.请对以下函数填空,实现求二叉树T中各结点的子孙总数,并填入结点的DescNum域中的算法。
intf25(BiTreeT){
if(!
T)return-1;
else{
T->DescNum=f25(T->lchild)+
f25(T->rchild)+
2;
returnT->DescNum;
}
}
26.图的邻接矩阵表示和算法f26描述如下:
#defineMaxNum5
typedefstruct{
charvexs[MaxNum];intarcs[MaxNum][MaxNum];intn,e;
}MGraph;
intf26(MGraphG,inti){
intd=0;
for(intj=0;jif(G.arcs[i][j])d++;
if(G.arcs[j][i])d++;
}
returnd;
}
已知一个图G的邻接矩阵如右所示,
(1)给出执行算法调用f26(G,4)的返回值;答:
5;
(2)简述该算法返回值的意义。
答:
求图G第i顶点的度。
五、算法设计题
请设计实现删除单链表中值相同的多余结点的算法,写出算法的C语言描述。
voidpurge(LinkListL){
//删除链表中的“冗余”元素
LinkLists,q,p=L->next;
while(p){//p指向当前被考察的结点
q=p;
while(q->next)//考察q所指后继结点
if(q->next->data!
=p->data)q=q->next;
else//修改指针并释放结点空间
{s=q->next;q->next=s->next;free(s);}
p=p->next;
}//whilep
}//purge
六、附加题
voidLeaves(BiTreebt,int&x)
{
if(bt==null)return;
Leaves(bt->lchild,x);
Leaves(bt->rchild,x);
if((bt->lchild==null)&&(bt->rchild==null))
x++;
}