无向图邻接矩阵转邻接表,实现广度优先,验证六度空间理论,源码+结果截图,实验报告

1.已知无向图G(学生给定,至少10个顶点)的邻接矩阵,设计算法,将其转换为邻接表存储结构。

1.描述述算法思路;

在邻接矩阵表示中,图形表示为二维数组,其中数组的每个元素代表图形中的一条边。如果两个顶点之间存在边,则邻接矩阵中对应的元素设置为1,否则设置为0。

在邻接表表示中,图中的每个顶点都表示为其邻居的链表。这允许更有效地存储和操作图,特别是当图是稀疏的(即具有低密度的边)时。

该算法首先为结构图分配内存并将邻接列表初始化为空。然后它遍历邻接矩阵并使用addEdge 函数在两个顶点之间添加一条边,如果该位置的邻接矩阵中有一个非零元素。

最后,adjMatrixToList 函数返回一个指向Graph 结构的指针,该结构在邻接表表示中表示相同的图。

1.

2.编程实现(需提交完整代码、含代码注释);

//

2.// Created by Win10 on 2022/12/19.

3.//

4.#include

5.#include

6.

7.// 表示邻接表节点的结构

8.struct AdjListNode {

9.int dest;

10.struct AdjListNode* next;

11.};

12.

13.// 表示邻接表的结构

14.struct AdjList {

15.struct AdjListNode* head; // 指向链表头部

16.};

17.

18.// 表示图的结构

19.// 一个数组包含所有的邻接表

20.struct Graph {

21.int V;

22.struct AdjList* array;

23.};

24.

25.// 创建一个新的邻接表节点

26.struct AdjListNode* newAdjListNode(int dest) {

27.struct AdjListNode* newNode =

28. (struct AdjListNode*)malloc(sizeof(struct AdjListNode

));

29. newNode->dest = dest;

30. newNode->next = NULL;

31.return newNode;

32.}

33.

34.// 创建一个图,V 为顶点数

35.struct Graph* createGraph(int V) {

36.struct Graph* graph = (struct Graph*)malloc(sizeof(struct Gra

ph));

37. graph->V = V;

38.

39.// 创建邻接表,V 个

40. graph->array = (struct AdjList*)malloc(V * sizeof(struct AdjL

ist));

41.

42.// 初始化邻接表的头指针

43.for (int i = 0; i < V; ++i) graph->array[i].head = NULL;

44.

45.return graph;

46.}

47.

48.// 无向图添加边

49.void addEdge(struct Graph* graph, int src, int dest) {

50.// 添加边 src->dest

51.struct AdjListNode* newNode = newAdjListNode(dest);

52. newNode->next = graph->array[src].head;

53. graph->array[src].head = newNode;

54.

55.// 添加边 dest->src

56. newNode = newAdjListNode(src);

57. newNode->next = graph->array[dest].head;

58. graph->array[dest].head = newNode;

59.}

60.

61.// 打印图的邻接表

62.void printGraph(struct Graph* graph) {

63.for (int v = 0; v < graph->V; ++v) {

64.struct AdjListNode* pCrawl = graph->array[v].head;

65.printf("\n Adjacency list of vertex %d\n head ", v);

66.while (pCrawl) {

67.printf("-> %d", pCrawl->dest);

68. pCrawl = pCrawl->next;

69. }

70.printf("\n");

71. }

72.}

73.

74.

75.struct Graph* adjMatrixToList(int

76. V, int** adjMatrix) {

77.struct Graph* graph = createGraph(V);

78.

79.for (int i = 0; i < V; i++) {

80.for (int j = 0; j < V; j++) {

81.if (adjMatrix[i][j]) {

82. addEdge(graph, i, j);

83. }

84. }

85. }

86.

87.return graph;

88.}

89.

90.//

91.int main() {

92.

93.// 顶点数

94.int V = 10;

95.int** adjMatrix = (int**)malloc(V * sizeof(int*));

96.for (int i = 0; i < V; i++) adjMatrix[i] = (int*)malloc(V * s

izeof(int));

97.

98.// 初始化邻接矩阵

99.for (int i = 0; i < V; i++) {

100.for (int j = 0; j < V; j++) {

101. adjMatrix[i][j] = 0;

102. }

103. }

104.

105.// 添加边

106. adjMatrix[0][1] = 1;

107. adjMatrix[0][2] = 1;

108. adjMatrix[0][3] = 1;

109.

110. adjMatrix[1][2] = 1;

111. adjMatrix[1][4] = 1;

112.

113. adjMatrix[2][3] = 1;

114. adjMatrix[2][4] = 1;

115. adjMatrix[2][5] = 1;

116.

117. adjMatrix[3][5] = 1;

118. adjMatrix[3][6] = 1;

119.

120. adjMatrix[4][5] = 1;

121. adjMatrix[4][7] = 1;

122.

123. adjMatrix[5][6] = 1;

124. adjMatrix[5][7] = 1;

125. adjMatrix[5][8] = 1;

126.

127. adjMatrix[6][8] = 1;

128. adjMatrix[6][9] = 1;

129.

130. adjMatrix[7][8] = 1;

131. adjMatrix[7][9] = 1;

132.

133. adjMatrix[8][9] = 1;

134.

135.// 打印邻接矩阵

136.struct Graph* graph = adjMatrixToList(V, adjMatrix); 137.

138.// 打印邻接表

139. printGraph(graph);

140.

141.return0;

142.}

143.

144.

3.运行结果截图;

4.结果分析(包括算法复杂度分析)。

时间复杂度:adjMatrixToList函数的时间复杂度为O(V^2),其中V为图中的顶点数。这是因为该函数遍历整个邻接矩阵,该矩阵具有 V^2 个元素。

空间复杂度:adjMatrixToList函数的空间复杂度也是O(V^2),因为它需要O(V^2)的空间来存储邻接矩阵。此外,该函数需要 O(V) 空间来存储 struct Graph 和 O(V) 空间来存储邻接列表数组。因此,总空间复杂度为 O(V^2)。

输出:代码的输出是图的邻接表表示。每个顶点的邻接列表打印在单独的一行上,带有顶点编号和它的邻居列表。

2. 根据题1的邻接表,实现广度优先遍历算法。

1.描述述算法思路;

为了实现 BFS,我们使用队列来存储等待访问的顶点。我们从给定的起始顶点开始,将其标记为已访问,并将其添加到队列中。然后,我们将前面的顶点从队列中取出并访问其所有未访问的相邻顶点,将它们标记为已访问并将它们添加到队列中。这个过程一直持续到队列为空,此时图中的所有顶点都被访问过。

2.编程实现(需提交完整代码、含代码注释);

1.#include

2.#include

3.

4.#define MAX_VERTICES 10

5.#define INF 99999

6.

7.// 顶点结构体

8.typedef struct AdjListNode

9.{

10.int dest;

11.struct AdjListNode* next;

12.} AdjListNode;

13.

14.// 邻接表结构体

15.typedef struct AdjList

16.{

17. AdjListNode* head;

18.} AdjList;

19.

20.// 图结构体

21.typedef struct Graph

22.{

23.int V;

24. AdjList* array;

25.} Graph;

26.

27.// 创建邻接表节点

28.AdjListNode* newAdjListNode(int dest)

29.{

30. AdjListNode* newNode = (AdjListNode*)malloc(sizeof(AdjListNod

e));

31. newNode->dest = dest;

32. newNode->next = NULL;

33.return newNode;

34.}

35.

36.// 创建图

37.Graph* createGraph(int V)

