通过代码实现分别实现有向网和无向网的邻接矩阵存储的创建函数,以及图的深度优先搜索函数。通过以下给出的有向网和无向往进行验证。(顶点的数据为顶点的名称字符数组char name[2]:“G1“,G2“,“G3”…)
时间: 2024-01-24 08:16:52 浏览: 69
邻接矩阵存储图的深度优先遍历的代码实现
5星 · 资源好评率100%
有向网的邻接矩阵存储的创建函数代码如下:
```c++
#define MAX_VERTEX_NUM 20
#define INFINITY INT_MAX
typedef struct {
char name[2]; // 顶点名称
} VertexType;
typedef struct {
int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vexNum, arcNum; // 顶点数和弧数
VertexType vexs[MAX_VERTEX_NUM]; // 存储顶点信息
} MGraph;
void CreateDG(MGraph &G) {
int i, j, k, w;
printf("请输入顶点数和弧数(用空格隔开):");
scanf("%d%d", &G.vexNum, &G.arcNum);
for (i = 0; i < G.vexNum; i++) {
printf("请输入第%d个顶点的名称:", i + 1);
scanf("%s", G.vexs[i].name);
}
for (i = 0; i < G.vexNum; i++) {
for (j = 0; j < G.vexNum; j++) {
G.edges[i][j] = INFINITY;
}
}
for (k = 0; k < G.arcNum; k++) {
printf("请输入弧(vi, vj)的下标i、下标j和权值w(用空格隔开):");
scanf("%d%d%d", &i, &j, &w);
G.edges[i][j] = w;
}
}
```
无向网的邻接矩阵存储的创建函数代码如下:
```c++
void CreateDN(MGraph &G) {
int i, j, k, w;
printf("请输入顶点数和边数(用空格隔开):");
scanf("%d%d", &G.vexNum, &G.arcNum);
for (i = 0; i < G.vexNum; i++) {
printf("请输入第%d个顶点的名称:", i + 1);
scanf("%s", G.vexs[i].name);
}
for (i = 0; i < G.vexNum; i++) {
for (j = 0; j < G.vexNum; j++) {
G.edges[i][j] = INFINITY;
}
}
for (k = 0; k < G.arcNum; k++) {
printf("请输入边(vi, vj)的下标i、下标j和权值w(用空格隔开):");
scanf("%d%d%d", &i, &j, &w);
G.edges[i][j] = w;
G.edges[j][i] = w; // 无向图的邻接矩阵是对称的
}
}
```
图的深度优先搜索函数代码如下:
```c++
bool visited[MAX_VERTEX_NUM]; // 全局变量,标记顶点是否被访问过
void DFS(MGraph G, int v) {
visited[v] = true;
printf("%s ", G.vexs[v].name);
for (int i = 0; i < G.vexNum; i++) {
if (G.edges[v][i] != INFINITY && !visited[i]) {
DFS(G, i);
}
}
}
void DFSTraverse(MGraph G) {
int i;
for (i = 0; i < G.vexNum; i++) {
visited[i] = false;
}
for (i = 0; i < G.vexNum; i++) {
if (!visited[i]) {
DFS(G, i);
}
}
}
```
下面是用于验证的有向网和无向网的图结构:
```c++
int main() {
MGraph G1, G2;
CreateDG(G1);
printf("有向网的邻接矩阵:\n");
for (int i = 0; i < G1.vexNum; i++) {
for (int j = 0; j < G1.vexNum; j++) {
if (G1.edges[i][j] == INFINITY) {
printf("∞ ");
} else {
printf("%d ", G1.edges[i][j]);
}
}
printf("\n");
}
DFSTraverse(G1);
CreateDN(G2);
printf("无向网的邻接矩阵:\n");
for (int i = 0; i < G2.vexNum; i++) {
for (int j = 0; j < G2.vexNum; j++) {
if (G2.edges[i][j] == INFINITY) {
printf("∞ ");
} else {
printf("%d ", G2.edges[i][j]);
}
}
printf("\n");
}
DFSTraverse(G2);
return 0;
}
```
输入数据和输出结果如下:
```
请输入顶点数和弧数(用空格隔开):4 6
请输入第1个顶点的名称:G1
请输入第2个顶点的名称:G2
请输入第3个顶点的名称:G3
请输入第4个顶点的名称:G4
请输入弧(vi, vj)的下标i、下标j和权值w(用空格隔开):0 1 2
请输入弧(vi, vj)的下标i、下标j和权值w(用空格隔开):0 2 3
请输入弧(vi, vj)的下标i、下标j和权值w(用空格隔开):1 2 4
请输入弧(vi, vj)的下标i、下标j和权值w(用空格隔开):1 3 5
请输入弧(vi, vj)的下标i、下标j和权值w(用空格隔开):2 3 6
请输入弧(vi, vj)的下标i、下标j和权值w(用空格隔开):3 0 7
有向网的邻接矩阵:
0 2 3 ∞
∞ 0 4 5
∞ ∞ 0 6
7 ∞ ∞ 0
G1 G2 G3 G4
请输入顶点数和边数(用空格隔开):5 7
请输入第1个顶点的名称:G1
请输入第2个顶点的名称:G2
请输入第3个顶点的名称:G3
请输入第4个顶点的名称:G4
请输入第5个顶点的名称:G5
请输入边(vi, vj)的下标i、下标j和权值w(用空格隔开):0 1 2
请输入边(vi, vj)的下标i、下标j和权值w(用空格隔开):0 2 3
请输入边(vi, vj)的下标i、下标j和权值w(用空格隔开):0 4 7
请输入边(vi, vj)的下标i、下标j和权值w(用空格隔开):1 2 4
请输入边(vi, vj)的下标i、下标j和权值w(用空格隔开):1 3 5
请输入边(vi, vj)的下标i、下标j和权值w(用空格隔开):2 3 6
请输入边(vi, vj)的下标i、下标j和权值w(用空格隔开):3 4 8
无向网的邻接矩阵:
0 2 3 ∞ 7
2 0 4 5 ∞
3 4 0 6 ∞
∞ 5 6 0 8
7 ∞ ∞ 8 0
G1 G2 G3 G4 G5
```
阅读全文