用C语言建立一个有向图的邻接矩阵表示,实现对图的广度优先遍历
时间: 2023-09-05 15:09:53 浏览: 99
以下是用C语言建立一个有向图的邻接矩阵表示,实现对图的广度优先遍历的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20 // 最大顶点数
int visited[MAX_VERTEX_NUM]; // 记录顶点是否已被访问
// 邻接矩阵结构体
typedef struct {
int vertex[MAX_VERTEX_NUM]; // 顶点数组
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vexnum, arcnum; // 顶点数和边数
} MGraph;
// 初始化邻接矩阵
void InitMGraph(MGraph *G) {
int i, j;
for (i = 0; i < MAX_VERTEX_NUM; i++) {
G->vertex[i] = 0;
visited[i] = 0;
for (j = 0; j < MAX_VERTEX_NUM; j++) {
G->arcs[i][j] = 0;
}
}
G->vexnum = 0;
G->arcnum = 0;
}
// 添加顶点
void AddVertex(MGraph *G, int v) {
if (G->vexnum >= MAX_VERTEX_NUM) {
printf("Error: Too many vertices!\n");
return;
}
G->vertex[G->vexnum++] = v;
}
// 添加边
void AddArc(MGraph *G, int v1, int v2) {
int i, j, k;
for (i = 0; i < G->vexnum; i++) {
if (G->vertex[i] == v1) {
break;
}
}
for (j = 0; j < G->vexnum; j++) {
if (G->vertex[j] == v2) {
break;
}
}
if (i >= G->vexnum || j >= G->vexnum) {
printf("Error: Vertex not found!\n");
return;
}
G->arcs[i][j] = 1;
G->arcnum++;
}
// 广度优先遍历
void BFS(MGraph *G, int v) {
int queue[MAX_VERTEX_NUM], front = 0, rear = 0; // 队列
int i, j, k;
for (i = 0; i < G->vexnum; i++) {
visited[i] = 0;
}
visited[v] = 1;
printf("%d ", G->vertex[v]);
queue[rear++] = v;
while (front < rear) {
k = queue[front++];
for (i = 0; i < G->vexnum; i++) {
if (G->arcs[k][i] == 1 && visited[i] == 0) {
visited[i] = 1;
printf("%d ", G->vertex[i]);
queue[rear++] = i;
}
}
}
printf("\n");
}
int main() {
MGraph G;
int i;
// 初始化邻接矩阵
InitMGraph(&G);
// 添加顶点
for (i = 1; i <= 6; i++) {
AddVertex(&G, i);
}
// 添加边
AddArc(&G, 1, 2);
AddArc(&G, 1, 3);
AddArc(&G, 2, 4);
AddArc(&G, 2, 5);
AddArc(&G, 3, 5);
AddArc(&G, 4, 6);
AddArc(&G, 5, 4);
AddArc(&G, 5, 6);
// 广度优先遍历
BFS(&G, 0);
return 0;
}
```
这个代码示例中,我们先定义了一个结构体 `MGraph` 用于表示邻接矩阵,包括顶点数组 `vertex` 和邻接矩阵 `arcs`,以及顶点数和边数 `vexnum` 和 `arcnum`。然后,我们实现了初始化邻接矩阵、添加顶点和添加边的函数。最后,我们实现了广度优先遍历的函数 `BFS`,使用队列实现遍历过程。
在主函数中,我们使用上述函数建立了一个有向图,并对其进行了广度优先遍历。
阅读全文