38.{

39. Graph* graph = (Graph*)malloc(sizeof(Graph));

40. graph->V = V;

41.

42. graph->array = (AdjList*)malloc(V * sizeof(AdjList));

43.

44.int i;

45.for (i = 0; i < V; ++i)

46. graph->array[i].head = NULL;

47.

48.return graph;

49.}

50.

51.// 添加边

52.void addEdge(Graph* graph, int src, int dest)

53.{

54. AdjListNode* newNode = newAdjListNode(dest);

55. newNode->next = graph->array[src].head;

56. graph->array[src].head = newNode;

57.}

58.

59.// 打印图

60.void BFS(Graph* graph, int start)

61.{

62.// 用于标记顶点是否被访问过

63.int* queue = (int*)malloc(graph->V * sizeof(int));

64.int front = 0;

65.int rear = 0;

66.

67.// 用于标记顶点是否被访问过

68.int* visited = (int*)malloc(graph->V * sizeof(int));

69.int i;

70.for (i = 0; i < graph->V; ++i)

71. visited[i] = 0;

72.

73.// 从起始顶点开始访问

74. visited[start] = 1;

75.queue[rear] = start;

76. ++rear;

77.

78.// 从队列中取出顶点

79.while (front != rear)

80. {

81.// 取出队列中的顶点

82.int vertex = queue[front];

83.printf("%d ", vertex);

84. ++front;

85.

86.// 取出顶点的邻接表

87. AdjListNode* adjList = graph->array[vertex].head;

88.while (adjList != NULL)

89. {

90.int dest = adjList->dest;

91.

92.// 如果邻接顶点没有被访问过,则入队列

93.if (!visited[dest])

94. {

95. visited[dest] = 1;

96.queue[rear] = dest;

97. ++rear;

98. }

99.

100. adjList = adjList->next;

101. }

102. }

103.}

104.

105.

106.int main()

107.{

108.// 创建图

109. Graph* graph = createGraph(MAX_VERTICES);

110.

111.// 添加边

112. addEdge(graph, 0, 1);

113. addEdge(graph, 0, 2);

114. addEdge(graph, 0, 3);

115. addEdge(graph, 1, 2);

116. addEdge(graph, 1, 4);

117. addEdge(graph, 2, 3);

118. addEdge(graph, 2, 4);

119. addEdge(graph, 2, 5);

120. addEdge(graph, 3, 5);

121. addEdge(graph, 3, 6);

122. addEdge(graph, 4, 5);

123. addEdge(graph, 4, 7);

124. addEdge(graph, 5, 6);

125. addEdge(graph, 5, 7);

126. addEdge(graph, 5, 8);

127. addEdge(graph, 6, 8);

128. addEdge(graph, 6, 9);

129. addEdge(graph, 7, 8);

130. addEdge(graph, 7, 9);

131. addEdge(graph, 8, 9);

132.

133.

134.

135.

136.

137.

138.

139.// 打印图

140. BFS(graph, 0);

141.

142.return0;

143.}

3.运行结果截图;

4.结果分析(包括算法复杂度分析)。

该图是用指定数量的顶点创建的,并且可以在成对的顶点之间添加边。该代码还包括广度优先搜索(BFS) 算法的实现,该算法从指定顶点开始遍历图形并在访问顶点时打印这些顶点。

该图使用Graph 结构表示,它包含一个整数字段V,它存储图中的顶点数,以及一个AdjList 结构数组,表示每个顶点的邻接列表。AdjList 结构包含指向特定顶点的相邻顶点链表中第一个AdjListNode 的头指针。AdjListNode 结构包含目标顶点的字段和指向列表中下一个AdjListNode 的指针。

createGraph 函数创建一个具有指定顶点数的新图,并将每个顶点的邻接表初始化为空。addEdge 函数通过为目标顶点创建一个新的AdjListNode 并将其插入到源顶点的邻接列表的头部来向图中添加一条新边。

BFS 函数从指定的顶点开始对图执行广度优先搜索。它使用队列来跟踪哪些顶点已被访问,并在它们从队列中出列时打印已访问的顶点。该函数在第一次遇到顶点时将其标记为已访问,并将其未访问的相邻顶点排队。搜索一直持续到队列为空,此时从起始顶点开始的所有可达顶点都已被访问。

3. 利用题2的广度优先遍历算法,验证六度空间理论。

1.描述算法思路;

建立一个无向图,其中节点表示人,边表示介绍关系。

对图中的每个节点进行遍历,并计算出它到其他所有节点的最短路径。

如果最短路径的长度不超过六,那么这两个节点就可以相互认识。

2.编程实现(需提交完整代码、含代码注释);

1.#include

2.#include

3.

4.#define MAX_VERTICES 10

5.#define INF 99999

6.

7.// 顶点结构体

8.typedef struct AdjListNode

9.{

10.int dest;

11.struct AdjListNode* next;

12.} AdjListNode;

13.

14.// 邻接表结构体

15.typedef struct AdjList

16.{

17. AdjListNode* head;

18.} AdjList;

19.

20.// 图结构体

21.typedef struct Graph

22.{

23.int V;

24. AdjList* array;

25.} Graph;

26.

27.// 创建邻接表节点

28.AdjListNode* newAdjListNode(int dest)

29.{

30. AdjListNode* newNode = (AdjListNode*)malloc(sizeof(AdjListNod

e));

31. newNode->dest = dest;

32. newNode->next = NULL;

33.return newNode;

34.}

35.

36.// 创建图

37.Graph* createGraph(int V)

38.{

39. Graph* graph = (Graph*)malloc(sizeof(Graph));

40. graph->V = V;

41.

42. graph->array = (AdjList*)malloc(V * sizeof(AdjList));

43.

44.int i;

45.for (i = 0; i < V; ++i)

46. graph->array[i].head = NULL;

47.

48.return graph;

49.}

50.

51.// 添加边

52.void addEdge(Graph* graph, int src, int dest)

53.{

54. AdjListNode* newNode = newAdjListNode(dest);

55. newNode->next = graph->array[src].head;

56. graph->array[src].head = newNode;

57.}

58.

59.// 打印图

60.void BFS(Graph* graph, int start)

61.{

62.// 用于标记顶点是否被访问过

63.int* queue = (int*)malloc(graph->V * sizeof(int));

64.int front = 0;

65.int rear = 0;

66.

67.// 用于标记顶点是否被访问过

68.int* visited = (int*)malloc(graph->V * sizeof(int));

69.int i;

70.for (i = 0; i < graph->V; ++i)

71. visited[i] = 0;

72.

73.// 从起始顶点开始访问

74. visited[start] = 1;

75.queue[rear] = start;

76. ++rear;

77.

78.// 从队列中取出顶点

79.while (front != rear)

80. {

81.// 取出队列中的顶点

82.int vertex = queue[front];

83.printf("%d ", vertex);

84. ++front;

85.

86.// 取出顶点的邻接表

87. AdjListNode* adjList = graph->array[vertex].head;

88.while (adjList != NULL)

89. {

90.int dest = adjList->dest;

91.

92.// 如果邻接顶点没有被访问过,则入队列

93.if (!visited[dest])

94. {

95. visited[dest] = 1;

96.queue[rear] = dest;

97. ++rear;

98. }

99.

100. adjList = adjList->next;

101. }

102. }

103.}

104.// 打印图

