数据结构试题与解析
1、 已知指针指向一个带头结点的非空单循环链表,结点结构data、next,其中next是指向直接后继结点的指针,p是尾指针,q是临时指针。现要删除该链表的第一个元素,正确的语句序列是()
A. h->next=h->next->next;q=h->next;free(q);
B. q=h->next;h->next=h->next->next;free(q);
C. q=h->next;h->next=q->next;if(p!=q)p=h;free(q);
D. q=h->next;h->next=q->next;if(p=q)p=h;free(q);
答案:D
解析:
A选项中,h->next=h->next->next修改了头结点的后继,q指针指向的不是待删除的第一个结点,A错;
B选项中,假设这个链表中只剩下最后一个结点(即尾指针p指向的结点),q=h->next q指针指向带删除的第一个结点(最后一个结点),则删除后,还需要修改p指针,B错;
C、D选项中,q=h->next;h->next=q->next,q指针指向待删除的第一个结点,头结点指向第二个结点,此时若尾指针p和q指针指向同一个位置的话,则我们需要修改尾指针p,将其指向头结点(空单循环链表),则选D
2、 已知初始为空的队列Q的一端能进行入队操作又能进行出队操作,另一端能进行入队操作,若a的入队序列是1,2,3,4,5,则不可能得到的出队序列是()
A.5,4,3,1,2
B.5,3,1,2,4
C.4,2,1,3,5
D.4,1,3,2,5
答案:D
解析:
A选项,1左入右入都可,2右入,3左入,4左入,5左入,得到5,4,3,1,2
B选项,1左入右入都可,2右入,3左入,4右入,5左入,得到5,3,1,2,4
C选项,1左入右入都可,2左入,3右入,4左入,5右入,得到4,2,1,3,5
D选项,1左入右入都可,2右入,错误,3不可能在1和2的中间
3、 已知二维数组A按行优先方法存储,每个元素占用1个存储单元,起始地址A[0][0]为100,若元素A[3][3]的存储地址是220,则元素A[5][5]的存储地址是()
A.295
B.300
C.301
D.306
答案:B
解析:
首先分析题干信息,按行优先方法存储,二维数组的行、列下标都是从0开始,并且已知起始存储地址为100,假设二维数组有n行m列。
LOC(A[3][3])= LOC(A[0][0])+(3*m+4-1)*1=220,可以求出m=39
则LOC(A[5][5])= LOC(A[0][0])+(5*39+6-1)*1=300,选B
4、 某森林F对应的二叉树为T,若T的先序遍历序列是a,b,d,c,e,g,f,中序遍历序列是b,d,a,e,g,c,f,则F中树的棵树是()
A.1
B.2
C.3
D.4
答案:C
解析:
本题考查根据树的遍历序列构造一个唯一的二叉树,再将二叉树转换成对应的森林。
首先先构造二叉树:
根据孩子兄弟表示法转换成对应的森林:
则可以得到有3棵树,选C
5、 若某二叉树有5个叶子结点,其权值分别为10,12,16,21,30。则其最小的带权路径长度(WPL)是()
A.89
B.200
C.208
D.289
答案:B
解析:
本题考查哈夫曼树的构造,以及WPL的计算
WPL=(16+21+30)*2+(10+12)*3=200,选B
6、 给定平衡二叉树如下图所示,放入关键字23后根中的关键字是()
A.16
B.20
C.23
D.25
答案:D
解析:
插入23后,树的形态如下:
则根节点20不平衡,平衡因子为1-3=-2,则需要旋转调整后,得到平衡二叉树如下:
根为25,选D
7、给定如下有向图,该图的拓扑有序序列的个数是()
A.1
B.2
C.3
D.4
答案:A
解析:
拓扑排序解决步骤如下:
(1)在有向图中选一个没有前驱(入度为0)的顶点且输出之。
(2)从图中删除该顶点和所有以它为尾的弧。
重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止。后一种情况则说明有向图中存在环。
根据此有向图,可得到拓扑排序序列只有一个:ABCDEF
8、 使用Dijkstra算法求下图中从顶点1到其余个顶点的最短路径,将当前找到的从顶点1到顶点2,3,4,5的最短路径长度保存在数组dist中,求出第二条最短路径后,dist中的内容更新为()没有图暂时无法给出答案与解析,后续补上
A.26,3,14,6
B.25,3,14,6
C.21,3,14,6
D.15,3,14,6
9、 在一棵高度为3 的3阶B树中,根为第一层,若第二层有4个关键字,则该树的结点个数最多是()
A.11
B.10
C.9
D.8
答案:A
解析:
根据B树的定义,3阶B树满足:除根之外的所有非终端节点至少有2棵子树;所有非终端结点的关键字个数n的取值范围为:1<=n<=2
已知根为第一层,若第二层有4个关键字,则该树第一层1个结点,3个分支,第二层3个结点,由于有4个关键字,所以3个结点的分支树分别为2,2,3,第三层7个结点。
总结点个数最多为1+3+7=11个,选A
11、设数组S={ 93,946,372,9,146,151,301,485,236,372,43,892},采用最低位优先(LSD)基数排序将S排列成升序序列,第一趟分配收集后,元素372之前,之后相邻的元素是()
A.43,892
B.236,301
C.301,892
D.485,301
答案:C
解析:
93,946,372,9,146,151,301,485,236,372,43,892
r=10
第一趟分配:
0
1
2
3
4
5
6
7
8
9
151
301
372
372
892
093
043
485
946
146
236
009
第一趟收集:
151,301,372,372,892,093,043,485,946,146,236,009(元素372之前,之后相邻的元素分别是301,892,选C)
第二趟分配:
0
1
2
3
4
5
6
7
8
9
301
009
236
143
946
146
151
372
372
485
892
093
第二趟收集:
301,009,236,143,946,146,151,372,372,485,892,093
第三趟分配:
0
1
2
3
4
5
6
7
8
9
009
093
143
146
151
236
301
372
372
485
892
946
第三趟收集:
009,093,143,146,151,236,301,372,372,485,892,946
12、将关键字6,9,1,5,8,4,7依次插入到初始为空的大根堆H中,得到的H是()
A.9,8,7,6,5,4,1
B.9,8,7,5,6,1,4
C.9,8,7,5,6,4,1
D.9,6,7,5,8,4,1
答案:C
解析:
题目要求根据给定的序列构造出大根堆,根据大根堆的构造思想,首先先将给定的序列看成是一棵完全二叉树的顺序存储结构,写出一棵完全二叉树,如图(1)。
调堆。首先找到第3个位置(第n/2)个位置上的节点,因为是要做大根堆,首先将第3号位的元素的左右孩子互相比较,找出较大者,再和根比较,比根大就和根交换,三号位的为9,比左右孩子都大,所以不用交换。之后再继续调整2号位,2号是1,最大孩子节点是7,所以1和7互换。最后调整1号位,一号位元素为6,左右孩子最大者是9,6和9互换,并且6调到3号位后,右孩子8又比他大,继续交换。最后结果,如图(2)所示。
C正确
41、已知无向连通图G由顶点集V和边集E组成|E|>0,当G中度为奇数的顶点个数为不大于2的偶数时,G存在包含所有边且长度为|E|的路径(称为EL路径),设图G采用邻接矩阵存储,类型定义如下:
Typedef struct{
Int numVevsticos,numEdges;
Char vert;lesList[MAXV];
Int edge[MAXV][MAXV];
};MGraph
请设计算法:int IsExistEL(MGraph G)
判断G是否存在EL路径,若存在,则返回1,否则,返回0,要求:
(1)给出算法的基本设计思想
(2)根据设计思想采用C或者C++语言描述算法,关键之处给出注释
(3)说明你所设计算法的时间复杂度和空间复杂度
注:此方法不一定是最优解,这里是给大家提供了一个最直接暴力的解题思路。
int IsExistEL(MGraph G ){
int i,j,n=0;
int count[MAXV]={0};
for(i=0;i
for(j=0;j
if(G.edge[i][j]==1)
count[i]++;
}
if(count[i]%2==1)
n++;
}
if(n<=2&&n%2==0){
printf("存在EL路径");
return 1;
}else return 0;
}
时间复杂度O(MAXV2)
空间复杂度O(MAXV)
42、有如下程序:
int i,j,*count;
count=(int *)malloc(sizeof(int)*n);
for(i=0;i
count[i]=0;
for(i=0;i
for(j=i+1;j
if(a[i]
count[j]++;
else
count[i]++;
for(i=0;i
b[count[i]]=a[i];
free(count);
问:
(1)实现的是什么?给个数据跑一遍结果是什么?(假设A[6]={9、10、5、12、7、5})具体数据可能与真 题有出入
(2)n个数据的话比较几次?
(3)稳不稳定?
答案:
(1)实现非递减排序。结果为A[6]={5、5、7、9、10、12}
(2)比较n(n-1)/2次。(⑤的执行次数)
(3)不稳定。
解析:题中count[i]用来统计数组A中小于等于A[i]的元素的个数(count[0]中存放的是A数组中小于等于“A[0]”的元素个数),for循环②结束后count[6]={3、4、1、5、2、0},b[count[i]]用来实现按照count[i]值的大小重新对A[n]排序(以数组B[n]的形式,B[6]={5、5、7、9、10、12})。对于A数组中两个“5”“5”,count值分别是“1”“0”,所以会出现后一个“5”排到前边去的情况。