2017 - 951 数据结构
题目
一、 单项选择题
1. 算法能识别出错误的输入数据并进行适当的处理和反应,称为算法的( ① )。
A. 健壮性 B.正确性 C. 并行性 D. 时间复杂度
2. 从一个具有 n个结点的单链表中查找其值等于 x的结点时,在查找成功的情况下, 需要平均比较的节点个数是( ② )。
A. n B. n/2 C.(n-1)/2 D.(n+1)/2
3.设有一个双端队列,元素进入该队列的次序为 abcć,则既不能由输入受限双端队列得到,也不能由输出受限双端队列得到的输出序列为( ③ )。
A. dbca B. dcba C. dbac D. dcab
4.下列关于串的叙述中,正确的是( ④ )。
A.一个串的字符个数即该串的长度
B.空串是由一个空格字符组成的串
C.一个串的长度至少是1
D. 若两个串 S₁和S₂的长度相同, 则这两个串相等
5. 对一棵满二叉树,m个树叶,n个结点,深度为k, 则( ⑤ )。
A. k+m=2n B. n=k+m C.n=2k-1 D. m=k-1
6. 一个具有 10个顶点的有向图中,所有顶点的入度之和与所有顶点的出度之和的差等于( ⑥ )。
A.20 B.5 C.0 D.2
7. 对于线性表(7,34,55,25, 64,46,20, 10)进行散列存储时, 若选用H(K)=K %9作为散列函数,则散列地址为 1 的元素有( ⑦ ) 个。
A.1 B.2 C.3 D.4
8. 采用贪心算法不能求解的问题是( ⑧ )。
A.0-1 背包问题 B. 活动安排问题 C.找零钱问题 D.背包问题
9. 用数组 Q[m]存放循环队列的元素,rear和len分别表示该队列的队尾元素的位置和队列的长度,则队列第一个元素的位置是( ⑨ )。
A. rear-len B.(rear+m-len)%m C. m-len D. rear-len+m
10.线性表若采用链表存储结构时,要求内存中可用存储单元的地址( ⑩ )。
A. 必须是连续的 B. 部分地址必须是连续的
C. 一定是不连续的 D. 连续不连续都可以
14. 在头指针为 head 且表长大于 1 的单循环链表中, 指针 p 指向表中某个结点, 若p->next->next= head, 则 ( ⑪ )。
A. p指向头结点 B. p指向尾结点
C.*p的直接后继是头结点 D.*p的直接后继是尾结点
12. 快速排序在最坏的情况下的时间复杂度是( ) 。
A. O(log₂n) B. O(nlog₂n) C. O(n²) D. O(n³)
13. 设某棵三叉树中有 45个结点,则该三叉树的最小高度为( ⑬ )。
A.3 B.4 C.5 D.6
14. 设 n个元素进栈的序列是 1,2, 3, …, n, 其输出序列是p₁, P₂, …, P₀, 若p₁=3,则 p₂的值 ( ) 。
A. 一定是 1 B. 一定是2 C. 可能是 1 D. 可能是2
15. 在长度为 n 的顺序表的第 i(1≤i≤n+1)个位置上插入一个元素,元素的移动次数为( ⑮ )。
A. n-i+1 B. n-i C. i D. i-1
二、判断题
1. 链式栈与顺序栈相比,一个明显的优点是通常不会出现栈满的情况。( ① )
2. 在一个顺序存储的循环队列中,队头指针指向队头元素的位置。( ② )
3.数组一旦建立,结构中的元素个数和元素间的关系就不再发生变化。因此,一般都采用链式存储的方法来表示数组。( ③ )
4. 从串中取若千个字符组成的字符序列称为串的子串。 ( ④ )
5. 一个无向图的邻接矩阵中各元素之和与图中边的条数相等。( ⑤ )
6. 具有6个顶点的无向图至少有6条边才能确保是一个连通图。( ⑥ )
7. 顺序表的特点是:逻辑上相邻的元素,存储在物理位置也相邻的单元中。( ⑦ )
8.线性表的各种基本运算在顺序存储结构上的实现均比在链式存储结构上的实现效率要低。( ⑧ )
9.在散列法中, 一个可用的散列函数必须保证绝对不产生冲突。( ⑨ )
10. 在任何情况下,快速排序方法的时间性能总是最优的。( ⑩ )
11.一个问题是否具有最优子结构性质是该问题是否可以用动态规划法求解的重要前提。( ⑪ )
12. 层次结构设计方法有两种:自顶向下和自底向上。( ⑫ )
13.数据结构与算法的本质联系表现在失去一方,另一方将没有任何意义。 ( ⑬ )
14.二叉树是一棵无序树。( ⑭ )
15.对于一棵具有n个结点的任何二叉树,进行先序、中序或后序的任一种次序遍历的空间复杂度为 O(log2n)。( ⑮ )
三、填空题
1. ① 是数据的基本单位,即数据这个集合中的一个个体。
2、数据的逻辑结构分为两大类: ② 。
3. Huffman 树共有 ③ 个结点(n为叶子结点个数)。
4. 设一棵完全二叉树中有500个结点,若用二叉链表作为该完全二叉树的存储结构,则共有 ④ 个空指针域。
5. 设不含头节点的链队列中结点的格式为(data, next), front 为其头指针, rear 为其尾指针,则该队列为空的条件是 ⑤ 。
6.已知一个栈的输入序列为1,2, 3,…, n, 则其输出序列的第2个元素为n的输出序列的种数是 ⑥ 。
7.对于一维数组 A[15],若一个数组元素占用字节数为 s,则 A[i](i≥0)的存储地址为 ⑦ 。
8.无向图中的极大连通子图称为该无向图的 ⑧ 。
9.已知图 G 的邻接表如右图所示,其从1 顶点出发的深度优先搜索序列为 ⑨ 。
10.单链表表示法的基本思想是用 ⑩ 表示结点间的逻辑关系。
11.设r指向单链表的最后一个结点,要在最后一个结点之后插入s所指的结点,需执行的三条语句是 ⑪ ;r= s;r->next=null;。
12.一个顺序表的第一个元素的存储地址是200,每个元素的长度是2, 则第6个元素的地址是 ⑫ 。
13.除留余数法选择一正整数p,以关键字除以p所得的余数作为散列地址,通常选p为 ⑬ 。
14. 若某个散列函数 H 对于不相等的关键字 keyᵢ 和 key₂得到相同的散列地址(即H(key₁)=H(key₂)),则将该现象称为 ⑭。
15.二分搜索中查到每一个记录的比较次数可通过折半查找判定树来描述,那么查找某个结点进行的比较次数即为被查找结点在树中的 ⑮ 。
四、问题求解题
1. (7 分)下图是一个单链表的每个结点的物理位置的示意图,请用一般图示法画出该单链表。
2.(7分) 假设二维数组A[6][8],每个元素用相邻的6个字节存储,存储器按字节编址,已知 A 的基地址为 1000, 计算:
(1)数组 A 的占用的存储空间;
(2) A 的最后一个元素第一个字节的地址;
(3) 按行存储时, A[1][4]的第一个字节的地址;
(4) 按列存储时, A[4][7]的第一个字节的地址。
3.(7分) 设有一组初始记录关键字为(45,80,48,40, 22, 78),要求构造一棵二叉排序树并给出构造过程。
4.(8分)对下列连通图(如下图所示), 请分别用 Prim(从定点a出发)和 Kruskal 算法构造其最小生成树。
5.(8分)假设用于通信的电文由十种不同的符号来组成,这些符号在电文中出现的频率为 8, 21, 37, 24, 6, 18,23, 41, 56, 14,试为这十个符号构造哈夫曼树, 并设计相应的哈夫曼编码(要求树中左孩子结点的权值小于右孩子结点的权值)。
6.(8分)对于下列一组关键字46,58, 15,45,90, 18, 10, 62,试写出快速排序第一趟的一次划分过程,并写出每一趟的排序结果。
五、算法设计题
1. (10分) 设计算法求关键字x在二叉排序树中的层次:
int lev=0;
typedef struct node{
int key;
char data;
struct node*lchild,*rchild;
}bitree;
void level(bitree *bt, int x){
}
2. (10分)请在空格处将算法补充完整。完成下面的算法,识别一次读入的一个以@为结束符的字符序列是否为形如‘序列1&序列 2’模式的字符序列。其中序列1和序列2 中都不含字符‘&’,且序列2是序列1的逆序列。例如, ‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是。
typedef struct{
SElemType data[M];
int top;
} * Stack;
Push(Stack ST,SElemType x); //已定义的入栈操作
Pop(Stack ST, SElemType x); //已定义的退出栈顶元素赋给 x 的操作
BOOL Symmetry(char a[])
{
int i=0;
Stack s; // 定义栈 s
InitStack(s);
ElemType x;’
while( ① &&a[i]!='@'){
② ;
i+÷;
}
if( ③ ) return FALSE;
i++;
while(a[i]!= '@'){
④ ;
if( ⑤ ){
DestroyStack(s);
return FALSE;
}
i++;
return TRUE;
}
3.(10分)已知一个顺序表,编写算法,实现在其值为x的元素之后插入m个元素的算法。
int InsertM(sequenlist *L, int x, int m)
{
} //InsertM
答案
一、选择题
1.A 2.D 3.A 4.A 5.C
6.C 7.D 8.A 9. B 10.D
11.D 12.C 13.C 14.D 15.A
二、判断题
1.✔ 2.× 3.× 4.× 5.×
6.× 7.✔ 8.× 9.× 10.×
11.✔ 12.✔ 13.✔ 14.× 15.×
三、填空题
1. 数据元素
2、线性结构和非线性结构
3. 2n-1
4. 501
5. front==rear front==NULL
6、n-1
7、A+s×i
8. 连通分量
9. 1,2, 3, 6,5,4
10. 指针
11. r→next=s
12. 210
13. 小于等于表长的最大素数
14. 冲突
15. 深度
四、问题求解题
1.
2.
(1)[ 1000,1287]
(2) 1282
(3)1000+8X6+4X6=1072
(4)1000+7X6X 6+4X 6=1276
3.
4.
5.
6.
(1)第一次划分过程:
[46 58 15 45 90 18 10 62]
[10 58 15 45 90 18 10 62]
[10 58 15 45 90 18 58 62]
[10 18 15 45 90 18 58 62]
[10 18 15 45 90 90 58 62]
[10 18 15 45 46 90 58 62]
(2)
第1趟:[10 18 15 45] 46 [90 58 62]
2 : 10 [18 15 45] 46 [62 58] 90
3: 10 [15] 18 [45] 46 [58] 62 90
4:10 15 18 45 46 58 62 90
五、算法设计题
1.
While (bt→data!=x && bt→next!=NULL)
{
if(bt→data<x)
bt=bt→rchild;
else
bt=bt→tchied;
lev++;
}
2.
① a[i] != '&'
② push(s,a[i])
③ a[i+1] == '@' || a[i] == '@'
④ pop(s, x)
⑤ x != a[i]
3.
int i,n = 0;
sequen list q=L;
while (*q){
q++;
n++;
}
for ( i=0; L[i]; i++) {
if(L[i]==x)
break ;
}
if(i==n)
return 0;
for (int p=n;p>i; p--){
L[p+m]=L[p]
}
for (int j=0;j<mij++){
cìn>>L[i+j];
}
return 1;