105.void FloydWarshall(Graph* graph) {

106.int V = graph->V;

107.int distances[V][V];

108.

109.// 初始化距离矩阵

110.int i, j, k;

111.for (i = 0; i < V; ++i) {

112.for (j = 0; j < V; ++j) {

113.if (i == j)

114. distances[i][j] = 0;

115.else

116. distances[i][j] = INF;

117. }

118. }

119.// 初始化距离矩阵

120.for (i = 0; i < V; ++i) {

121. AdjListNode *adjList = graph->array[i].head;

122.while (adjList != NULL) {

123.int dest = adjList->dest;

124. distances[i][dest] = 1;

125. distances[dest][i] = 1;

126.

127. adjList = adjList->next;

128. }

129. }

130.

131.// 通过中间顶点k,更新距离矩阵

132.for (k = 0; k < V; ++k) {

133.for (i = 0; i < V; ++i) {

134.for (j = 0; j < V; ++j) {

135.if (distances[i][j] > distances[i][k] + distance s[k][j])

136. distances[i][j] = distances[i][k] + distance s[k][j];

137. }

138. }

139. }

140.}

141.

142.int main()

143.{

144.// 创建图

145. Graph* graph = createGraph(MAX_VERTICES);

146.

147.// 添加边

148. addEdge(graph, 0, 1);

149. addEdge(graph, 0, 2);

150. addEdge(graph, 0, 3);

151. addEdge(graph, 1, 2);

152. addEdge(graph, 1, 4);

153. addEdge(graph, 2, 3);

154. addEdge(graph, 2, 4);

155. addEdge(graph, 2, 5);

156. addEdge(graph, 3, 5);

157. addEdge(graph, 3, 6);

158. addEdge(graph, 4, 5);

159. addEdge(graph, 4, 7);

160. addEdge(graph, 5, 6);

161. addEdge(graph, 5, 7);

162. addEdge(graph, 5, 8);

163. addEdge(graph, 6, 8);

164. addEdge(graph, 6, 9);

165. addEdge(graph, 7, 8);

166. addEdge(graph, 7, 9);

167. addEdge(graph, 8, 9);

168.

169.

170.

171.

172.

173.

174.

175.// 打印图

176. BFS(graph, 0);

177.// 打印图

178. FloydWarshall(graph);

179.

180.// 释放内存

181.int V = graph->V;

182.int i, j;

183.for (i = 0; i < V; ++i)

184. {

185.for (j = 0; j < V; ++j)

186. {

187.if (0)

188. {

189.printf("六度空间理论不成立!\n"); 190.return0;

191. }

192. }

193. }

194.

195.printf("六度空间理论成立!\n");

196.return0;

197.}

3.运行结果截图;

2.

4.结果分析(包括算法复杂度分析)。

这段代码实现了Floyd-Warshall 算法,用于计算图中所有节点之间的最短路径。

首先,它初始化了一个距离矩阵,其中distances[i][j] 表示节点i 到节点j 的距离。如果i 和j 是同一个节点,则距离为0,否则距离初始化为无穷大(INF)。

然后,它通过遍历图中的每个节点来更新距离矩阵。如果节点i 和节点j 有一条边相连,则distances[i][j] 和distances[j][i] 都被赋值为1。

最后,它使用Floyd-Warshall 算法的核心部分来更新距离矩阵。它通过遍历图中的每个节点k,更新节点i 到节点j 的距离。如果节点i 到节点j 的距离大于节点i 到节点k 的距离加上节点k 到节点j 的距离,则将节点i 到节点j 的距离更新为节点i 到节点k 的距离加上节点k 到节点j 的距离。

最终,距离矩阵中的每个元素都表示图中某两个节点之间的最短路径长度。例如,distances[i][j] 表示节点i 到节点j 的最短

图的深度广度优先遍历操作代码

