用邻接矩阵实现图存储,并实现图的深度优先遍历。写出c语言代码
时间: 2024-06-18 10:05:36 浏览: 98
建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历.doc
5星 · 资源好评率100%
邻接矩阵是一种图的表示方法,用一个二维数组来表示节点之间的连接情况。对于无向图,邻接矩阵是对称的;对于有向图,邻接矩阵不一定对称。
以下是用邻接矩阵实现图存储和深度优先遍历的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20 // 最大顶点数
typedef char VertexType; // 顶点数据类型
typedef int EdgeType; // 边权重数据类型
typedef struct {
VertexType vexs[MAX_VERTEX_NUM]; // 顶点数组
EdgeType edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵数组
int vexnum, edgenum; // 顶点数和边数
} MGraph;
int visited[MAX_VERTEX_NUM]; // 标记数组,记录每个顶点是否被访问过
// 初始化邻接矩阵图
void InitMGraph(MGraph *G) {
int i, j;
printf("请输入顶点数和边数:\n");
scanf("%d%d", &G->vexnum, &G->edgenum);
printf("请输入%d个顶点:\n", G->vexnum);
for (i = 0; i < G->vexnum; i++) {
scanf(" %c", &G->vexs[i]);
}
for (i = 0; i < G->vexnum; i++) {
for (j = 0; j < G->vexnum; j++) {
G->edges[i][j] = 0; // 初始化邻接矩阵
}
}
printf("请输入%d条边(格式:vi vj)和它们的权值:\n", G->edgenum);
for (i = 0; i < G->edgenum; i++) {
int vi, vj, w;
scanf("%d%d%d", &vi, &vj, &w);
G->edges[vi][vj] = w;
// 如果是无向图,还需要设置G->edges[vj][vi] = w;
}
}
// 深度优先遍历邻接矩阵图
void DFS(MGraph *G, int v) {
int i;
visited[v] = 1;
printf("%c ", G->vexs[v]); // 打印顶点数据
for (i = 0; i < G->vexnum; i++) {
if (G->edges[v][i] != 0 && visited[i] == 0) { // 如果有边且未被访问过
DFS(G, i); // 递归访问相邻顶点
}
}
}
int main() {
MGraph G;
InitMGraph(&G);
printf("深度优先遍历结果:");
int i;
for (i = 0; i < G.vexnum; i++) {
visited[i] = 0; // 初始化标记数组
}
for (i = 0; i < G.vexnum; i++) {
if (visited[i] == 0) { // 如果未被访问过
DFS(&G, i); // 从该顶点开始深度优先遍历
}
}
return 0;
}
```
阅读全文