[问题描述] 很多涉及图的操作都是以图的遍历操作为基础的,试编写程序,实现图的深度优先和广度优先遍历操作。 ·[基本要求] 以邻接表为存储结构,顶点和边的信息需输入,以用户指定的结点为起点,输出 DFS和BFS遍历下的结点访问序列。用 c 语言 编写代码并附上
时间: 2024-02-25 09:57:37 浏览: 9
好的,以下是使用 C 语言编写的图的深度优先遍历和广度优先遍历的代码和注释,希望能对你有所帮助。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100 // 最大顶点数
// 邻接表存储结构的图
typedef struct Graph {
int vertex_num; // 顶点数
int adj_list[MAX_VERTICES][MAX_VERTICES]; // 邻接表
} Graph;
// 深度优先遍历
void dfs(Graph* graph, int start_vertex, int* visited) {
visited[start_vertex] = 1; // 标记当前顶点已访问
printf("%d ", start_vertex);
// 遍历当前顶点的所有邻接点
for (int i = 0; i < graph->vertex_num; i++) {
if (graph->adj_list[start_vertex][i] && !visited[i]) {
dfs(graph, i, visited);
}
}
}
// 广度优先遍历
void bfs(Graph* graph, int start_vertex) {
int visited[MAX_VERTICES] = {0}; // 标记所有顶点未访问
int queue[MAX_VERTICES] = {0}; // 用队列存储待访问的顶点
int front = 0, rear = 0; // 队列的前后指针
visited[start_vertex] = 1; // 标记起点已访问
queue[rear++] = start_vertex; // 将起点入队
while (front < rear) {
int vertex = queue[front++]; // 取出队首顶点
printf("%d ", vertex);
// 遍历当前顶点的所有邻接点
for (int i = 0; i < graph->vertex_num; i++) {
if (graph->adj_list[vertex][i] && !visited[i]) {
visited[i] = 1;
queue[rear++] = i;
}
}
}
}
int main() {
int vertex_num, edge_num, start_vertex;
Graph graph = {0};
// 输入顶点数和边数
printf("请输入顶点数和边数:");
scanf("%d%d", &vertex_num, &edge_num);
graph.vertex_num = vertex_num;
// 输入边的信息
for (int i = 0; i < edge_num; i++) {
int src, dest;
printf("请输入第%d条边的起点和终点:", i + 1);
scanf("%d%d", &src, &dest);
graph.adj_list[src][dest] = 1;
}
// 输入起点
printf("请输入起点:");
scanf("%d", &start_vertex);
// DFS遍历
printf("DFS遍历:");
int visited[MAX_VERTICES] = {0};
dfs(&graph, start_vertex, visited);
printf("\n");
// BFS遍历
printf("BFS遍历:");
bfs(&graph, start_vertex);
printf("\n");
return 0;
}
```
以上就是使用 C 语言编写的图的深度优先遍历和广度优先遍历的代码和注释,希望能对你有所帮助。