201大数据结构问题详解解析汇报Word文档下载推荐.docx
《201大数据结构问题详解解析汇报Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《201大数据结构问题详解解析汇报Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
![201大数据结构问题详解解析汇报Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-1/2/58ce8746-4627-4b54-bb6d-4eddfc968786/58ce8746-4627-4b54-bb6d-4eddfc9687861.gif)
双向循环链表中结点与结点之间有4条线,所以插入一个新结点,需要修改指针域的数量为4条。
5.假设以数组A[60]存放循环队列的元素,其头指针是front=47,当前队列有50个元素,则队列的尾指针值为()
A.3B.37
C.50D.97
循环队列,front=47,则rear=(front+队列元素个数)%数组长度=(47+50)%60=37。
6.若栈采用链式存储结构,则下列说法中正确的是()
A.需要判断栈满且需要判断栈空
B.不需要判断栈满但需要判断栈空
C.需要判断栈满但不需要判断栈空
D.不需要判断栈满也不需要判断栈空
链栈由于采用链表方式作为存储方式,入栈时,使用malloc申请空间后,用指针相连接,所以结点个数没有限制,但是出栈时,如果栈中的元素个数为0,就不能再出栈了。
7.若串str=”Software”,其子串的数目是()
A.8B.9
C.36D.37
D
字串包括:
单字符的字串:
”S”、”o”等共8个,2个字符的字串”So”、”of”共7个,3个字符的字串”Sof”、”oft”等共6个,以此类推,可以知道总数量S=8+7+6+5+4+3+2+1=(1+8)*8/2=36。
最后别忘记了,空串””是任何字符串的字串,所以S=36+1=37.
结论:
求字符串的子串个数公式:
S=(1+字符串长度)*字符串长度/2+1
8.设有一个10阶的下三角矩阵A,采用行优先压缩存储方式,all为第一个元素,其存储地址为1000,每个元素占一个地址单元,则a85的地址为()
A.1012B.1017
C.1032D.1039
按行优先压缩,每一行10个元素。
又由于下标从1开始且是下三角,所以a85的前7行共有1+2+3+4+5+6+7=(1+7)*7/2=28个元素,第8行不满,列5前有5-1=4个元素,所以a85前共有28+4=32个元素。
又由于每个元素占一个地址单元,所以a85的地址=a11+32个元素的地址增量=1000+32*1=1032。
9.允许结点共享的广义表称为()
A.纯表B.线性表
C.递归表D.再入表
没有共享结点,没有递归结点的表是纯表。
有共享结点的表是再入表,有递归结点的表是递归表。
10.下列数据结构中,不属于二叉树的是()
A.B树B.AVL树
C.二叉排序树D.哈夫曼树
A
根据概念可以得到答案。
11.对下面有向图给出了四种可能的拓扑序列,其中错误的是()
A.1,5,2,6,3,4B.1,5,6,2,3,4
C.5,1,6,3,4,2D.5,1,2,6,4,3
根据先找没有前驱的结点的方式,找到没有前驱的结点后,后删除该结点上的连线,可以推出C是错误的。
12.以v1为起始结点对下图进行深度优先遍历,正确的遍历序列是()
A.v1,v2,v3,v4,v5,v6,v7B.v1,v2,v5,v4,v3,v7,v6
C.v1,v2,v3,v4,v7,v5,v6D.v1,v2,v5,v6,v7,v3,v4
从V1出发,根据标号最小原则,深度遍历后,容易得出D是正确的。
具体遍历方式为:
V1->
v2->
v5->
v6,v6没有出度,返回v5,v5->
v7,v7没有出度,返回v5,v5的2个出度(v6和v7)都已经遍历,返回v2,v2的2个出度(v5和v6)都已经遍历,返回v1,v1->
v3,v3没有出度,返回v1,v1->
v4,所以最后的遍历序列为v1->
v6->
v7->
v3->
v4。
13.下列排序算法中不稳定的是()
A.快速排序B.归并排序
C.冒泡排序D.直接插入排序
稳定的排序算法共有4个,直插、冒泡、归并、基数,其他的都是不稳定的。
14.一个有序表为(1,3,9,12,32,41,45,62,75,77,82,95,100),当采用折半查找方法查找值32时,查找成功需要的比较次数是()
A.2B.3
C.4D.8
第一次查找取mid=(low+high)/2=(1+13)/2=7,如果数组名为R,则R[7]=45,32比45小,则应该在前半部分再找,所以high=mid-1=6。
第二次查找取mid=(low+high)/2=(1+6)/2=3,则R[3]=9,9比32小,应该在后半部分找。
所以low=mid+1=4。
第三次查找mid=(low+high)/2=(4+6)/2=5,则R[5]=32,32==32成立,找到了。
总共查找了3次。
15.采用ISAM组织文件的方式属于()
A.链组织B.顺序组织
C.散列组织D.索引组织
二、填空题(本大题共10小题,每小题2分,共20分)
请在每小题的空格中填上正确答案。
错填、不填均无分。
16.数据元素及其关系在计算机存储器内的表示称为_________。
存储结构。
数据结构包括三个部分:
逻辑结构、存储结构、算法。
17.长度为n的线性表采用单链表结构存储时,在等概率情况下查找第i个元素的时间复杂度是_________。
i
由于单链表查找,必须从头指针或头结点开始查找。
查找第一个元素时需要的时间为1次,查找第二个元素需要判断的时间为2次,…以此类推,查找第i个元素的时间为i次。
18.下面是在顺序栈上实现的一个栈基本操作,该操作的功能是_________。
typedefstruct{
DataTypedata[100];
inttop;
}SeqStack;
DataTypef18(SeqStack*S)
{if(StackEmpty(S))
Error(”Stackisempty”);
returnS->
data[S->
top];
}
取栈顶元素或取栈顶元素的值
前面是栈的定义,函数f18中,最后一句returns->
data[s->
top]。
s->
top是栈顶的位置,s->
data[X],表示栈的X位置上的元素值。
19.在串匹配中,一般将主串称为目标串,将子串称为_________。
模式串
概念题,记住它。
20.已知广义表C=(a(b,c),d),则:
tail(head(tail(C)))=_________。
()
从最里面开始,tail(C)(d),head(tail(C))d,tail(head(tail(C)))()。
21.用6个权值分别为6、13、18、30、7和16的结点构造一棵哈夫曼(Huffman)树,该树的带权路径长度为_________。
219
这6个结点作为哈夫曼树的叶子,先选取2个最小的值作为叶子,生成一个根,…可以得到最后的哈夫曼树,算一下就知道答案了。
长度=6*4+7*4+13*3+16*2+18*2+30*2=219。
22.已知有向图如下所示,其中顶点A到顶点C的最短路径长度是_________。
35
由最短路径的算法,可以得出A->
D->
E->
C是最短路径,路径长度为2+21+12=35。
23.对序列{55,46,13,05,94,17,42}进行基数排序,第一趟排序后的结果是_________。
42,13,94,55,05,46,17
从个位数开始排,就可以得到答案序列。
24.高度为3的3阶B-树最少的关键字总数是_________。
7
B树的定义如下:
一棵m阶的B-树满足下列条件:
(1)树中每个结点至多有m个孩子;
(2)除根结点和叶子结点外,其它每个结点至少有┌m/2┐个孩子;
(3)若根结点不是叶子结点,则至少有2个孩子;
(4)所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息;
(5)有k个孩子的非终端结点恰好包含有k-1个关键字。
解题思路:
(1)根据树的性质可以知道根只有一个。
Count=1.
(2)根据性质(3),3阶B树的根不是叶子,至少有2个孩子。
Count=1+2=3
(3)根据性质
(2),可以知道第2层中的每个结点,每个结点至少有┌m/2┐个孩子,即2个孩子;
所以第三层上有4个结点。
Count=1+2+4=7个结点。
且每个结点中只包含1个关键字。
25.VSAM通常作为大型索引顺序文件的标准组织,其动态索引结构采用的是_________。
三、解答题(本大题共4小题,每小题5分,共20分)
26.假设二叉树的RNL遍历算法定义如下:
若二叉树非空,则依次执行如下操作:
(1)遍历右子树;
(2)访问根节点;
(3)遍历左子树。
已知一棵二叉树如图所示,请给出其RNL遍历的结果序列。
G,C,F,A,B,D。
根据定义,比较容易得到该序列。
实质上是前序序列的倒转。
27.已知一个无向图G=(V,E),其中V={A,B,C,D,E,F},邻接矩阵表示如下所示。
请回答下列问题:
(1)请画出对应的图G。
(2)画出图G的邻接表存储结构。
如图所示。
通过矩阵中的1就可以知道哪个结点与哪个结点之间的连线。
得到图之后,生成邻接表很容易的。
28.已知一组待排记录的关键字序列为(16,12,18,60,15,36,14,18,25,85),用堆排序方法建小根堆,请给出初始建堆后的序列。
序列为(12,15,14,18,16,36,18,60,25,85)。
如上图所示先构造出出示的完全二叉树,如左图所示,然后先从最后一个非叶子结点开始调整,结点顺序,一定要满足小根堆的性质,以此类推,调整完毕后如右图所示,就是小根堆,写出序列后就是了。
29.已知一棵二叉排序树如图所示。
请回答下列问题:
(1)画出插入元素23后的树结构;
(2)请画出在原图中删除元素57后的树结构。
(1)插入元素23后,二叉排序树变成如图中的左图所示。
(2)删除元素57后,二叉排序树变成如图所示的右图所示。
(1)新插入的结点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。
(2)二叉排序的删除。
分三种情况:
<
1>
若被删除的结点p是叶子,则直接删除就可以了。
2>
若被删除的结点p不是叶子,但p只有左子树或右子树,则将p的左子树或右子树直接修改为p的双亲的子树即可。
3>
若被删除的结点p不是叶子,但p既有左子树,也有右子树,此时需用结点p的(中序)直接前驱或直接后继代替p,然后再从二叉排序树中删除p的直接前驱或直接后继。
本题中的结点57既有左孩子又有右孩子,需找到它的直接前驱结点49。
用49直接替代57。
然后删除49即可。
四、算法阅读题(本大题共4小题,每小题5分,共20分)
30.已知下列程序,Ls指向带头结点的单链表。
Typedefstructnode{
DataTypedata;
structnode*next;
}*LinkList;
voidf30(LinkListLs)
{LinkListp,q;
q=Ls->
next;
if(q&
&
q->
next){
Ls->
next=q->
p=q
while(p->
next)
p=p->
p->
next=q;
next=NULL;
(1)当Ls指向的链表如下图所示,请画出执行本函数之后的链表的结果。
(2)请简述算法的功能。
第一步的答案如上图所示。
第二步的答案如下:
通过结果可以推出,该算法的功能是把第一个结点(开始结点)移动到链表的尾部。
根据程序可以很容易的得到如上图所示的结果。
第二步的答案是非常明显的。
31.已知字符串处理函数f31程序如下。
intf31(char*strl,char*str2)
{while(*strl==*str2&
(*strl!
=’\0’)){
strl++;
str2++;
}
return(*strl-*str2?
l∶0);
(1)若调用语句是f31(”abcde”,”abcdf’),则函数的返回值是什么?
若调用语句是f31(”abcde”,”abcde”),则函数的返回值是什么?
(2)简述该函数的功能。
(1)10
(2)判断字符串是否相等,如果相等返回0,否则返回1。
程序比较简单,关键是理解*str1的作用是什么?
通过函数的参数可以得知str1和str2是分别指向字符串的指针,也就是保存字符串的数组的开始地址,程序中的*str1的功能是求某当前地址下的字符的值。
因此,实参为f31(”abcde”,”abcdf’)时,要以此判断a==a成立,b==b成立,以此类推,只到e==f不成立结束。
循环结束后,return(*strl-*str2?
即return(‘e’-‘f’?
1:
0),e-f不等于0表示条件成立,成立则返回1。
故f31(”abcde”,”abcdf’)返回1。
f31(”abcde”,”abcde”),循环条件结束时,*str1的值为’\0’,*str2的值也是’\0’,所以return(*strl-*str2?
l∶0),即return(‘\0’-‘\0’?
0),’\0’-‘\0’等于0,0表示不成立,不成立取第二个表达式的值0,所以f31(”abcde”,”abcde”)返回值为0。
第二部答案:
通过分析很容易得出。
32.数组A[]中存储有n个整数,请阅读下列程序。
voidf32(intA[],intn)
{inti,j,k,x;
k=n-l;
while(k>
0){
i=k;
k=0;
for(j=O;
j<
i;
j++)
if(A[j]>
A[j+1]){
x=A[j];
A[j]=A[j+l];
A[j+1]=x;
k=j;
}//endofif
}//endofwhile
return;
(1)当A[]={10,8,2,4,6,7}时,执行f32(A,6)后,数组A中存储的结果是什么?
(2)说明该算法的功能。
(1)数组A中的结果{2,4,6,7,8,10}
(2)该算法的功能是对数组进行A中的前n个元素进行冒泡排序。
通过将数组A和6带入后,很容易分析出结果。
33.下面程序实现二分查找算法。
Typedefstruct{
KeyTypekey;
InfoTypeotherinfo;
}SeqList[N+1];
intBinSearch(SeqListR,intn,KeyTypeK)
{intlow=1,high=n;
while(
(1)){
mid=(1ow+high)/2;
if(
(2))
returnmid;
if(R[mid].key>
K)
high=mid-1;
else
(3);
returnO;
}//BinSearch
请在空白处填写适当内容,使该程序功能完整。
(1)
(2)
(3)
(1)low<
=high
(2)R[mid]==k
(3)low=mid+1
二分法查找是必须要掌握的,基本上格式是固定的。
只要理解什么是二分法,比较容易得出答案。
五、算法设计题(本题10分)
34.已知二叉树采用二叉链表存储,其结点结构定义如下:
typedefstructNode{
ElmTypedata;
structNode*lchild,*rchild;
}*BiTree;
请编写递归函数SumNodes(BiTreeT),返回二叉树T的结点总数。
intSumNodes(BiTreeT)
{
intcount=0;
/*count表示树T中全部结点的个数,初始值为0*/
if(T->
lchild==NULL&
T->
rchild==NULL)/*递归结束条件*/
count=1;
returncount;
else/*else后面的代码是递归公式,分三种情况,具体见解析部分*/
if(T->
lchild!
=NULL&
rchild==NULL)/*表示只有左子树*/
count=1+SumNodes(T->
lchild);
/*其中1表示根结点的数量*/
elseif(T->
rchild!
=NULL)/*表示只有右子树*/
rchild);
=NULL)/*既有左子树,又有右子树*/
lchild)+SumNode(T->
(一)函数定义中的头部分析。
通过题目意思可以得到,我们要写一个函数,函数名为SumNodes(),里面有一个参数BiTree类型的T,该函数是有返回值的,返回值为树T的结点总数,返回值的类型为int,所以函数的类型也为int(因为返回值的类型就是函数的类型)。
通过上面的分析可以定义如下:
IntSumNodes(BiTreeT)
(二)函数定义中的函数体分析
题目要求用递归算法,递归算法的关键点有2个:
一个是递归结束条件,一个是递归公式。
(1)递归结束条件,根据树的特点我们可以知道如果树T的某个结点,没有左孩子同时也没有右孩子,即该结点是叶子结点,叶子结点可以理解为一颗只有1个结点的树,我们可以确定该叶子结点组成的树只有1个结点。
所以递归结束条件为:
rchild==NULL)
(2)递归公式,如果某结点不是叶子结点,不是叶子结点有三种情况,a.只有左孩子;
b.只有右孩子;
c.既有左孩子又有右孩子。
a这种情况,可以确定1个结点,即根结点,其他的结点树需继续执行本函数,参数为左孩子的地址。
b这种情况,可以确定1个结点,即根结点,其他的结点数需继续调用本函数,参数为右孩子的地址。
c这种情况,可以确定一个结点,即根结点,其他的结点数需继续调用本函数,且需要调用2次本函数,参数分别为左孩子地址,右孩子地址。
即递归公式为: