数据结构复习题
判断
1.1、所谓“循环队列”是指用单向循环链表或者循环数组表示的队列。(2分)
解:错误。将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)
2.二分法不能用于链表
3.二分法查找平均复杂度是O(logN)
4.数据的物理结构是指数据在计算机中的实际存储形式。
5.数据的逻辑结构与数据元素本身的内容和形式无关。
6.数据的逻辑结构是指数据的各数据项之间的逻辑关系。
F
逻辑结构是指数据元素之间的逻辑关系
7.数据的逻辑结构说明数据元素之间的顺序关系,它依赖于计算机的存储结构
错
与储存结构没有直接关系
8.数据结构的抽象操作的定义与具体实现无关
9.在数据结构中,与所使用的计算机无关的数据结构是(逻辑结构)
10.数据结构涉及数据的逻辑结构、存储结构和施加其上的操作3个方面
11.数据结构操作的实现与存储结构有关
12.定义逻辑结构时可不考虑存储结构
1-4
用邻接表法存储图,占用的存储空间数只与图中结点个数有关,而与边数无关。
(1分)
F
1-5
用邻接矩阵法存储图,占用的存储空间数只与图中结点个数有关,而与边数无关。
(1分)
T
1-6
如果无向图G必须进行两次广度优先搜索才能访问其所有顶点,则G中一定有回路。
(2分)
F
1-7
如果无向图G必须进行两次广度优先搜索才能访问其所有顶点,则G一定有2个连通分量。
T
2-3
对于给定的有权无向图G,下列哪个说法是正确的?
(3分) D
A.
G的最小生成树中,任意一对顶点间的路径必是它们在G中的最短路径
B.
设顶点V到W的最短路径为P。若我们将G中每条边的权重都加1,则P一定仍然是V到W的最短路径
C.
单源最短路问题可以用O(∣E∣+∣V∣)的时间解决
D.
以上都不对
2-4
下列有关图的叙述中,有几句是对的?
如果e是有权无向图G唯一的一条最短边,那么边e一定会在该图的最小生成树上。
如果无向图的宽度优先搜索的结果为1234…,且顶点1与顶点4之间存在一条边相连,那么顶点1与顶点3之间也一定有边相连。
如果从有向图G(至少有2个顶点)的每一点均能通过深度优先搜索遍历到所有其它顶点,那么该图一定不存在拓扑序列。
若图采用邻接矩阵表示,如果该矩阵不全为0,且矩阵主对角线以下全是0,那么说明该图一定是有向图。
(3分)A
A.
4句
B.
3句
C.
2句
D.
1句
2-5
如果G是一个有15条边的非连通无向图,那么该图顶点个数最少为多少?
(3分)
A.
7
B.
8
C.
9
D.
10
解:无向图的边数:n(n-1)/2
n=6
又因为非连通再加1
n=7
2-8
设有向图的顶点个数为n,则该图最多可以有()条弧。
(2分)C
A.
n-1
B.
n(n-1)/2
C.
n(n-1)
D.
n^2
2-13
连通图的极小连通子图称为该图的()。
B
(2分)
A.
关键路径
B.
生成树
C.
回路
D.
最小回路
2-14
有拓扑排序的图一定是()。
(2分)B
A.
无向图
B.
有向无环图
C.
有环图
D.
强连通图
又环的也可以是无向连通图
2-15
下列关于无向连通图特性的叙述中,正确的是 I.所有顶点的度之和为偶数 II.边数大于等于顶点个数减1 III.至少有一个顶点的度为1 。
(2分)C
A.
只有I
B.
只有II
C.
I和II
D.
I和III
拓扑排序
void Topsort( Graph G )
{
Queue Q;
Vertex V, W;
NodePtr ptr;
int counter = 0;
Q = CreateEmptyQueue(NumVertex);
for ( V=0; V<G->NumV; V++ )
if ( Indegree[V] == 0 )
Enqueue(V, Q);
while ( !IsEmpty(Q) ){
V = Dequeue( Q );
TopNum[V] =
++counter
;
for ( ptr=G->List[V]; ptr; ptr=ptr->Next) {
W = ptr->Vertex;
if (
--Indegree[W]
== 0 )
Enqueue(W, Q);
}
}
if ( counter != NumVertex )
printf("ERROR: Graph has a cycle.\n");
DisposeQueue(Q);
}
BFS
void BFS(LGraph Graph, Vertex S, void(*Visit)(Vertex))
{
int p [MaxVertexNum+10],a;
PtrToAdjVNode q = NULL;
int f = 0, r = 0;
p[r++] = S;
Visited[S] = true;
while (f!=r)
{
a = p[f++];
Visit(a);
q = Graph->G[a].FirstEdge;
while (q)
{
if (!Visited[q->AdjV])
{
p[r++] = q->AdjV;
Visited[q->AdjV] = true;
}
q = q->Next;
}
}
}
DFS
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ){
Vertex i;
Visited[V] = 1;
Visit(V);
for(i = 0; i < Graph->Nv ; i++){
if(Graph->G[V][i] ==1&&!Visited[i]){
DFS(Graph, i, Visit);
}
}
return;
}