完整word版学年《数据结构》B.docx
《完整word版学年《数据结构》B.docx》由会员分享,可在线阅读,更多相关《完整word版学年《数据结构》B.docx(12页珍藏版)》请在冰豆网上搜索。
![完整word版学年《数据结构》B.docx](https://file1.bdocx.com/fileroot1/2022-11/26/b8103579-ba45-4af4-b1b1-6cefce982ace/b8103579-ba45-4af4-b1b1-6cefce982ace1.gif)
完整word版学年《数据结构》B
华侨大学《数据结构》试卷(B)
系别:
班级:
学号:
姓名:
考试日期:
年月日
题号
一
二
三
四
五
总分
得分
一、选择填空题(每题1.5分,共15分)
1、 在一个长度为n的顺序线性表中顺序查找值为x的元素时,查找成功时的平均查找长度(即x与元素的平均比较次数,假定查找每个元素的概率都相等)为()。
AnBn/2C(n+1)/2D(n-1)/2
2、已知单链表A长度为m,单链表B长度为n,若将B联接在A的末尾,其时间复杂度应为()。
AO
(1) BO(m) CO(n) DO(m+n)
3、 若进栈序列为a,b,c,则通过入出栈操作可能得到的a,b,c的不同排列个数为()。
A4B5C6D7
4、 由权值分别为11,8,6,2,5的叶子结点生成一棵赫夫曼树,它的带权路径长度WPL为()。
A24B71C48D53
5、已知函数Sub(s,i,j)的功能是返回串s中从第i个字符起长度为j的子串,函数Scopy(s,t)的功能为复制串t到s。
若字符串S=″SCIENCESTUDY″,则调用函数Scopy(P,Sub(S,1,7))后得到()。
AP=″SCIENCE″BP=″STUDY″CS=″SCIENCE″DS=″STUDY″
6、二维数组A[4][7]按列优先存储方法存储在内存中,若每个元素占2个存储单元,且数组中第一个元素的存储地址为120,则元素A[3][4]的存储地址为()。
A139B145C158D162
7、下列陈述中正确的是()。
A二叉树是度为2的有序树
B二叉树中结点只有一个孩子时无左右之分
C二叉树中必有度为2的结点
D二叉树中最多只有两棵子树,并且有左右之分
8、n个顶点的无向完全图中含有向边的数目最多为()。
An-1BnCn(n-1)/2Dn(n-1)
9、假定一个链式队列的队头和队尾指针分别为front和rear,则判断队空的条件为()。
Afront==rear Bfront!
=NULL
Crear!
=NULL Dfront==NULL
10、下列排序方法中,哪一种方法的比较次数与纪录的初始排列状态无关?
()
A直接插入排序B冒泡排序C快速排序D简单选择排序
二、填空题(每空1分,共10分)
1、若一个算法中的语句频度之和为T(n)=3720n+4nlogn,则算法的时间复杂度为。
2、数据结构的存储结构包括顺序、、索引和散列等四种。
3、假设一个10阶的下三角矩阵A,按行优先顺序压缩存储在一维数组C中,则C数组的大小应为____________________。
4、一棵高度为4的二叉树中最少含有个结点,最多含有个结点;一棵高度为4的完全二叉树中,最少含有个结点,最多含有个结点。
5、在对长度为n的关键字序列进行堆排序的过程中,对堆顶元素进行堆调整的筛选运算的时间复杂度为,整个堆排序过程的时间复杂度为。
6、若对序列{49,38,65,97,76,13,27,50}采用冒泡排序法排序,则第二趟结束后序列的状态是。
三、解答题(每题5分,共30分)
1、指出下面算法中,带下划线的语句的语句频度,并估计该算法的时间复杂度。
intfun(intn)
{
s=0;t=0;
for(i=1;is+=2;
for(j=n;j>=i;j--)t++;
}
returns+t;
}
2、设循环队列的总长度为5,入队的序列为A1,A2,A3,A4,然后A1,A2出队,最后A5,A6入队,请画出最后的循环队列,并写出在循环队列中判断队空和队满的条件。
3、某二叉树bt中序遍历序列为:
ABCEFGHD,后序遍历序列为:
ABFHGEDC,请构造该二叉树(画出树形),并画出对应的先序线索(不带头结点)。
4、试画出如下图的无向图G的邻接表表示,要求邻接表中的各顶点的邻接链表中的表结点按顶点序号从小到大排列。
根据你所给出的邻接表,给出从A出发的深度优先搜索序列,并给出其深度优先搜索dfs生成树。
5、设有一个关键字输入序列{31,55,11,37,46,73,7},试从空树开始构造平衡二叉排序树,画出每加入一个结点时二叉树的形态,若发生不平衡,请指出平衡调整的类型和调整结果。
最后,计算在等概率情况下,查找成功的平均查找长度ASL。
6、判别序列{12,2,16,30,8,28,4,10,20,6,18}是否为大顶堆,如果不是,则写出将其调整为大顶堆的过程(用树形表示)。
四、算法阅读题(每题5分,共15分)
1、head为不带头结点的单链表头指针,链表中结点的域有数据域data和指针域next,阅读下面算法,指出该算法的功能。
voidfun1(Linklist&head)
{
p=head;
while(p!
=NULL){
q=p;r=p->next;
while(r!
=NULL){
if(r->datadata)q=r;
r=r->next;
}
temp=q->data;q->data=p->data;p->data=temp;p=p->next;
}
2、阅读下面算法,指出该算法的功能。
voidfun2(charstr[])
{
StackT;inti=0;
InitStack(T);//初始化栈T
while(str[i]!
=’\0’){
Push(T,str[i]);
i++;
}
i=0;
while(!
StackEmpty(T)){//判断栈T是否为空栈
Pop(T,str[i]);
i++;
}
}
3、设二叉树t采用二叉链表存储结构,阅读下面算法,指出该算法的功能。
intfun3(BiTreet)
{
if(t==NULL)return0;
elseif((t->lchild==NULL)&&(t->rchild==NULL))return1;
elsereturn(fun3(t->lchild)+algo3(t->rchild));
}
五、算法设计题(共30分)
(说明:
你所设计算法中若需调用基本操作,需给出实现该基本操作的算法)
1、L为带头结点的单链表头指针且链表长度大于2,试设计算法删除链表L的尾结点,并将该结点插入到链表L的首结点之前(即头结点之后)。
(10分)
2、设二叉排序树bt以二叉链表为存储结构,试设计算法删除二叉排序树bt中值最小的结点。
(8分)
3、试设计算法Create_dg(algraph&g1,Mgraphg2),将邻接表表示的有向图g1,转换成数组表示的有向图g2。
(12分)
#defineINFINITYINT_MAX
#defineMAX_NUM20
//图的数组(邻接矩阵)存储表示:
typedefstructArcCell{
VRTypeadj;
InfoType*info;
}ArcCell;
typedefstruct{
VertexTypevexs[MAX_NUM];
ArcCellarcs[MAX_NUM][MAX_NUM];
intvexnum,arcnum;
}MGraph;
//图的邻接表存储表示:
typedefstructArcNode{
intadjvex;
structArcNode*nextarc;
}ArcNode;
typedefstructVNode{
VertexTypedata;
ArcNode*firstarc;
}VNode;
typedefstruct{
VNodevertices[MAX_NUM];
intvexnum,arcnum;
}ALGraph;
B卷参考答案
一、选择题(共15分,每小题1.5分)
题号
1
2
3
4
5
答案
题号
6
7
8
9
10
答案
二、填空题(共10分,每小题1分)
1.
2.
3.
4.
5.
6.
三、解答题(共30分,每小题5分)
1.s+=2;的语句频度是n-1-----------------------(1分)
t++;的语句频度是(n-1)(n+2)/2---------------(2分)
该算法的时间复杂度是O((n-1)(n+2)/2)=O(n2)----(2分)
2.最后的循环队列如下图所示:
(2分)
01234
队空的条件(1.5分):
Q.rear等于Q.front
队满的条件(1.5分):
(Q.rear+1)mod5等于Q.front
3.该二叉树先序序列为CBADEGFH(2分),对应的中序线索二叉树(不带头结点)为:
(3分)
4.无向图G的邻接表表示如下:
(2分)
从A出发的深度优先搜索序列:
A,D,E,B,C(1.5分),
相应的深度优先搜索生成树为:
(1.5分)
5.构造过程如下:
(3.5分)
φ
ASLsucc=1/7(1*1+2*2+3*3+4*1)=18/7(1.5分)
6.按照层次遍历方法写成二叉树(1分):
12
/ \
2 16
/ \ / \
30 8 28 4
/ \ / \
10 20 6 18
序列一共有11个值应该从[11/2]处开始交换,即第5个值8处开始建堆操作将该子树调整为大根堆:
(4分)
1、 12
/ \
2 16
/ \ / \
30 18 28 4
/ \ / \
10 20 6 8
2、对30进行操作发现该子树已是大根堆不用调整接着对16进行操作
12
/ \
2 28
/ \ / \
30 18 16 4
/ \ / \
10 20 6 8
3、对2进行操作
12
/ \
30 28
/ \ / \
20 18 16 4
/ \ / \
10 2 6 8
4、对根结点12进行操作
30
/ \
20 28
/ \ / \
12 18 16 4
/ \ / \
10 2 6 8
四、算法阅读题(共15分,每小题5分)
1.用链表表示的数据的简单选择排序,结点的域为数据域data,指针域next;链表首指针为head,链表无头结点。
p指向无序区第一个记录,q指向最小值结点,一趟排序结束,p和q所指结点值交换,同时向后移p指针。
2.字符串倒序存放。
3.求二叉树t中的叶子结点个数
五、算法设计题(共30分)
1.voiddef_l_ins_f(Linklist&l){--------1分
//删除尾结点,插入在首结点之前
q=l;p=l->next;--------2分
while(p->nexet){q=p;p=p->next;}//p指向尾结点,q相随--------4分
q->next=NULL;//删除--------1分
p->next=l->next;//插入--------1分
l->next=p;--------1分
}//del_l_ins_f
2.Statusdel_min(BiTree&bt){--------1分
//删除二叉排序树bt中值最小的结点
if(!
bt)returnERROR;//空树
p=bt;
if(bt->lchild==NULL){//根无左子树--------2分
bt=bt->rchild;p->rlchild=NULL;//此语句可不要
free(p);
}
else{
while(p->lchild!
=NULL){//p移至最左下结点
q=p;p=p->lchild;}
if(p->rchild!
=NULL)//有右子树--------5分
q->lchild=p->rchild;
elseq->lchild=NULL;//无右子树
free(p);
}
}//del_min
3.StatusCreate_dg(Algraphg1,Mgraph&g2){--------1分
//将邻接表表示的有向图g1转换成数组表示的有向图g2
g2.vexnum=g1.vexnum;g2.arcnum=g1.arcnum;--------1分
for(i=0;ig2.vexs[i]=g1.vertices[i].data;
for(i=0;ifor(j=0;jg2.arcs[i][j]=0;
for(i=0;ip=g1.vertices[i].firstarc;
while(p){
j=p->adjvex;
g2.arcs[i][j]=1;
p=p->nextarc;
}//while
}//for-i
returnOK;
}Create_dg