用C语言用邻接矩阵实现图的深度优先遍历和广度优先遍历
时间: 2024-06-13 16:07:21 浏览: 135
使用C语言实现图的深度优先遍历和广度优先遍历的过程如下:
1.邻接矩阵的定义
```c
#define MAXVEX 100 // 最大顶点数
#define INFINITY 65535 // 用65535来代表无穷大
typedef struct {
int vexs[MAXVEX]; // 存储顶点的数组
int arc[MAXVEX][MAXVEX]; // 存储边的二维数组
int numVertexes, numEdges; // 图中当前的顶点数和边数
} MGraph;
```
2.深度优先遍历
```c
int visited[MAXVEX]; // 定义全局数组,记录每个顶点是否被访问过
void DFS(MGraph G, int i) {
int j;
visited[i] = 1; // 标记当前顶点已被访问
printf("%d ", G.vexs[i]); // 输出当前顶点的值
for (j = 0; j < G.numVertexes; j++) {
if (G.arc[i][j] == 1 && !visited[j]) { // 如果当前顶点与j顶点有边,并且j顶点未被访问
DFS(G, j); // 递归访问j顶点
}
}
}
void DFSTraverse(MGraph G) {
int i;
for (i = 0; i < G.numVertexes; i++) {
visited[i] = 0; // 初始化visited数组
}
for (i = 0; i < G.numVertexes; i++) {
if (!visited[i]) { // 如果当前顶点未被访问
DFS(G, i); // 从该顶点开始进行深度优先遍历
}
}
}
```
3.广度优先遍历
```c
void BFSTraverse(MGraph G) {
int i, j;
int queue[MAXVEX], front = 0, rear = 0; // 定义队列
for (i = 0; i < G.numVertexes; i++) {
visited[i] = 0; // 初始化visited数组
}
for (i = 0; i < G.numVertexes; i++) {
if (!visited[i]) { // 如果当前顶点未被访问
visited[i] = 1; // 标记当前顶点已被访问
printf("%d ", G.vexs[i]); // 输出当前顶点的值
queue[rear++] = i; // 将当前顶点入队列
while (front != rear) { // 队列不为空时循环
j = queue[front++]; // 出队列
for (i = 0; i < G.numVertexes; i++) {
if (G.arc[j][i] == 1 && !visited[i]) { // 如果当前顶点与i顶点有边,并且i顶点未被访问
visited[i] = 1; // 标记i顶点已被访问
printf("%d ", G.vexs[i]); // 输出i顶点的值
queue[rear++] = i; // 将i顶点入队列
}
}
}
}
}
}
```
阅读全文