一、单项选择题,在括号内填写所选择的标号(每小题1分,共12分)
L若需要利用形参直接访问实参,则应把形参变量说明为( )参数。
A.指针 B.引用
C.传值 D.常值
2.以下说法错误的是( )。
A.抽象数据类型具有封装性
D.抽象数据类型具有信息隐蔽性
C.使用抽象数据类型的用户可以自己定义对抽象数据类型中数据的各种操作
D.抽象数据类型的一个特点是使用与实现分离
3.设有一个n×n的对称矩阵A,将其上三角部分按行存放在一个一维数组B中,A[0][0]存放于B[0]中,那么第i行的对角元素A[I][i]存放于B中( )处。
A.(i+3)*i/2 D.(i+1)*i/2
C(2n—i+1)*i/2 n(2n—i一1)*i/2
4.已知单链表A长度为m,单链表B长度为n,若将B联接在A的末尾,其时间复杂度应为( )。
A.O(1) . B.O(m)
C.O(n) D.O(m+n)
5.假定一个链式队列的队头和队尾指针分别为front和rear,则判断队空的条件为 ( )。
A.front==rear B,front! =NULL
C.rear! =NULL D.front==NULL
6.设有一个递归算法如下 int fact(intn){//n大于等于0
if(n<=0)return 1;
else return n*fact(n一);
}
则计算fact(n)需要调用该函数的次数为( )次。
A.n B.n+1
c.n+2 D.n-l
7.在一棵高度为h(假定树根结点的层号为0)的完全二叉树中,所含结点个数不小于 ( )。
A.2h—1 B.2h十1
C.2h一1 D.2h
8.一棵树的广义表表示为a(b,c(e,f(g)),d),当用左子女一右兄弟链表表示时,右指针域非空的结点个数为( )。
A.1 B.2
C.3 D.4
9.向具有n个结点的、结构均衡的二叉搜索树中插入一个元素的时间复杂度大致为 ( )。
A.O(1) B.O(log2n)
C.O(n) D.O(nlog2n)
10.具有n个顶点的有向无环图最多可包含< )条有向边。
A.n一1 B.n
C.n(n一1)/2 D.n(n—1)
11.图的广度优先搜索类似于树的( )次序遍历。
A.先根 B.中根
C. 后根 D.层次 ;
12.如果将所有中国人按照生日(不考虑年份,只考虑月、日)来排序,那么使用下列排序算法中( )算法最快。
A.归并排序 B. 希尔排序
C. 快速排序 D.基数排序
二、填空题,在横线处填写合适内容(每小题1分,共12分)
1.数据结构的存储结构包括顺序、——、索引和散列等四种。
2.在程序运行过程中可以扩充的数组是——分配的数组。这种数组在声明它时需要使用数组指针。
3.在链表中进行插入和——操作的效率比在顺序存储结构中进行相同操作的效率高。
4.栈是一种限定在表的一端进行插入和删除的线性表,又被称为——表。
5.如果一个对象部分地包含自己,或自己定义自己,则称这个对象是——的对象。
6.一棵树的广义表表示为a(b(c,d(e,f),g(h)),i(j,k(x,y))),结点f的层数为——。假定树根结点的层数为0。
7.一棵树按照左子女一右兄弟表示法转换成对应的二叉树,则该二叉树中树根结点肯定没有——子女。
8.向一棵二叉搜索树中插入一个元素时,若元素的值小于根结点的值,则应把它插入到根结点的——上。
9.设图G=(V,E),V={1,2,3,4},E={<l,2>,<1,3>,<2,4>,<3,4>},从顶点1出发,对图G进行广度优先搜索的序列有——种。
lo.每次直接或通过基准元素间接比较两个元素,若出现逆序排列就交换它们的位置,这种排序方法叫做——排序。
11.快速排序在平均情况下的空间复杂度为——。
12.若对长度n=10000的线性表进行二级索引存储,每级索引表中的索引项是下一级20个表项的索引,则一级索引表的长度为——。
三、判断题,在每小题前面打对号表示正确或打叉号表示失败(每小题1分,共10分)
( )1.数据的逻辑结构是指各数据元素之间的逻辑关系,是用户根据应用需要建立的。
( )2.顺序表和一维数组一样,都可以按下标随机(或直接)访问。
( )3.在一个顺序存储的循环队列中,队头指针指向队头元素的后一个位置。
( )4.用非递归方法实现递归算法时一定要使用递归工作栈。
( )5,在一棵二叉树中,假定每个结点只有左子女,没有右子女,对它分别进行中序遍历和后序遍历,则具有相同的结果。
( )6.在顺序表中进行顺序搜索时,若各元素的搜索概率不等,则各元素应按照搜索概率的降序排列存放,则可得到最小的平均搜索长度。
( )7.在二叉搜索树中,若各结点的搜索概率不等,使得搜索概率越小的结点离树根越近,则得到的是最优二叉搜索树。
( )8.对于AOE网络,加速任一关键活动都能使整个工程提前完成。
( )9.直接选择排序是一种稳定的排序方法。
( )10.闭散列法通常比开散列法时间效率更高。
四、运算题(前2小题,每小题6分,后3小题,每小题8分,共36分)
1.设有一个二维数组A[10][20]按行存放于一个连续的存储空间中,A[0][0]的存储地址是200,每个数组元素占1个存储字,则A[6][2]的存储字地址是多少。
A[6][2]的存储字地址:
2.已知一棵二叉树的中序和后序序列如下,求该二叉树的高度(假定空树的高度为-1)和度为2、度为l及度为0的结点个数。
中序序列:c,b,d,e,a,g,i,h,j,f
后序序列:c,e,d,b,i,j,h,g,f,a
高度:
度为2的结点数:
度为1的结点数:
度为。的结点数:
3.假定一组记录为(36,75,83,54,12,67,60,40),将按次序把每个结点插入到初始为空的一棵AVL树中,请回答在插人时需进行‘左单旋转”、“右单旋转”、“先左后右双旋转”、“先右后左双旋转”,“不调整”的结点数各是多少?
左单旋转结点个数:
右单旋转结点个数:
先左后右双旋转结点个数:
先右后左双旋转结点个数:
不调整结点个数:
4.已知一个带权图的顶点集V和边集G分别为:
V={0,l,2,3,4,5,6};
E二{(0,1)19,(0,2)10,(0,3)14,(1,2)6,(1,5)5,(2,3)26,(2,4)15,(3,4)18,(4,5)6,(4,6)6,(5,6)12);
试根据迪克斯特拉(Dijkstra)算法求出从顶点。到其余各项点的最短路径,在下面填写对应的路径长度。
顶点: 0 1 2 3 4 5 6
路径长度:
5.已知一个数据表为{36,25,25*,62,40,53},请写出在进行快速排序的过程中每次划分后数据表的变化。
(0)[36 25 25* 62 40 53]
(1)
(2)
(3)
五、算法分析题(每小题6分,共18分)
1.指出下面算法的功能并求出其时间复杂度。
void matrimult(int a[M][N],int b[N][L],int c[M][L])
{ //M、N、L均为全局整型量
int i,j,k;
for(i=0;i<M;i++)
for(j=0;j<L;j++)c[i][j]=0;
for(i=0;;i<M;i++)
for(i=0;j<L;j++)
for(k=0;k<N;k++)
c[i][j]+=a[i][k]*b[k][j];
}
功能为:
时间复杂度为:
2.设有—-个求解汉诺塔(Han01)的递归算法如下:
void HANOI(int n,int pegl,int peg2,int peg3){
if(n==1)cout<<pegl<<“→”<<peg3<<endl;
else{
HANOI(n—l,pegl,peg3,peg2);
cout<<pegl<<“→”<<peg3<<endl;
HANOl(n—l,peg2,pegl,peg3);
}
}
当使用HANOI(3,l,2,3)进行调用时,给出else子句中的cout语句的输出结果。
3.已知二叉搜索树中的结点类型BinTreeNode定义为:
struct BinTreeNode{ElemType data;BinTreeNode *left, *right;};
其中data为结点值域,left和righr分别为指向左、右子女结点的指针域。参数t指向一棵二叉搜索树,该树的广义表表示为:25(10(5,16(12)),40(32(,38)))。根据下面算法按标号把答案填写到算法后面相应标号的位置。
执行LN(pt,40)调用后返回的值为—(1)。
执行LN(pt,38)调用后返回的值为—(2)。
执行LN(p1,5)调用后返回的值为—(3)。
int LN(BinTreeNode* t,ElemType X)
{
if(L==NULL)return 0;
else if(1->data==X)return l;
else if(t->data>X)
return㈠—LN(1一>leh,X):
else
return 1+LN(1->right,X);
}
(1) (2) (3)
六、算法设计题(每小题6分,共12分)
1.试编写一个函数,在一个顺序表A中查找出具有最大值和最小值的整数。
函数的原型如下所示,原型的参数表中给出顺序表对象为A,通过算法执行,从参数表中的引用参数Max中得到表中的最大整数,Min中得到表中的最小整数。注意,函数中可使用顺序表的如下两个公有函数:
int Length();求表的长度;
int getData(int k);提取第k个元素的值。
#include“SeqList.h”
template<class T>
void FindMaxMin(SeqList<int>&A,int&Max,int&Min);
2.已知二叉树中的结点类型BinTreeNode定义为:
struct BinTreeNode{chardata;BinTreeNode*left, *right;);
其中data为结点值域,left和right分别为指向左、右子女结点的指针域,根据下面函数声明编写出判断两棵二叉树是否相等的算法,若相等则返回1否则返回0。算法中参数T1和T2为分别指向这两棵二叉树根结点的指针。当两棵树的结构完全相同并且对应结点的值也相同时才被认为相等。
int BTreeEqual(BinTreeNOde*T1,BinTreeNode*T2);