一、实验目的 1.掌握图的各种存储结构,特别要熟练掌握邻接矩阵和邻接表存储结构; 2.遍历是图各种应用的算法的基础,要熟练掌握图的深度优先遍历和宽度优先遍历算法,复习栈和队列的应用; 3.掌握图的各种应用的算法:图的连通性、连通分量和最小生成树、拓扑排序、关键路径。 二、实验内容 实验内容1**图的遍历 [问题描述] 许多涉及图上操作的算法都是以图的遍历为基础的。写一个程序,演示在连通无向图上遍历全部顶点。 [基本要求] 建立图的邻接表的存储结构,实现无向图的深度优先遍历和广度优先遍历。以用户指定的顶点为起点,分别输出每种遍历下的顶点访问序列。 [实现提示] 设图的顶点不超过30个,每个顶点用一个编号表示(如果一个图有N个顶点,则它们的编号分别为1,2,…,N)。通过输入图的全部边输入一个图,每条边是两个顶点编号对,可以对边依附顶点编号的输入顺序作出限制(例如从小到大)。 [编程思路] 首先图的创建,采用邻接表建立,逆向插入到单链表中,特别注意无向是对称插入结点,且要把输入的字符在顶点数组中定位(LocateVex(Graph G,char *name),以便后来的遍历操作,深度遍历算法采用递归调用,其中最主要的是NextAdjVex(Graph G, int v, int w);FirstAdjVex ()函数的书写,依次递归下去,广度遍历用队列的辅助。 [程序代码] 头文件: #include #include #define MAX_VERTEX_NUM 30 #define MAX_QUEUE_NUMBER 30 #define OK 1 #define ERROR 0 #define INFEASIBLE -1

图 一. 选择题 1. 设有6个结点的无向图,该图至少应有()条边才能确保是一个连通图。 A.5 B.6 C.7 D.8 2. 设某完全无向图中有n个顶点,则该完全无向图中有()条边。 (A) n(n-1)/2 (B) n(n-1) (C) n2(D) n2-1 3. 设某有向图中有n个顶点,则该有向图对应的邻接表中有()个表头结点。 (A) n-1 (B) n (C) n+1 (D) 2n-1 4. 设无向图G中有n个顶点e条边,则其对应的邻接表中的表头结点和表结点的个数分别为()。 (A)n,e (B)e,n (C)2n,e (D)n,2e 5. 设某强连通图中有n个顶点,则该强连通图中至少有()条边。 (A)n(n-1) (B)n+1 (C)n (D)n(n+1) 6. 设某无向图中有n个顶点e条边,则该无向图中所有顶点的入度之和为()。 (A) n (B) e (C) 2n (D) 2e 7. 设某有向图的邻接表中有n个表头结点和m个表结点,则该图中有()条有向边。 (A) n (B) n-1 (C) m (D) m-1 8. 设连通图G中的边集E={(a,b),(a,e),(a,c),(b,e),(e,d),(d,f),(f,c)},则从顶点a出发可以得到一种深度优先遍历的顶点序列为()。 (A) abedfc (B) acfebd (C) aebdfc (D) aedfcb 9. 设某无向图中有n个顶点e条边,则建立该图邻接表的时间复杂度为()。 (A) O(n+e) (B) O(n2) (C) O(ne) (D) O(n3) 10. 设某无向图有n个顶点,则该无向图的邻接表中有()个表头结点。 (A) 2n (B) n (C) n/2 (D) n(n-1) 11. 设无向图G中有n个顶点,则该无向图的最小生成树上有()条边。 (A) n (B) n-1 (C) 2n (D) 2n-1

算法与数据结构课设(有向图,无向图,有向网,无向网)

算法与数据结构课程设计 报告 系(院):计算机科学学院 专业班级:教技1001 姓名:李## 学号: ******### 指导教师:*** 设计时间:2012.6.16 - 2012.6.24 设计地点:4号楼2号机房

目录 一、设计方案 (1) 二、实现过程以及代码 (2) 三、测试 (20) 四、结论和分析 (23) 五、难点和收获 (23)

一、 设计方案 1.程序设计基本过程: 拿到课程设计任务书, 按照要求,需要设计有向图、有向网、无向图 、无向网四种图,以及邻接矩阵、邻接表两种数据存储结构,三层以上的显示菜单。图的操作中又包含了有关线性表、栈和队列的基本操作。由于显示菜单已给出,剩下的任务就是把函数写入其中。 2.程序流程图: 预定义 定义结构体 定义变量 各种函数 3.程序设计的原理: 图的操作都是以两种存储结构为基础的:邻接矩阵存储结构和邻接表存储结构,如有向图,有向网,无向图,无向网的创建,其他的操作都是在四种图创建后才开始进行的。所以,首先必须理解两种存储结构的定义。 图的邻接矩阵存储结构即图的数组表示法。用两个数组分别存储数据元素(如顶点)的信息和数据元素之间的关系(如边或弧)的信息。用邻接矩阵存储结构的图具有以下几点特征: (一):顶点数:vexnum ,边(弧)数:arcnum ,图的种类:kind ; (二):邻接矩阵:arcs(1顶点关系类型:adj 2相关信息:*info); (三):顶点向量(顶点名):vexs[]; 其优点是以二维数组表示有n 个顶点的图时,需存放n 个顶点的信息和n*n 条弧的信息存储量。借助邻接矩阵容易判定任意两个顶点之间是否有边或弧相连,并容易求出各个顶点的度。缺点是时间复杂度是O (n*n ),例如,构造一个具有n 个顶点和e 条边的无向网的时间复杂度为O (n*n+e*n )。 图的邻接表存储结构是图的一种链式存储结构。对图中的每个顶点建立一个单链表,每个结点由三个域组成,邻接点域adjvex (弧尾在邻接表链表中的位序),链域nextarc (下一条弧),数据域info(权值)。还要建立一个邻接表链表,用以存放顶点的data 和后继指针firstarc,表头结点以顺序结构的形式存储,便于随机访问任一顶点的单链表。邻接表存储结构的优点在于其时间复杂度小。 树的深度优先搜索遍历类似于树的先根遍历,是树的先根遍历的推广。从图中的某个顶点出发,访问此顶点,然后依次从该顶点出发深度优先搜索遍历图,直至图中所有与该顶点有关的路径都被访问到;此时图中若还有顶点未被访问到,则另选图中的一个未被访问的顶点作为起始点,重述上述过程,直至所有顶点都被访问到。

数据结构第7章 图习题

第7章图 一、单项选择题 1.在一个无向图G中,所有顶点的度数之和等于所有边数之和的______倍。 A.l/2 B.1 C.2 D.4 2.在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的______倍。 A.l/2 B.1 C.2 D.4 3.一个具有n个顶点的无向图最多包含______条边。 A.n B.n+1 C.n-1 D.n(n-1)/2 4.一个具有n个顶点的无向完全图包含______条边。 A.n(n-l) B.n(n+l) C.n(n-l)/2 D.n(n-l)/2 5.一个具有n个顶点的有向完全图包含______条边。 A.n(n-1) B.n(n+l) C.n(n-l)/2 D.n(n+l)/2 6.对于具有n个顶点的图,若采用邻接矩阵表示,则该矩阵的大小为______。 A.n B.n×n C.n-1 D.(n-l) ×(n-l) 7.无向图的邻接矩阵是一个______。 A.对称矩阵B.零矩阵 C.上三角矩阵D.对角矩阵 8.对于一个具有n个顶点和e条边的无(有)向图,若采用邻接表表示,则表头向量的大小为______。 A.n B.e C.2n D.2e 9.对于一个具有n个顶点和e条边的无(有)向图,若采用邻接表表示,则所有顶点邻接表中的结点总数为______。

A.n B.e C.2n D.2e 10.在有向图的邻接表中,每个顶点邻接表链接着该顶点所有______邻接点。 A.入边B.出边 C.入边和出边D.不是入边也不是出边 11.在有向图的逆邻接表中,每个顶点邻接表链接着该顶点所有______邻接点。 A.入边B.出边 C.入边和出边D.不是人边也不是出边 12.如果从无向图的任一顶点出发进行一次深度优先搜索即可访问所有顶点,则该图一定是______。 A.完全图B.连通图 C.有回路D.一棵树 13.采用邻接表存储的图的深度优先遍历算法类似于二叉树的______算法。 A.先序遍历B.中序遍历 C.后序遍历 D.按层遍历 14.采用邻接表存储的图的广度优先遍历算法类似于二叉树的______算法。 A.先序遍历B.中序遍历 C.后序遍历 D.按层遍历 15.如果无向图G必须进行二次广度优先搜索才能访问其所有顶点,则下列说法中不正确的是______。 A.G肯定不是完全图B.G一定不是连通图 C.G中一定有回路D.G有二个连通分量 16.下列有关图遍历的说法不正确的是______。 A.连通图的深度优先搜索是一个递归过程 B.图的广度优先搜索中邻接点的寻找具有“先进先出”的特征 C.非连通图不能用深度优先搜索法 D.图的遍历要求每一顶点仅被访问一次 17.下列说法中不正确的是______。 A.无向图中的极大连通子图称为连通分量

实验六 图及其应用

实验六图及其应用 数据结构实验六图及其应用 1、实验目的 ? 熟练掌握图的两种存储结构(邻接矩阵和邻接表)的表示方法 ? 掌握图的基本运算及应用 ? 加深对图的理解,逐步培养解决实际问题的编程能力 2、实验内容: 采用邻接表或邻接矩阵方式存储图,实现图的深度遍历和广度遍历;用广度优先搜索方法找出从一顶点到另一顶点边数最少的路径。 1.问题描述:利用邻接表存储结构,设计一种图(有向或无向),并能够对其进行如下操作: 1) 创建一个可以随机确定结点数和弧(有向或无向)数的图; 2) 根据图结点的序号,得到该结点的值; 3) 根据图结点的位置的第一个邻接顶点的序号,以及下一个邻接顶点的序号; 4) 实现从第v 个顶点出发对图进行深度优先递归遍历; 5) 实现对图作深度 优先遍历; 6) 实现对图进行广度优先非递归遍历; 编写主程序,实现对各不同的算法调用。 2.实现要求:(以邻接表存储形式为例)编写图的基本操作函数:: 对图的各项操作一定要编写成为C(C++)语言函数,组合成模块化的形式, 每个算法的实现要从时间复杂度和空间复杂度上进行评价。 1)“建立图的邻接表算法”:CreateGraph(ALGraph *G) 操作结果:采用邻接表存储结构,构造没有相关信息的图G 2)“邻接表表示的图的递归深度优先遍历算法”:DFSTraverse(ALGraph G,void(*Visit)(char*)) 初始条件:图G 已经存在; 操作结果:返回图的按深度遍历的结果。 3)“邻接表表示的图的广度优先遍历算法”: BFSTraverse(ALGraph G,void(*Visit)(char*)) 初始条件:图G 已经存在;

数据结构第六章图理解练习知识题及答案解析详细解析(精华版)

