数据结构.docx
《数据结构.docx》由会员分享,可在线阅读,更多相关《数据结构.docx(18页珍藏版)》请在冰豆网上搜索。
![数据结构.docx](https://file1.bdocx.com/fileroot1/2023-2/21/fdca22aa-cb79-45df-9a3c-21e712a40b8b/fdca22aa-cb79-45df-9a3c-21e712a40b8b1.gif)
数据结构
《数据结构》
一、选择题(每题3分,共30分)
1、在树形结构中,数据元素间存在()的关系。
A、一对一 B、一对多 C、多对多 D、除同属一个集合外别无关系
2、下列说法中错误的是()。
A、数据对象是数据的子集
B、数据元素间关系在计算机中的映象即为数据的存储结构
C、非顺序映象的特点是借助指示元素存储地址的指针来表示数据元素间逻辑关系
D、抽象数据类型指一个数学模型及定义在该模型上的一组操作
3、下列不属算法特性的是()。
A、有穷性 B、确定性 C、零或多个输入 D、健壮性
4、在长为n的顺序表中删除一个数据元素,平均需移动()个数据元素。
A、n B、n-1 C、n/2 D、(n-1)/2
5、若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。
A、顺序表 B、双链表 C、带头结点的双向循环链表 D、单循环链表
6、在一个可存放n个数据元素的顺序栈中,假设以高地址端为栈底,以top为栈顶指针,当向栈中压入一个数据元素时,top的变化是()。
A、不变 B、top=n C、top++ D、top--
7、设在一不带头结点的链队列中,front和rear分别为其队头和队尾指针,则删除一个结点的操作是()。
A、rear=front->next B、rear=rear->next C、front=front->next D、front=rear->next
8、判定一个栈顶指针为S且不带头结点的链栈为空栈的条件是()。
A、S B、S->next C、S->next==NULL D、!
S
9、设在一不带头结点的链队列中,front和rear分别为其队头和队尾指针,则判定该队中只有一个结点的条件是()。
A、front->next B、rear->next C、front==rear D、front!
=rear
10、串的长度是指()。
A、串中所含不同字母的个数 B、串中所含字符的个数
C、串中所含不同字符的个数 D、串中所含非空格字符的个数
二、(10分)
设n为正整数,试确定如下程序段中语句“x++;”的频度。
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
for(k=1;k<=n;k++)
x++;
三、(15分)
设单链表L如图所示:
画出执行如下程序段后,各指针变量及单链表L的示意图。
p=L;
for(i=1;i<=3;i++){
q=(LinkList)malloc(sizeof(LNode));
q->data=i*3;
q->next=p->next;
p->next=q;
}
四、(10分)
设元素的入栈次序为a、b、c、d,且在入栈的过程中允许出栈,试写出所有不可能得到的出栈序列。
五、(15分)
设a='datastructure',b='computer',c='demo',试求:
⑴StrLength(a)的返回值;
⑵执行StrInsert(b,4,c)后串b的值;
⑶Index(a,'u',10)的返回值;
⑷执行Replace(a,'structure',b)后串a的值;
⑸执行SubString(s,b,3,3)后串s的值。
六、(20分)
已知单链表L中含有三类字符的数据元素,即字母字符、数字字符和其他字符,试编写算法将L分割为三个循环链表,其中每个循环链表只含一类字符。
答案
一、选择题
1、B
2、B
3、D
4、D
5、A
6、D
7、C
8、D
9、C
10、B
二、设n为正整数,试确定如下程序段中语句“x++;”的频度。
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
for(k=1;k<=n;k++)
x++;
答:
三、设单链表L如图所示:
画出执行如下程序段后,各指针变量及单链表L的示意图。
p=L;
for(i=1;i<=3;i++){
q=(LinkList)malloc(sizeof(LNode));
q->data=i*3;
q->next=p->next;
p->next=q;
}
答:
四、设元素的入栈次序为a、b、c、d,且在入栈的过程中允许出栈,试写出所有不可能得到的出栈序列。
答:
dabcdacbdbacdbcadcabcadbcabdcdabbdacadbc
五、设a='datastructure',b='computer',c='demo',试求:
⑴StrLength(a)的返回值;
⑵执行StrInsert(b,4,c)后串b的值;
⑶Index(a,'u',10)的返回值;
⑷执行Replace(a,'structure',b)后串a的值;
⑸执行SubString(s,b,3,3)后串s的值。
答:
⑴14
⑵'comdemoputer'
⑶12
⑷'datacomputer'
⑸'mpu'
六、已知单链表L中含有三类字符的数据元素,即字母字符、数字字符和其他字符,试编写算法将L分割为三个循环链表,其中每个循环链表只含一类字符。
答:
voidpartition(LinkList&L,LinkList&LC,LinkList&LN,LinkList&LO){
//L带头结点,LC为含字母字符的循环链表,LN为含数字字符的循环链表,
//LO为含其他字符的循环链表
InitCL(LC);
InitCL(LN);
InitCL(LO);//对三个循环链表进行初始化
p=L->next; //p指向第一个结点
while(p){
q=p;
p=p->next; //q指向当前待处理结点,p指向剩余链表
if(q->data>=’A’&&q->data<=’Z’||q->data>=’a’&&q->data<=’z’){
q->next=LC->next;
LC->next=q;
} //字母字符入循环链表LC
elseif(q->data>=’0’&&q->data<=’9’){
q->next=LN->next;
LN->next=q;
} //数字字符入循环链表LN
else{
q->next=LO->next;
LO->next=q;
} //其他字符入循环链表LO
}//while
free(L); //释放单链表L的头结点
}//partition
voidInitCL(LinkList&L){
//对循环链表进行初始化
L=(LinkList)malloc(sizeof(LNode));
if(!
L)exit(OVERFLOW);
L->next=L;
}
一、选择题(每题3分,共30分)
1、对稀疏矩阵进行压缩存储的目的是( )。
A、便于进行矩阵运算 B、便于输入和输出
C、节省存储空间 D、降低运算的时间复杂度
2、设二维数组A5×8按行优先顺序存储,每个数据元素占2个字节,首地址即元素A[0][0]的起始地址为S,则元素A[3][6]的起始地址为( )。
A、S+66 B、S+60 C、S+33 D、S+30
3、设广义表L=((a,()),b,(c,d,e)),则Head(Tail(Tail(L)))的值为( )。
A、b B、c C、(c) D、(c,d,e)
4、下列叙述中错误的是( )。
A、对数组一般不做插入和删除操作
B、顺序存储的数组是一个随机存取结构
C、空的广义表没有表头和表尾
D、广义表的表尾可能是原子也可能是子表
5、一棵度为3的树中,度为3的结点有2个,度为2的结点有2个,度为1的结点有2个,则度为0的结点有( )。
A、5个 B、6个 C、7个 D、8个
6、已知二叉树T的先序序列为abdegcfh,中序序列为dbgeachf,则T的后序序列为( )。
A、gedhfbca B、dgebhfca C、abcdefgh D、acbfedhg
7、下列叙述中错误的是( )。
A、由树的先序遍历序列和后序遍历序列可以惟一确定一棵树
B、二叉树不同于度为2的有序树
C、深度为k的二叉树上最少有k个结点
D、在结点数目相同的二叉树中,最优二叉树的路径长度最短
8、设无向图的顶点个数为n,则该图最多有( )条边。
A、n-1 B、n(n-1)/2 C、n(n+1)/2 D、n2
9、设有无向图G=(V,E),其中顶点集合V={a,b,c,d,e,f},边集合E={(a,b),(a,e),(a,c),(b,e),(c,f),(f,d),(e,d)}。
对G进行深度优先遍历,正确的遍历序列是( )。
A、a,b,e,c,d,f B、a,c,f,e,b,d C、a,e,b,c,f,d D、a,e,d,f,c,b
10、设有向图G中有五个顶点,各顶点的度分别为3、2、2、1、2,则G中弧数为( )。
A、4条 B、5条 C、6条 D、无法确定
二、(10分)
设有上三角矩阵(aij)n×n,将其上三角元素逐行存于数组B[m]中(m充分大),使得B[k]=aij,求用i和j表示k的下标变换公式。
三、(10分)
设二叉树如下,试对其进行先序线索化,画出相应的先序线索二叉树存储结构示意图。
四、(15分)
设用于通信的电文由8个字母组成,字母在电文中出现的频率分别为0.12、0.31、0.22、0.02、0.03、0.08、0.17、0.05。
试为这8个字母设计哈夫曼编码,要求画出设计过程中所构造的哈夫曼二叉树。
五、(15分)
设有AOE网如下,要求:
⑴求图中各顶点代表的事件的最早发生时间和最晚发生时间;
⑵求图中各弧代表的活动的最早开始时间和最晚开始时间;
⑶列出各条关键路径。
六、(20分)
设二叉树以二叉链表存储,试设计算法,实现二叉树的层序遍历。
答案:
一、选择题
C、B、D、D、C、B、D、B、D、B
二、设有上三角矩阵(aij)n×n,将其上三角元素逐行存于数组B[m]中(m充分大),使得B[k]=aij,求用i和j表示k的下标变换公式。
答:
三、设二叉树如下,试对其进行先序线索化,画出相应的先序线索二叉树存储结构示意图。
答:
四、设用于通信的电文由8个字母组成,字母在电文中出现的频率分别为0.12、0.31、0.22、0.02、0.03、0.08、0.17、0.05。
试为这8个字母设计哈夫曼编码,要求画出设计过程中所构造的哈夫曼二叉树。
答:
编码:
0.02:
00100
0.03:
00101
0.05:
0011
0.08:
000
0.12:
100
0.17:
101
0.22:
01
0.31:
11
五、设有AOE网如下,要求:
⑴求图中各顶点代表的事件的最早发生时间和最晚发生时间;
⑵求图中各弧代表的活动的最早开始时间和最晚开始时间;
⑶列出各条关键路径。
答:
关键路径1:
v1→v2→v5→v7
关键路径2:
v1→v3→v6→v7
六、设二叉树以二叉链表存储,试设计算法,实现二叉树的层序遍历。
答:
StatusLevelOrderTraverse(BitreeT,Status(*visit)(TElemTypee)){
if(!
T)returnOK;//空二叉树
InitQueue(Q);//初始化辅助队列
if(!
visit(T->data))returnERROR;//访问根结点
EnQueue(Q,T);//指向结点的指针入队
while(!
QueueEmpty(Q)){//若队列非空
DeQueue(Q,p);//队头指针出队
if(p->lchild){//先访问p所指结点的左孩子,再访问其右孩子
if(!
visit(p->lchild->data))returnERROR;
EnQueue(Q,p->lchild);
}//if
if(p->rchild){
if(!
visit(p->rchild->data))returnERROR;
EnQueue(Q,p->rchild);
}//if
}//while
returnOK;
}//LevelOrderTraverse
一、选择题(每题3分,共30分)
1、m阶B树中的一个分支结点最多含()个关键字。
A、m-1 B、m C、m+1 D、[m/2]-1 E、[m/2] F、[m/2]+1
2、设有k个关键字互为同义词,若用线性探测法把这k个关键字存入散列表,至少要进行()次探测。
A、k-1 B、k C、k+1 D、k(k-1)/2
3、设表中含100个数据元素,用折半查找法进行查找,则所需最大比较次数为()。
A、50 B、25 C、10 D、7
4、设哈希表地址范围为0~19,哈希函数H(key)=key%17,使用二次探测再散列法处理冲突。
若表中已存放有关键字值为6、22、38、55的记录,则再放入关键字值为72的记录时,其存放地址应为()。
A、2 B、3 C、4 D、7 E、8 F、以上都不对
5、直接插入排序在最好情况下的时间复杂度为()。
A、O(logn) B、O(n) C、O(n*logn) D、O(n2)
6、将两个各有n个元素的有序表归并成一个有序表,最少进行()次比较。
A、n B、2n-1 C、2n D、n-1
7、设有一组关键字值(46,79,56,38,40,84),则用快速排序的方法,以第一个记录为基准得到的一次划分结果为()。
A、38,40,46,56,79,84 B、40,38,46,79,56,84
C、40,38,46,56,79,84 D、40,38,46,84,56,79
8、外部排序是指()。
A、在外存上进行的排序方法
B、不需要使用内存的排序方法
C、数据量很大,需要人工干预的排序方法
D、排序前后数据在外存,排序时数据调入内存的排序方法
9、下述文件中适合于磁带存储的是()。
A、顺序文件 B、索引文件 C、散列文件 D、多关键字文件
10、ISAM文件和VSAM文件属于()。
A、索引非顺序文件 B、索引顺序文件 C、顺序文件 D、散列文件
二、(10分)
设用堆排序法对给定关键字序列(85,61,15,33,24,96,76,43)按升序进行排序,试画出初始堆。
三、(10分)
画出对长度为17的有序表进行折半查找的判定树,并求等概率下查找成功时的平均查找长度。
四、(15分)
设内存有大小为5个记录的区域可供内部排序之用,文件的关键字序列为:
(18,32,56,40,23,11,8,99,58,36,21,7,4,15,19,87,73,52,82,63),要求用置换-选择排序求初始归并段。
五、(15分)
设哈希函数H(key)=(3*key)%11,用开放定址法处理冲突,di=i*((7*key)%10+1),i=1,2,3…。
试在0~10的散列地址空间中对关键字序列(22,41,53,46,30,13,01,67)造哈希表,并求等概率下查找成功时的平均查找长度。
六、(20分)
设计递归算法,从大到小输出给定二叉排序树中所有关键字值不小于x的数据元素。
答案
一、选择题
1、C
2、B
3、A
4、D
5、D
6、E
7、D
8、B
9、C
10、A
二、设用堆排序法对给定关键字序列(85,61,15,33,24,96,76,43)按升序进行排序,试画出初始堆。
答:
96,61,85,43,24,15,76,33
三、画出对长度为17的有序表进行折半查找的判定树,并求等概率下查找成功时的平均查找长度。
答:
平均查找长度:
。
四、设内存有大小为5个记录的区域可供内部排序之用,文件的关键字序列为:
(18,32,56,40,23,11,8,99,58,36,21,7,4,15,19,87,73,52,82,63),要求用置换-选择排序求初始归并段。
答:
初始归并段1:
18,23,32,40,56,58,99;
初始归并段2:
7,8,11,15,19,21,36,52,63,73,82,87
初始归并段3:
4
五、设哈希函数H(key)=(3*key)%11,用开放定址法处理冲突,di=i*((7*key)%10+1),i=1,2,3…。
试在0~10的散列地址空间中对关键字序列(22,41,53,46,30,13,01,67)造哈希表,并求等概率下查找成功时的平均查找长度。
答:
平均查找长度=(1+1+1+2+2+1+6+3)/8=
六、设计递归算法,从大到小输出给定二叉排序树中所有关键字值不小于x的数据元素。
答:
voidOutputNLT(BiTreeT,KeyTypex){
if(!
T)return;
if(!
LT(T->data.key,x)){ //根结点及右子树中所有结点的关键字值均不小于x
Output(T->rchild); //按关键字值从大到小的顺序输出右子树中所有结点
printf(T->data); //输出p所指结点
OutputNLT(T->lchild,x); //处理左子树
}
elseOutputNLT(T->rchild,x);
}//OutputNLT
voidOutput(BiTreeT){
Output(T->rchild);
printf(T->data);
Output(T->lchild);
}