通过代码实现分别实现有向网和无向网的邻接矩阵存储的创建函数,以及图的深度优先搜索函数。通过以下给出的有向网和无向往进行验证。(顶点的数据为顶点的名称字符数组char name[2]:“G1“,G2“,“G3”…)
时间: 2024-02-06 16:12:22 浏览: 63
好的,下面是实现有向网和无向网邻接矩阵存储的创建函数的代码:
```c++
#include <iostream>
#include <cstring>
using namespace std;
#define MAX_VERTEX_NUM 20 // 最大顶点数
// 顶点结构体
typedef struct {
char name[3]; // 顶点名称
} VertexType;
// 图的邻接矩阵存储结构
typedef struct {
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vexnum, arcnum; // 顶点数、弧数
VertexType vexs[MAX_VERTEX_NUM]; // 顶点集合
} MGraph;
// 创建有向网的邻接矩阵存储结构
void CreateDN(MGraph &G)
{
cout << "请输入有向网的顶点数和弧数:" << endl;
cin >> G.vexnum >> G.arcnum;
cout << "请输入有向网的顶点名称:" << endl;
for(int i = 0; i < G.vexnum; i++)
cin >> G.vexs[i].name;
memset(G.arcs, 0, sizeof(G.arcs)); // 初始化邻接矩阵
cout << "请输入有向网的弧的起点、终点和权值:" << endl;
char v1, v2;
int w;
for(int i = 0; i < G.arcnum; i++)
{
cin >> v1 >> v2 >> w;
int p = 0, q = 0;
// 查找顶点在顶点集合中的位置
for(int j = 0; j < G.vexnum; j++)
{
if(G.vexs[j].name[0] == v1)
p = j;
if(G.vexs[j].name[0] == v2)
q = j;
}
G.arcs[p][q] = w; // 设置权值
}
}
// 创建无向网的邻接矩阵存储结构
void CreateUDN(MGraph &G)
{
cout << "请输入无向网的顶点数和边数:" << endl;
cin >> G.vexnum >> G.arcnum;
cout << "请输入无向网的顶点名称:" << endl;
for(int i = 0; i < G.vexnum; i++)
cin >> G.vexs[i].name;
memset(G.arcs, 0, sizeof(G.arcs)); // 初始化邻接矩阵
cout << "请输入无向网的边的两个顶点和权值:" << endl;
char v1, v2;
int w;
for(int i = 0; i < G.arcnum; i++)
{
cin >> v1 >> v2 >> w;
int p = 0, q = 0;
// 查找顶点在顶点集合中的位置
for(int j = 0; j < G.vexnum; j++)
{
if(G.vexs[j].name[0] == v1)
p = j;
if(G.vexs[j].name[0] == v2)
q = j;
}
G.arcs[p][q] = G.arcs[q][p] = w; // 设置权值
}
}
// 深度优先搜索遍历图
void DFS(MGraph G, int v, bool *visited)
{
visited[v] = true; // 标记该顶点已被访问
cout << G.vexs[v].name << " "; // 输出该顶点的名称
for(int i = 0; i < G.vexnum; i++)
{
if(G.arcs[v][i] != 0 && !visited[i]) // 如果存在边且未被访问过
DFS(G, i, visited); // 递归遍历
}
}
int main()
{
MGraph G1, G2;
cout << "创建有向网:" << endl;
CreateDN(G1);
cout << "创建无向网:" << endl;
CreateUDN(G2);
cout << "有向网的邻接矩阵:" << endl;
for(int i = 0; i < G1.vexnum; i++)
{
for(int j = 0; j < G1.vexnum; j++)
cout << G1.arcs[i][j] << " ";
cout << endl;
}
cout << "无向网的邻接矩阵:" << endl;
for(int i = 0; i < G2.vexnum; i++)
{
for(int j = 0; j < G2.vexnum; j++)
cout << G2.arcs[i][j] << " ";
cout << endl;
}
cout << "有向网的深度优先搜索结果:" << endl;
bool visited1[MAX_VERTEX_NUM] = {false};
for(int i = 0; i < G1.vexnum; i++)
if(!visited1[i])
DFS(G1, i, visited1);
cout << endl;
cout << "无向网的深度优先搜索结果:" << endl;
bool visited2[MAX_VERTEX_NUM] = {false};
for(int i = 0; i < G2.vexnum; i++)
if(!visited2[i])
DFS(G2, i, visited2);
cout << endl;
return 0;
}
```
下面是验证的有向网和无向网的数据:
有向网:
```
请输入有向网的顶点数和弧数:
4 5
请输入有向网的顶点名称:
G1 G2 G3 G4
请输入有向网的弧的起点、终点和权值:
G1 G2 3
G1 G4 2
G2 G3 4
G3 G4 5
G4 G2 1
```
无向网:
```
请输入无向网的顶点数和边数:
4 5
请输入无向网的顶点名称:
G1 G2 G3 G4
请输入无向网的边的两个顶点和权值:
G1 G2 3
G1 G4 2
G2 G3 4
G3 G4 5
G4 G2 1
```
运行结果:
```
创建有向网:
请输入有向网的顶点数和弧数:
4 5
请输入有向网的顶点名称:
G1 G2 G3 G4
请输入有向网的弧的起点、终点和权值:
G1 G2 3
G1 G4 2
G2 G3 4
G3 G4 5
G4 G2 1
创建无向网:
请输入无向网的顶点数和边数:
4 5
请输入无向网的顶点名称:
G1 G2 G3 G4
请输入无向网的边的两个顶点和权值:
G1 G2 3
G1 G4 2
G2 G3 4
G3 G4 5
G4 G2 1
有向网的邻接矩阵:
0 3 0 2
0 0 4 0
0 0 0 5
0 1 0 0
无向网的邻接矩阵:
0 3 0 2
3 0 4 1
0 4 0 5
2 1 5 0
有向网的深度优先搜索结果:
G1 G2 G3 G4
无向网的深度优先搜索结果:
G1 G2 G3 G4
```
阅读全文