图 1. 填空题 ⑴设无向图G中顶点数为n,则图G至少有()条边,至多有()条边;若G为有向图,则至少有()条边,至多有()条边。 【解答】0,n(n-1)/2,0,n(n-1) 【分析】图的顶点集合是有穷非空的,而边集可以是空集;边数达到最多的图称为完全图,在完全图中,任意两个顶点之间都存在边。 ⑵任何连通图的连通分量只有一个,即是()。 【解答】其自身 ⑶图的存储结构主要有两种,分别是()和()。 【解答】邻接矩阵,邻接表 【分析】这是最常用的两种存储结构,此外,还有十字链表、邻接多重表、边集数组等。 ⑷已知无向图G的顶点数为n,边数为e,其邻接表表示的空间复杂度为()。 【解答】O(n+e) 【分析】在无向图的邻接表中,顶点表有n个结点,边表有2e个结点,共有n+2e个结点,其空间复杂度为O(n+2e)=O(n+e)。 ⑸已知一个有向图的邻接矩阵表示,计算第j个顶点的入度的方法是()。 【解答】求第j列的所有元素之和 ⑹有向图G用邻接矩阵A[n][n]存储,其第i行的所有元素之和等于顶点i的()。 【解答】出度 ⑺图的深度优先遍历类似于树的()遍历,它所用到的数据结构是();图的广度优先遍历类似于树的()遍历,它所用到的数据结构是()。 【解答】前序,栈,层序,队列 ⑻对于含有n个顶点e条边的连通图,利用Prim算法求最小生成树的时间复杂度为(),利用Kruskal 算法求最小生成树的时间复杂度为()。 【解答】O(n2),O(elog2e) 【分析】Prim算法采用邻接矩阵做存储结构,适合于求稠密图的最小生成树;Kruskal算法采用边集数组做存储结构,适合于求稀疏图的最小生成树。 ⑼如果一个有向图不存在(),则该图的全部顶点可以排列成一个拓扑序列。 【解答】回路 ⑽在一个有向图中,若存在弧、、,则在其拓扑序列中,顶点vi, vj, vk的相对次序为()。 【解答】vi, vj, vk 【分析】对由顶点vi, vj, vk组成的图进行拓扑排序。 2. 选择题 ⑴在一个无向图中,所有顶点的度数之和等于所有边数的()倍。 A 1/2 B 1 C 2 D 4

计算机数据结构习题2附答案.

