计算机408考研真题怎么买,2021考研计算机(408)试题及解析——数据结构

数据结构试题与解析

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

解析:

本题考查根据树的遍历序列构造一个唯一的二叉树,再将二叉树转换成对应的森林。

首先先构造二叉树:

b101796f660db66512bf3e532f4696a3.png

根据孩子兄弟表示法转换成对应的森林:

95840135c56b6f254cebfb38f9e21193.png

则可以得到有3棵树,选C

5、 若某二叉树有5个叶子结点,其权值分别为10,12,16,21,30。则其最小的带权路径长度(WPL)是()

A.89

B.200

C.208

D.289

答案:B

解析:

本题考查哈夫曼树的构造,以及WPL的计算

9e4d43ecc004ad6742724398d1aec8b5.png

WPL=(16+21+30)*2+(10+12)*3=200,选B

6、 给定平衡二叉树如下图所示,放入关键字23后根中的关键字是()

8969dfc23c8d1ab16af70d24a868ec96.png

A.16

B.20

C.23

D.25

答案:D

解析:

插入23后,树的形态如下:

4eb1e8aa3991b17b347064de7fe49a5d.png

则根节点20不平衡,平衡因子为1-3=-2,则需要旋转调整后,得到平衡二叉树如下:

014b76efc2af63a94b40db4776b5d9ab.png

根为25,选D

7、给定如下有向图,该图的拓扑有序序列的个数是()

592fa1df0608adc77c6cda753e41e0b3.png

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)。

c8862a3d07f06256f9ea3193402eb23b.png

调堆。首先找到第3个位置(第n/2)个位置上的节点,因为是要做大根堆,首先将第3号位的元素的左右孩子互相比较,找出较大者,再和根比较,比根大就和根交换,三号位的为9,比左右孩子都大,所以不用交换。之后再继续调整2号位,2号是1,最大孩子节点是7,所以1和7互换。最后调整1号位,一号位元素为6,左右孩子最大者是9,6和9互换,并且6调到3号位后,右孩子8又比他大,继续交换。最后结果,如图(2)所示。

64ce1436a9268288a215b6b21fb3c701.png

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”排到前边去的情况。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值