c语言使用邻接矩阵的方法创建一个图使用深度优先遍历与广度优先遍历
邻接矩阵表示法是一种常用的图表示方法,它通过一个二维数组来表示图中各个节点之间的关系。
以下是使用邻接矩阵创建一个无向图的示例:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_VERTEX_NUM 100
// 邻接矩阵结构体
typedef struct {
int vertex[MAX_VERTEX_NUM]; // 存储顶点信息
int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 存储边信息
int vertex_num; // 记录顶点数
int edge_num; // 记录边数
} Graph;
// 初始化图
void init_graph(Graph *G) {
int i, j;
for (i = 0; i < MAX_VERTEX_NUM; i++) {
G->vertex[i] = 0;
for (j = 0; j < MAX_VERTEX_NUM; j++) {
G->edge[i][j] = 0;
}
}
G->vertex_num = 0;
G->edge_num = 0;
}
// 添加顶点
void add_vertex(Graph *G, int vertex) {
G->vertex[G->vertex_num] = vertex;
G->vertex_num++;
}
// 添加边
void add_edge(Graph *G, int v1, int v2) {
G->edge[v1][v2] = 1;
G->edge[v2][v1] = 1;
G->edge_num++;
}
// 深度优先遍历
void DFS(Graph *G, bool *visited, int v) {
int i;
visited[v] = true;
printf("%d ", G->vertex[v]);
for (i = 0; i < G->vertex_num; i++) {
if (G->edge[v][i] == 1 && visited[i] == false) {
DFS(G, visited, i);
}
}
}
// 广度优先遍历
void BFS(Graph *G, bool *visited, int v) {
int queue[MAX_VERTEX_NUM];
int front = 0, rear = 0;
int i, j;
visited[v] = true;
printf("%d ", G->vertex[v]);
queue[rear++] = v;
while (front != rear) {
i = queue[front++];
for (j = 0; j < G->vertex_num; j++) {
if (G->edge[i][j] == 1 && visited[j] == false) {
visited[j] = true;
printf("%d ", G->vertex[j]);
queue[rear++] = j;
}
}
}
}
int main() {
int i;
Graph G;
bool visited[MAX_VERTEX_NUM] = { false };
init_graph(&G);
add_vertex(&G, 1);
add_vertex(&G, 2);
add_vertex(&G, 3);
add_vertex(&G, 4);
add_edge(&G, 0, 1);
add_edge(&G, 0, 2);
add_edge(&G, 0, 3);
add_edge(&G, 1, 2);
add_edge(&G, 2, 3);
printf("邻接矩阵表示的图:\n");
for (i = 0; i < G.vertex_num; i++) {
int j;
for (j = 0; j < G.vertex_num; j++) {
printf("%d ", G.edge[i][j]);
}
printf("\n");
}
printf("深度优先遍历结果:");
DFS(&G, visited, 0);
printf("\n");
for (i = 0; i < G.vertex_num; i++) {
visited[i] = false;
}
printf("广度优先遍历结果:");
BFS(&G, visited, 0);
printf("\n");
return 0;
}
上面的代码中,我们定义了一个 Graph 结构体,其中包含了 vertex 数组和 edge 数组,分别用于存储顶点信息和边信息。我们可以通过 add_vertex 和 add_edge 函数来向图中添加顶点和边。在深度优先遍历和广度优先遍历中,我们使用了 visited 数组来记录每个节点是否已经被遍历过。在遍历时,我们从起点开始递归或使用队列依次遍历与其相邻的节点。最后,我们打印出遍历的结果。
输出结果如下:
邻接矩阵表示的图:
0 1 1 1
1 0 1 0
1 1 0 1
1 0 1 0
深度优先遍历结果:1 2 3 4
广度优先遍历结果:1 2 3 4
可以看到,我们成功地使用邻接矩阵创建了一个无向图,并使用深度优先遍历和广度优先遍历来遍历了整个图
原文地址: https://www.cveoy.top/t/topic/frzz 著作权归作者所有。请勿转载和采集!