第六章图 1、填空题 一个有 n 个结点的无向图中,所有顶点的度数之和等于所有边数之和的 _2__倍。 一个有 n 个结点的强连通图,最多有 _n(n-1_/2__条边,最少有 ___n-1_ 条边。 在一个无向图中,所有顶点的度数之和等于所有边数之和的 __2____倍。 2、判断题 1无向图的邻接矩阵一定是对称矩阵。(√ 2有向图的邻接矩阵一定是对称矩阵。 (× 3图的深度优先搜索路径是唯一的。 (× 4图的广度优先搜索路径不是唯一的。(√ 5一个图可能存在多棵最小生成树。(√ 6无向图的邻接矩阵一定是对称的,有向图的邻接矩阵一定是不对称的。(√ 7图的关键路径是指从源点到汇点的最短路径。 (× 8用邻接矩阵法存储图,占用的存储空间数量只与图中边数有关,与结点个数无关。 (× 9对一个图分别进行深度优先搜索和广度优先搜索,得到的结点序列一定是相同的。 (× 10图的关键路径是指从源点到汇点的最长路径。(√ 3、选择题

1一个无向连通图的生成树是含有该连通图的全部顶点的 __A__。 A 、极小连通子图 B 、极小子图 C 、极大连通子图 D 、极大子图 2具有 e 条边的有向图,它的邻接表中有 _D__个弧结点。 A 、 e-1 B 、 2e C 、 2(e-1 D 、 e 3如果某图的邻接矩阵是对角线元素均为零的上三角矩阵,则此图是 __D__ A 、无向图 B 、完全图 C 、强连通图 D 、有向无环图 4顶点个数为 n 的有向图最多有 __D_条弧。 A 、 n-1 B 、 n(n-1/2 C 、 n(n+1/2 D 、 n(n-1 应用题: 1. 请给出图 1的所有最小生成树。 (10分 图 1 共两棵。 第一棵为:(5分错一条边扣 1分。

数据结构迷宫问题实验报告

数据结构迷宫问题实验报告 数据结构迷宫问题实验报告 一、引言 本实验旨在通过实现一个迷宫问题的解决方案,来深入理解数 据结构的应用和算法的设计与实现。通过本实验,我们将探索不同 迷宫问题的解决方法,并比较它们的效率和优劣。 二、背景知识 2·1 数据结构 在本实验中,我们将使用图作为数据结构,用于构建迷宫的表示。迷宫中的每个位置都将表示为一个节点,每个节点之间的连接 将表示为边。这样,我们就可以通过图的遍历算法来寻找迷宫的解。 2·2 算法 为了解决迷宫问题,我们将使用深度优先搜索 (DFS) 算法和广 度优先搜索 (BFS) 算法。DFS 算法通过回溯的方式逐步向前,直到 找到迷宫的终点或者无法继续前进为止。BFS 算法则通过广度优先 的方式逐层遍历,直到找到迷宫的终点为止。 三、实验方法 3·1 实验设计

本实验将分为以下几个步骤: 1·构建迷宫图:根据给定的迷宫地图,将其转化为一个图的表示,并为每个位置添加节点和边。 2·实现 DFS 算法:编写一个使用 DFS 算法来解决迷宫问题的函数。 3·实现 BFS 算法:编写一个使用 BFS 算法来解决迷宫问题的函数。 4·测试算法效果:使用不同的迷宫地图测试实现的算法,并比较它们的运行时间和解的质量。 3·2 实验步骤 1·根据给定的迷宫地图,将其转化为图的表示。可以使用邻接矩阵或邻接表存储图的结构。 2·实现一个深度优先搜索算法,用于解决迷宫问题。可以使用递归或栈来实现回溯。 3·实现一个广度优先搜索算法,用于解决迷宫问题。可以使用队列来实现层次遍历。 4·使用不同的迷宫地图测试实现的算法。记录每个算法的运行时间,并比较它们的解的质量。 四、实验结果与分析

实验任务书(8个)

目录 实验1 线性表顺序存储的应用 (2) 实验2 线性表链式存储的应用 (5) 实验3 栈及其应用 (6) 实验4 队列及其应用 (7) 实验5 树及其应用 (8) 实验6 图的遍历和连通性应用 (9) 实验7 图的最短路径应用 (11) 实验8 查找和排序应用 (12)

实验1 线性表顺序存储的应用 实验目的 1.熟悉C语言的上机环境,掌握C语言的基本结构。 2.会定义线性表的顺序存储结构。 3.熟悉对顺序表的一些基本操作和具体的函数定义。 4.掌握在线性表的顺序存储结构上的一些其它操作。 实验要求 1.独立完成; 2.程序调试正确,有执行结果。 实验内容 1、基础题: 编写应用程序(填空),实现可以在顺序表中插入任意给定数据类型(定义为抽象数据类型)数据的功能。要求在主函数中定义顺序表并对该顺序表插入若干个整数类型的数据(正整数),对它们求和并输出。请使用动态内存分配的方式申请数组空间,并把主函数设计为一个文件SeqList.cpp,其余函数设计为另一个文件SeqList.h。 请填空完成以下给出的源代码并调试通过。 (1)文件SeqList.h: typedef struct List{ ElemType *list; int size; int MaxSize; }SeqList; void InitList(SeqList &L) { //初始化线性表 ………… } void ClearList(SeqList &L) { //清除线性表 ……………… } int LengthList(SeqList L) { //求线性表长度 ………..

} bool InsertList(SeqList &L, ElemType item, int pos) { //按给定条件pos向线性表插入一个元素 ……. } ElemType GetList(SeqList L, int pos) { //在线性表L中求序号为pos的元素,该元素作为函数值返回………….. } (2)文件SeqList.cpp: #include #include typedef ElemType; #define MAXSize 10 #include "SeqList.h" void main(void) { SeqList myList; int i=1, x, sum=0, n; InitList ( ); scanf(“%d”, &x); while ( x!= -1 ) { if ( InsertList (myList, , i )==0) { printf("错误!\n"); return ; } i++; scanf(“%d”, &x); } n = LengthList (myList); for (i=1; i<=n; i++) { x=GetList(myList, i); sum = + x;

数据结构习题集

数据结构习题集 一、判断题: 1.图可以没有边,但不能没有顶点。( ) 2.在无向图中,(v1,v2)和(v2,v1)是两条不同的边。(X) 3.邻接表只能用于有向图的存储。(X) 4.一个图的邻接矩阵表示是唯一的。( ) 5.用邻接矩阵法存储一个图时,所占用的存储空间大小与图中顶点个数无关,而只与图的 边数有关。(X) 6.有向图不能进行广度优先遍历。(X) 7.若一个无向图以顶点v1为起点进行深度优先遍历,所得的遍历序列唯一,则可以唯一 确定该图。( ) 8.存储无向图的邻接矩阵是对称的,因此只要存储邻接矩阵上三角(或下三角)部分就可 以了。( ) 9.用邻接表法存储图时,占用的存储空间大小只与图中的边数有关,而与结点的个数无关。 (X) 10.若从一个无向图中任一顶点出发,进行一次深度优先遍历,就可以访问图中所有的顶点, 则该图一定是连通的。( ) 11.二分查找法要求待查表的关键字值必须有序。() 12.对有序表而言,采用二分查找部总比采用顺序查找法速度快。() 13.在二叉排序树中,根结点的值都小于孩子结点的值。() 14.散列存储法的基本思想是由关键字的值决定数据的存储地址。() 15.哈希表是一种将关键字转换为存储地址的存储方法。() 16.选择好的哈希函数就可以避免冲突的发生。() 17.在有序的顺序表和有序的链表上,均可以采用二分查找来提高查找的速度。() 18.采用分块查找,既能实现线性表所希望的查找速度,又能适应动态变化的需要。() 19.哈希查找的效率主要取决于哈希表构造时选取的哈希函数和处理冲突的方法。() 20.在二叉排序树上删除一个结点时,不必移动其他结点,只要将该结点的父结点的相应指 针域置空即可。() 二、填空题: 1.图常用的存储方式有邻接矩阵和等。 2.图的遍历有和广度优先搜索等方法。 3.有n条边的无向图邻接矩阵中,1的个数是。 4.有向图的边也称为。 5.图的邻接矩阵表示法是表示之间相信关系的矩阵。 6.有向图G用邻接矩阵存储,其第i行的所有元素之和等于顶点i的。 7.n个顶点e条边的图若采用邻接矩阵存储,则空间复杂度为。 8.n个顶点e条边的图若采用邻接表存储,则空间复杂度为。 9.设有一稀疏图G,则G采用存储比较节省空间。 10.设有一稠密图G,则G采用存储比较节省空间。 11.图的逆邻接表存储结构只适用于图。 12.n个顶点的完全无向图有条边。 13.有向图的邻接表表示适于求顶点的。

1设无向图的顶点个数为n

第7章图 一、选择题 1.设无向图的顶点个数为n,则该图最多有()条边。 A.n-1 B.n(n-1)/2 C. n(n+1)/2 D.0 E.n2 2.一个具有n个顶点的连通无向图,其边的个数至少为()。 A.n-1 B.n C.n+1 D.nlogn; 3.要连通具有n个顶点的有向图,至少需要()条边。 A.n-l B.n C.n+l D.2n 4.n个结点的完全有向图含有边的数目()。 A.n*n B.n(n+1) C.n/2 D.n*(n-l) 5.一个有n个结点的图,最少有()个连通分量,最多有()个连通分量。 A.0 B.1 C.n-1 D.n 6.在一个无向图中,所有顶点的度数之和等于所有边数()倍,在一个有向图中,所有顶点的入度之和等于所有顶点出度之和的()倍。 A.1/2 B.2 C.1 D.4 7.下列哪一种图的邻接矩阵是对称矩阵?() A.有向图 B.无向图 C.AOV网 D.AOE网 8. 下列说法不正确的是()。 A.图的遍历是从给定的源点出发每一个顶点仅被访问一次 B.图的深度遍历不适用于有向图 C.遍历的基本算法有两种:深度遍历和广度遍历 D.图的深度遍历是一个递归过程 9.下面哪一方法可以判断出一个有向图是否有环(回路): A.深度优先遍历 B. 拓扑排序 C. 求最短路径 D. 求关键路径10.已知有向图G=(V,E),其中V={V1,V2,V3,V4,V5,V6,V7}, E={,,,,,,,,},G的拓扑序列是()。 A.V1,V3,V4,V6,V2,V5,V7 B.V1,V3,V2,V6,V4,V5,V7 C.V1,V3,V4,V5,V2,V6,V7 D.V1,V2,V5,V3,V4,V6,V7 11.一个有向无环图的拓扑排序序列()是唯一的。 A.一定 B.不一定 12. 在有向图G的拓扑序列中,若顶点Vi在顶点Vj之前,则下列情形不可能出现的是()。 A.G中有弧 B.G中有一条从Vi到Vj的路径 C.G中没有弧 D.G中有一条从Vj到Vi的路径 13. 关键路径是事件结点网络中()。 A.从源点到汇点的最长路径 B.从源点到汇点的最短路径 C.最长回路 D.最短回路 三、填空题 1.判断一个无向图是一棵树的条件是______。 2.有向图G的强连通分量是指______。 4.具有10个顶点的无向图,边的总数最多为______。 5.若用n表示图中顶点数目,则有_______条边的无向图成为完全图。

掌握图的两种遍历算法深度优先搜索和广度优先搜索算

教学重点: 图的两种遍历算法:深度优先搜索和广度优先搜索算法 教学难点: 图的两种遍历算法:深度优先搜索和广度优先搜索算法 授课内容 5.3 图的遍历 和树的遍历类似,在此,我们希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次。这一过程就叫做图的遍历(TraversingGraph)。图的遍历算法是求解图 的连通性问题、拓扑排序和求关键路径等算法的基础。 然而,图的遍历要比树的遍历复杂得多。因为图的任一顶点都可能和其余的顶点相邻接。所以在访问了某个顶点之后,可能沿着某条路径搜索之后,又回到该顶点上。[例如]图7.1(b)中的G2,由于图中存在回路,因此在访问了v1,v2,v3,v4之后,沿着边(v4 , v1)又可访问到v1。为了避免同一顶点被访问多次,在遍历图的过程中,必须记下每个已访问过的顶点。为此,我们可以设一个辅助数组visited[0..n-1],它的初始值置为“假”或者零,一旦访问了顶点vi ,便置visited[i]为“真”或者为被访问时的次序号。 通常有两条遍历图的路径:深度优先搜索和广度优先搜索。它们对无向图和有向图都适用。 5.3.1 深度优先搜索 深度优先搜索(Depth-First Search)遍历类似于树的先根遍历,是树的先根遍历的推广。 其基本思想如下:假定以图中某个顶点vi 为出发点,首先访问出发点,然后选择一个vi 的未访问过的邻接点vj ,以vj 为新的出发点继续进行深度优先搜索,直至图中所有顶点都被访问过。显然,这是一个递归的搜索过程。

现以图5-3-1中G为例说明深度优先搜索过程。假定v0是出发点,首先访问v0。因v0有两个邻接点v1、v2均末被访问过,可以选择v1作为新的出发点,访问v1之后,再找v1的末访问过的邻接点。同v1邻接的有v0、v3和v4,其中v0已被访问过,而v3、v4尚未被访问过,可以选择v3作为新的出发点。重复上述搜索过程,继续依次访问v7、v4 。访问v4之后,由于与v4相邻的顶点均已被访问过,搜索退回到v7。由于v7、v3和v1都是没有末被访问的邻接点,所以搜索过程连续地从v7退回到v3,再退回v1,最后退回到v0。这时再选择v0的末被访问过的邻接点v2,继续往下搜索,依次访问v2、v5和v6,止此图中全部顶点均被访问过。遍历过程见图5-3-1(b),得到的顶点的访问序列为:v0 → v1 →v3 → v7 → v4 → v2 → v5 → v7。 (a)无向图G (b) G的深度优先搜索过程 图5-3-1 深度优先搜索遍历过程示例 因为深度优先搜索遍历是递归定义的,故容易写出其递归算法。下面的算法5.3是以邻接矩阵作为图的存储结构下的深度优先搜索遍历算法;算法5.4是以邻接表作为图的存储结构下的深度优先搜索遍历算法。 算法5.3 int visited[NAX_VEX]={0}; void Dfs_m( Mgraph *G,int i){ /* 从第i个顶点出发深度优先遍历图G,G以邻接矩阵表示*/ printf("%3c",G->vexs[i]); visited[i]=1; for (j=0;jarcs[i][j]==1)&& (!visited[j])) Dfs_m(G,j); } /*Dfs_m */ 算法5.4 int visited[VEX_NUM]={0}; void Dfs_L(ALgraph G,int i){ /* 从第i个顶点出发深度优先遍历图G,G以邻接表表示 */ printf("%3c",G[i].data); visited[i]=1; p=G[i].firstarc; while (p!=NULL) { if(visited[p->adjvex]==0)

数据结构上机实验指导书

计算机系

第一部分算法与数据结构课程实验概述 一.实验目的 《算法与数据结构》是计算机专业的主干课程和必修课程之一,其目的是让大家学习、分析和研究数据对象特征,掌握数据组织方法和计算机的表示方法,以便选择合适的数据逻辑结构和存储结构,设计相应的运算操作,把现实世界中的问题转化为计算机内部的表示与处理的方法,要求掌握算法的时间、空间复杂度分析基本技术,培养良好的程序设计风格,掌握进行复杂程序设计的技能。在计算机科学领域,尤其是在系统软件和应用软件的设计和应用中要用到各种数据结构,因此,掌握数据结构对提高软件设计和程序编制水平有很大的帮助。 二.实验要求 2.1实验步骤 设计步骤的规范不但可以培养学生科学的工作方法和作风,而且还能有效地减少错误,提高工作效率。因此必须严格执行良好的实验步骤规范(包括上机操作规范)。本课程实验的基本步骤是: 2.1.1问题分析 充分地分析和理解问题本身,明确问题要求做什么。对问题的描述应避开算法和所涉及的数据类型,而是对所需完成的任务作出明确的回答。例如;输入、输出数据的类型、值的范围以及形式等。同时为调试程序准备好测试数据,包含合法的输入数据和非法形式输入的数据。 2.1.2设计和编码

设计即是对问题描述中涉及的操作对象定义相应的数据类型,定义主程序模块和各抽象数据类型;定义相应的存储结构并写出各过程和函数的伪码算法。在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试。 编码即把详细设计的结果进一步求精为程序设计语言程序,写出源程序。对程序中的疑问应作出记号,以便上机时注意解决。每个明确的功能模块程序一般不超过60行,程序的每一行不得超过60个字符,否则要进一步划分。 2.1.3上机前程序静态检查 上机前程序静态检查可有效提高调试效率,减少上机调试程序时的无谓错误。 静态检查主要有两种途径:用一组测试数据手工执行程序;通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑。把程序中的明显错误事先排除。 2.1.4上机调试程序 上机实验时要带上《C语言》教材、《数据结构》教材、《数据结构上机实验指导书》,调试最好分模块进行,自底向下,即先调试低层过程或函数。调试过程中应多动手确定疑点,通过修改程序来证明。 调试正确后,认真整理源程序及其注释,写出或打印出带有完整注释的且格式良好的源程序清单和结果。 2.1.5完成上机实验报告 2.2实验报告格式

数据结构设计无向图

数据结构课程设计 ——无向图 学校 专业班级 姓名 学号 任课教师

题目3:以邻接链表的方式确定一个无向网,完成: ⑴建立并显示出它的邻接矩阵; ⑵对该图进行广度优先遍历,显示遍历的结果,(并随时显示队列的入、出情况); ⑶普里姆算法构造其最小生成树,随时显示其构造的过程; ⑷用克鲁斯卡尔算法构造其最小生成树,随时显示其构造的过程。 一、需求分析 1.运行环境: Microsoft Visual Studio 2012 2.程序所实现的功能: a)建立并显示图的邻接矩阵; b)广度优先遍历该图,显示遍历结果; c)用普里姆算法构造该图的最小生成树,显示构造过程; d)用克鲁斯卡尔算法构造该图的最小生成树,显示构造过程。 3.程序的输入,包含输入的数据格式和说明: a)输入顶点数,及各顶点信息(数据格式为整形); b)输入弧以及其权值(数据格式为整形)。 1.程序的输出,程序输出的形式: a)输出图的邻接矩阵; b)广度优先遍历结果; c)普里姆算法构造最小生成树的结果;

d)克鲁斯卡尔算法构造最小生成树的结果。 2.测试数据,如果输入的数据量较大,需要给出测试数据: a)顶点个数:5 b)各个顶点为:A B C D E c)输入所有的弧(格式为“顶点顶点权值”)为: A B 10 A C 4 B D 3 C D 5 B E 6 D E 9 二、设计说明 算法设计的思想: 建立图类,建立相关成员函数。最后在主函数中实现。具体成员函数的实现请参看源程序。在本次的设计中,我采用的是多文件的编程方式。每个类写成了一个头文件。这样有助于阅读和查看源程序。 1.邻接链表: 邻接链表是一种链式存储结构。在邻接链表中,对图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边(对有向图是以顶点Vi为尾的弧)。每个结点由3个域组成,其中邻接点域指示与顶点Vi邻接的点在图中的位置,链域指示下一条边或弧的结点;数据域存储和边或弧相关的信息,如权值等。 所以一开始必须先定义邻接链表的边结点类型以及邻接链表类型,并对邻接链表进行初始化,然后根据所输入的相关信息,包括图的顶点数、边数、是否为有向,以及各条边的起点与终点序号,建立图的邻接链表。

图练习与答案

1. 首先将如下图所示的无向图给出英存储结构的邻接链表表示,然后写出对其分别进行深 度,广度优先遍历的结果。 答•深度优先遍历序列:125967384 宽度优先遍历序列:123456789 注:(1)邻接表不唯一,这里顶点的邻接点按升序排列 (2) 在邻接表确泄后,深度优先和宽度优先遍历序列唯一 (3) 这里的遍历,均从顶点1开始 2. 给出图G : 画岀G 的邻接表表示图: 3. 在什么情况下,Prim 算法与Kruskual 算法生成不同的MST? 答.在有相同权值边时生成不同的MST,在这种情况下,用Prim 或Kruska 1也会生成不 同的 应用丿 画出G 的深度优先生成树和广度优先生成树。 (1).

HST

4・已知一个无向图如下图所示,要求分别用Prim和Kruskal算法生成最小树(假设以①为起点,试画出构适过程)。 答.Prim算法构造最小生成树的步骤如24题所示,为节省篇幅,这里仅用Kruskal算法, 构造最小生成树过程如下:(下图也可选(2, 4)代替(3, 4), (5, 6〉代替⑴5)) 5.G=(V,E)是一个带有权的连通图,则: (1). ifi回答什么是G的最小生成树: (2). G为下图所示,请找出G的所有最小生成树。 答.(1)最小生成树的左义见上而26题 (2)最小生成树有两棵。 邙艮于篇幅,下而的生成树只给岀顶点集合和边集合,边以三元组(Vi,Vj,W)形式),其中 W代表权值。 V (G) ={1, 2, 3, 4, 5} E1(G) = {(4, 5, 2), (2, 5, 4), (2, 3, 5), (1, 2, 7) }: E2(G)={(4, 5, 2), (2, 4, 4), (2, 3, 5), (b 2、7) } 6.请看下边的无向加权图。(1).写出它的邻接矩阵。(2).按Prim算法求其最小生成树, 并给出构造最小生成树过程中辅助数组的各分量值。辅助数组各分量值:

数据结构题库

选择 对于线性表L,适用于使用链式结构的情况是() A.需经常修改L中的结点值 B.需不断对L进行删除插入 C.L中含有大量的结点 D.L中结点结构复杂 数据结构中,与所使用的计算机无关的是数据的() A.存储结构 B.物理结构 C.逻辑结构 D.线性结构 若用一个大小为6的数组来实现循环队列,且当前队尾和队头的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,则() A.队尾为1、队头为5 B. 队尾为2、队头为4 C. 队尾为4、队头为2 D. 队尾为5、队头为1 在一个栈顶指针为HS的链栈中,将一个S指针所指的结点入栈,实现语句是()A.HS->next=s B.S->next=HS->next;HS->next=s C.S->next=HS->next;HS=s D.S->next=HS;HS=HS->next 从未排序序列中依次取出元素与已排序序列(初始时为空)中的元素进行比较,将其放入已排序序列的正确位置上,这种排序方法是() A.希尔排序 B.冒泡排序 C.插入排序 D.选择排序 堆排序是一种() A.插入排序 B.选择排序 C.交换排序 D.归并排序 在一个有向图中,所有顶点的入度之和等于所有顶点出度之和的()A.1/2倍 B.1倍 C.2倍 D.4倍 二叉树是非线性数据结构,所以() A.它不能用顺序存储结构存储 B.它不能用链式存储结构存储; C.它能采用顺序存储结构和链式存储结构存储 D.它既不能使用顺序存储结构和也不能使用链式存储结构存储 若一个满二叉树有m个树叶,n个结点,深度为h,则m、n、h满足关系()A.n=h+m B.h+m=2n C.m=h-1 D.n=2h-1 采用直接选择排序,总的比较次数为() A.O(n)B.O(log2 n)C.O(n log2 n)D.O(n2) 计算机算法必须具备输入、输出和()等5个特性。 A.可行性、可移植性和可扩充性 B.可行性、确定性和有穷性 C.确定性、有穷性和稳定性 D.易读性、稳定性和安全性 设有两个串p和q,求q在p中首次出现的位置的运算称作() A.连接B.模式匹配C.求子串D.求串长 把一棵树转换为二叉树后,这棵二叉树的形态是() A.唯一的B.有多种 C.有多种,但根结点都没有左孩子D.有多种,但根结点都没有右孩子 广度优先遍历类似于二叉树的()

数据结构复习题

数据结构复习题 LELE was finally revised on the morning of December 16, 2020

2017 ~ 2018学年度第2学期 《数据结构》复习提纲 1.在数据结构中,从逻辑上可以把数据结构分为_________两类。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 2.链表不具有的特点是_________。 A.可随机访问任一元素B.插入、删除不需要移动的元素 C.不必事先估计存储空间D.所需空间与线性表长度成正比 3.若线性表最常用的运算是存取第i个元素及其前驱元素,则采用_________存储方式节省时间。 A.单链表B.双链表C.循环单链表D.顺序表 4.算法分析的目的是_________。 A.找出数据结构的合理性B.研究算法中的输入和输出关系 C.分析算法的效率以求改进D.分析算法的易读性和文档性 5.若一个栈用数组data[1..n]存储,初始栈顶指针top为0,则以下元素x进栈的操作正确的是_________。 A.top++; data[top]=x; B.data[top]=x; top++; C.top--; data[top]=x; D.data[top]=x; top--; 6.表达式a*(b+c)-d的后缀表达式是_________。 A.abcd*+- B.abc+*d- C.abc*+d- D.-+*abcd 7.递归函数f(1)=1,f(n)=f(n-1)+n(n>1)的递归出口是_________。 A.f(1)=1 B.f(1)=0 C.f(0)=0 D.f(n)=n 8.将递归算法转换成对应的非递归算法时,通常需要使用_________保存中间结果。 A.队列B.栈C.链表D.树 9.对稀疏矩阵采用压缩存储,其缺点之一是_________。 A.无法判断矩阵有多少行、多少列 B.无法根据行、列号查找某个矩阵元素 C.无法根据行、列号直接计算矩阵元素的存储地址 D.使矩阵元素之间的逻辑关系更加复杂 10.一个n阶上三角矩阵a按行优先顺序压缩存放在一维数组b中,则b中的元素个数是 _________。 A.n B.n2C.n(n+1)/2 D.n(n+1)/2+1 11.度为4,高度为h的树_________。 A.至少有h+3个结点B.最多有4h-1个结点 C.最多有4h个结点D.至少有h+4个结点 12.用双亲存储结构表示树,其优点之一是比较方便_________。 A.找指定结点的双亲结点B.找指定结点的孩子结点 C.找指定结点的兄弟结点D.判断某结点是不是叶子结点

东南大学十套数据结构试题及答案

数据构造试卷〔一〕 三、计算题〔每题6 分,共24分〕 1.在如下数组A中链接存储了一个线性表,表头指针为A [0].next,试写出该线性表。 A 0 1 2 3 4 5 6 7 data 60 50 78 90 34 40 next 3 5 7 2 0 4 1 2.请画出以下列图的邻接矩阵和邻接表。 3.一个图的顶点集V和边集E分别为:V={1,2,3,4,5,6,7}; E={(1,2)3,(1,3)5,(1,4)8,(2,5)10,(2,3)6,(3,4)15, (3,5)12,(3,6)9,(4,6)4,(4,7)20,(5,6)18,(6,7)25}; 用克鲁斯卡尔算法得到最小生成树,试写出在最小生成树中依次得到的各条边。 4.画出向小根堆中参加数据4, 2, 5, 8, 3时,每参加一个数据后堆的变化。 四、阅读算法〔每题7分,共14分〕 1.LinkList mynote(LinkList L) {//L是不带头结点的单链表的头指针 if(L&&L->next){ q=L;L=L->next;p=L; S1:while(p->next) p=p->next; S2:p->next=q;q->next=NULL; } return L; } 请答复以下问题: 〔1〕说明语句S1的功能; 〔2〕说明语句组S2的功能; 〔3〕设链表表示的线性表为〔a1,a2, …,a n〕,写出算法执行后的返回值所表示的线性表。 2.void ABC(BTNode * BT) { if BT { ABC (BT->left); ABC (BT->right); cout<data<<' '; } } 该算法的功能是: 五、算法填空〔共8分〕 二叉搜索树的查找——递归算法: bool Find(BTreeNode* BST,ElemType& item)

相关主题
相关文档
最新文档