用c 写一个图的深度优先遍历和广度优先遍历 能运行
时间: 2023-06-22 16:20:48 浏览: 89
以下是一个用C语言实现图的深度优先遍历和广度优先遍历的示例代码,其中图的存储方式为邻接矩阵:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 图中最大顶点数
typedef enum {false, true} bool;
typedef struct {
int vertex[MAX_VERTEX_NUM];
int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum, arcnum; // 图的顶点数和边数
} Graph;
// 初始化图
void InitGraph(Graph *G) {
int i, j;
G->vexnum = 0;
G->arcnum = 0;
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;
}
}
}
// 添加顶点
bool AddVertex(Graph *G, int v) {
if (G->vexnum == MAX_VERTEX_NUM) return false; // 顶点数已满,无法添加
G->vertex[G->vexnum++] = v;
return true;
}
// 添加边
bool AddEdge(Graph *G, int v1, int v2) {
int i, j, k;
for (i = 0; i < G->vexnum; i++) {
if (G->vertex[i] == v1) break;
}
if (i == G->vexnum) return false; // 未找到顶点v1
for (j = 0; j < G->vexnum; j++) {
if (G->vertex[j] == v2) break;
}
if (j == G->vexnum) return false; // 未找到顶点v2
G->edge[i][j] = 1;
G->arcnum++;
return true;
}
// 深度优先遍历-递归实现
void DFS(Graph *G, int v, bool *visited) {
int i;
visited[v] = true;
printf("%d ", G->vertex[v]);
for (i = 0; i < G->vexnum; i++) {
if (G->edge[v][i] == 1 && !visited[i]) {
DFS(G, i, visited);
}
}
}
// 深度优先遍历
void DFSTraverse(Graph *G) {
int i;
bool visited[MAX_VERTEX_NUM];
for (i = 0; i < G->vexnum; i++) {
visited[i] = false;
}
for (i = 0; i < G->vexnum; i++) {
if (!visited[i]) {
DFS(G, i, visited);
}
}
}
// 广度优先遍历
void BFSTraverse(Graph *G) {
int i, j, k, front = -1, rear = -1;
bool visited[MAX_VERTEX_NUM];
int queue[MAX_VERTEX_NUM];
for (i = 0; i < G->vexnum; i++) {
visited[i] = false;
}
for (i = 0; i < G->vexnum; i++) {
if (!visited[i]) {
visited[i] = true;
printf("%d ", G->vertex[i]);
queue[++rear] = i;
while (front != rear) {
j = queue[++front];
for (k = 0; k < G->vexnum; k++) {
if (G->edge[j][k] == 1 && !visited[k]) {
visited[k] = true;
printf("%d ", G->vertex[k]);
queue[++rear] = k;
}
}
}
}
}
}
int main() {
Graph G;
int i;
InitGraph(&G);
for (i = 1; i <= 5; i++) {
AddVertex(&G, i);
}
AddEdge(&G, 1, 2);
AddEdge(&G, 1, 3);
AddEdge(&G, 1, 5);
AddEdge(&G, 2, 4);
AddEdge(&G, 3, 4);
printf("DFS: ");
DFSTraverse(&G);
printf("\nBFS: ");
BFSTraverse(&G);
return 0;
}
```
该程序实现了一个简单的无向图,其中顶点数为5,边数为5,图的具体结构如下:
```
1 - 2
| / |
3 - 4
|
5
```
在程序中,首先使用 `InitGraph()` 函数初始化图,然后通过 `AddVertex()` 和 `AddEdge()` 函数添加顶点和边。接着,使用 `DFSTraverse()` 和 `BFSTraverse()` 函数进行深度优先遍历和广度优先遍历。在遍历过程中,使用 `visited` 数组记录每个顶点是否已经被访问过,使用 `queue` 数组实现广度优先遍历时的队列。
阅读全文