A.3B.4C.5D.6
28、哈希检索的基本思想是依据关键字值的简单换算来决定()。
A.记录的存储地址B.记录的序号
C.平均检索长度D.哈希表空间
29、设有一个用线性探测法解决冲突得到的哈希表(哈希函数:
H(key)=key%11):
012345678910
13
25
80
16
17
6
14
若要检索关键字值为14的记录,探测(比较)的次数是()。
A.1B.6C.7D.8
30、设计一个用线性探测法解决冲突的哈希表(哈希函数:
H(key)=key%17),其地址区间为0..16,现将关键字值分别为26、25、72、38、8、18、59的记录依次存储到哈希表中。
关键字值为59的记录在哈希表中的地址(下标)是()。
A.8B.9C.10D.11
31、用直接插入排序法对下面4个序列进行递增(由小到大)排序,元素比较次数和移动次数最少的是()。
A.10,3,4,9,8,6,2,7B.2,3,6,4,8,7,9,10
C.3,4,2,6,7,10,9,8D.9,7,8,6,2,3,10,4
32、对10个记录的序列:
4,3,6,9,7,1,2,5,0,8进行排序,若采用快速排序,一趟分割之后序列的次序是()。
A.3,4,6,9,1,7,2,5,0,8B.0,3,2,1,4,7,9,5,6,8
C.3,4,6,1,7,2,5,0,8,9D.1,2,5,0,8,4,3,6,9,7
33、对10个记录的序列:
4,3,6,9,7,1,2,5,0,8用归并排序方法进行一趟归并后的结果为()。
A.3,4,6,9,1,7,2,5,0,8B.0,3,2,1,4,7,9,5,6,8
C.3,4,6,1,7,2,5,0,8,9D.1,2,5,0,8,4,3,6,9,7
34、以下排序算法中,时间复杂度最高的是()。
A.希尔排序B.归并排序C.冒泡排序D.堆排序
35、以下排序算法中,需要附加的内存空间最小的是()。
A.归并排序B.快速排序C.堆排序D.树形选择排序
36、以下排序算法中,时间复杂度最小的是()。
A.二分插入排序B.直接选择排序
C.冒泡排序D.归并排序
37、对n个元素进行快速排序,所需要的辅助存储空间为()。
A.O
(1)B.O(n)C.O(log2n)D.O(n2)
是非题:
1、在顺序表中定位第i个元素所花费的时间与i成正比。
(×)
2、在单链表中访问第i个元素所花费的时间与i成正比。
(√)
3、链式存储结构的优点是存储密度大,且插入和删除运算的效率高。
(×)
4、栈和队列都是顺序存储的线性结构。
(×)
5、“后进先出”不符合栈的特性。
(×)
6、一个2维数组可以视为其数据元素是1维数组的线性表。
(√)
7、空表就是所有元素都为0的表。
(×)
8、顺序存储结构不仅适宜表示完全二叉树,也完全适宜表示一般的二叉树。
(×)
9、二叉树先序遍历序列的最后一个结点,必是其中序遍历序列中的最后一个结点。
(×)
10、不使用递归也能实现二叉树的遍历。
(√)
11、一个无向图的邻接表中表结点的个数与边的个数一致。
(×)
12、一个有向图的邻接表和逆邻接表中表结点的个数不一定相等。
(×)
13、邻接表只能用于有向图的存储。
(×)
14、邻接矩阵只能用于表示无向图的顶点关系。
(×)
15、n(n>3)个带权叶子结点可以构成多棵哈夫曼树(最优二叉树)。
(√)
16、无向连通网存在最小生成树问题,而有向图不存在最短路径问题。
(×)
17、运用二分检索时,检索表中的元素必需以关键字递增(由小到大)有序排列。
(×)
18、哈希表中若不存在地址冲突或同义词,则其成功检索的平均检索长度等于1。
(√)
19、二路归并排序的核心操作是将两个有序序列合并为一个有序序列。
(√)
20、顺序检索表中的记录关键字递减(由大到小)有序时,不宜运用折半检索。
(×)
21、通常,选择排序比插入排序的元素交换次数要少。
(√)
22、对n个元素的集合进行归并排序时,需要的辅助存储空间为O(log2n)。
(×)
填空题:
1、在一个单链表中,在指针p所指向的结点之后插入指针s所指向的结点时,应执行如下操作:
s->next=p->next;p->next=s;
2、在一个单链表中,要删除指针p所指向结点的后继结点,应执行如下操作:
p->next=
p->next->next;
3、在一个链栈中,Top为指向栈顶的指针,p所指向的结点入栈时,应顺序执行如下操作语句:
p->next=Top;Top=p;
4、栈中的最后一个元素称为栈顶。
队列的第一个元素称为队首。
5、栈作为函数局部数据空间的数据结构。
队列作为文件缓冲区的数据结构。
6、size个结点的循环队列中,front指示当前队头的位置(下标),rear指示当前队尾的后一位置。
那么,在元素出队前,要执行front=(front+1)%size;语句;在元素入队前,要执行rear=(rear+1)%size;语句。
7、64个结点的完全二叉树中,有32个分枝结点,有32个叶子结点。
8、有15个结点的二叉树的二叉链表中,共有30个指针,其中有14个指针用于指向左、右孩子,剩余的16个指针为空。
9、一棵深度为6的满二叉树中,叶子结点的个数为32,分支结点的个数为31。
10、在有9个顶点的有向完全图中,共有72条弧。
11、在有9个顶点的无向完全图中,共有36条边;而其生成树中,有8条边。
12、各种选择排序算法中,最优的时间复杂度为O(nlog2n);最糟的时间复杂度为O(n2)。
13、各种排序算法中,最优的空间复杂度为O
(1);最坏的空间复杂度为O(n)。
14、含有n个顶点的有向图的邻接矩阵为A(Ai,j是其第i行、第j列元素),计算第i个顶点的出度公式为
;计算其入度的公式为
。
15、哈希(散列)检索的平均检索长度可以趋近于1。
16、平衡二叉检索树是指其任一结点的左子树与右子树深度的差不大于1的二叉检索树。
17、在连通的无向图中,求解指定源点到指定终点的最短路径,可以采用广度优先搜索算法。
18、求解连通网最小生成树的Prim算法的时间复杂度为O(n2),而Kruscal算法适用于边稀疏(e<=nlog2n)的连通网。
应用题:
1、已知一棵二叉树的先序遍历序列为ABCDEFGH,中序遍历序列为CBEDAHGF,试画出该二叉树。
2、试分别画出下面二叉树的二叉链表,并分别写出先序遍历和中序遍历该二叉树的结点访问序列。
3、如下无向图的顶点依次存储为a、b、c、d和e,试画出该图的邻接表。
4、如下有向图的顶点依次存储为A,B,C,D,E和F,试画出该图的邻接矩阵。
5、有向图的邻接矩阵如下所示,顶点的次序依次为A,B,C,D,E,试画出该图及其邻接表。
6、已知顺序表中存储的序列{3,2,5,0,8,4,9,6,7,1},将元素按其在表中的次序依次插入到一棵初始为空的二叉检索树中,画出插入完成后的二叉检索树,并计算该检索树在等概率情况下的成功检索的平均检索长度。
7、已知顺序表中存储的序列{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday},将元素按其在表中的次序依次插入到一棵初始为空的二叉检索树中,画出插入完成后的二叉检索树,并计算该检索树在等概率情况下的成功检索的平均检索长度。
8、已知某通讯电文中仅使用A、B、C、D、E等5个符号,且这些符号在电文中分别出现27、14、5、76、21次,试以这5个符号设计(画出)哈夫曼树,并写出其哈夫曼编码。
编程题:
1、线性表以单链表存储,指向头结点的指针为hp,试编写计算表长(元素结点个数)算法的函数。
假设,单链表的结点类型已定义为node,它含有存放元素的data域和指向后继结点的指针域next。
intlength(node*hp)
{intn=0;
nodep=hp->next;
while(p!
=NULL)
{n++;
p=p->next;
}
returnn;
}
2、编写一个实现在单链表中查找返回给定元素的结点地址的函数。
node*locate(node*hp,elemtpa)
{node*p=hp->next;
while(p!
=NULL&&p->data!
=a)p=p->next;
returnp;
}
3、编写一个实现在单链表中查找返回给定元素前趋的结点地址的函数。
node*locate_pre(node*hp,elemtpa)
{node*p=hp;
while(p->next!
=NULL&&p->next->data!
=a)p=p->next;
if(p->next!
=NULL)returnp;
returnNULL;
}
4、编写一个实现在单链表中指针p所指结点之后插入新元素结点的函数。
intinsert(node*hp,node*p,elemtpa)
{node*q=hp->next;
while(q!
=NULL&&q!
=p)p=p->next;
if(q==NULL)return0;//插入点不存在
q=newnode;
q->data=a;q->next=p->next;
p->next=q;
return1;
}
5、编写以二叉链表表示的二叉树中序遍历的算法函数。
voidtravel_mid(bt_node*bp)
{if(bp!
=NULL)
{travel_mid(bp->lp);
visit(bp);//访问结点
travel_mid(bp->rp);
}
6、编写一个计算以二叉链表表示的二叉树中叶子结点个数的函数。
intleaf_number(node*bp)
{if(bp==NULL)return0;
if(bp->lp==NULL&&bp->rp==NULL)return1;
returnleaf_number(bp->lp)+leaf_number(bp->rp);
}
7、以顺序表存储记录。
编写一个实现直接选择排序的函数。
voidsort_direct_sele(listnode*L,intn)
{inti,j,k;
listnodetemp;
for(i=0;i{k=i;//每趟的起始记录初始化为候选记录
for(j=i+1;jif(L[j].keyif(k!
=i)
{temp=L[i];L[i]=L[k];L[k]=temp;}//起始记录与最小记录交换
}
}
8、以顺序表存储记录。
编写一个实现直接插入排序的函数。
voidsort_direct_instert(listnode*L,intn)
{inti,j;
listnodetemp;
for(i=1;i{temp=L[i];//暂存待插入记录
j=i-1;
while((j>=0)&&(temp.key{L[j+1]=L[j];
j--;
}
L[j+1]=temp;//插入待插记录
}
}
9、编写一个在实现二叉检索树静态检索(查找并返回给定键值记录的存储地址)的函数。
bts_node*search(bts_node*p,keytypeK)
{while(p!
=NULL)
if(p->key==K)break;//检索成功
elseif(p->key>K)p=p->lp;
elsep=p->rp;
returnp;
}