采用邻接矩阵表示法,创建无向图graph。实现功能: 1、打印无向图void printUDN(AMGraph graph) 2、增加顶点Status InsertVex(AMGraph &G, int v) 3、增加边Status DeleteVex(AMGraph &G, int v) 4、删除顶点Status InsertArc(AMGraph &G, int v, int w) 5、删除边Status DeleteArc(AMGraph &G, int v, int w)
时间: 2024-03-02 12:48:33 浏览: 95
以下是采用邻接矩阵表示法创建无向图并实现相关功能的代码:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int MAX_VERTEX_NUM = 100; // 图的最大顶点数
const int INF = 0x3f3f3f3f; // 无穷大
// 图的邻接矩阵表示法
typedef struct {
char vexs[MAX_VERTEX_NUM]; // 存储顶点信息
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 存储边信息
int vexnum, arcnum; // 存储图的顶点数和边数
} AMGraph;
// 初始化图
void InitGraph(AMGraph &graph) {
memset(graph.vexs, 0, sizeof(graph.vexs));
memset(graph.arcs, INF, sizeof(graph.arcs));
graph.vexnum = graph.arcnum = 0;
}
// 在图中查找元素位置
int LocateVex(AMGraph graph, char v) {
for (int i = 0; i < graph.vexnum; i++) {
if (graph.vexs[i] == v) {
return i;
}
}
return -1; // 没有找到返回-1
}
// 添加顶点
bool InsertVex(AMGraph &graph, char v) {
if (graph.vexnum == MAX_VERTEX_NUM) { // 容量已满,无法添加
return false;
}
if (LocateVex(graph, v) != -1) { // 顶点已存在,无需添加
return false;
}
graph.vexs[graph.vexnum++] = v; // 添加顶点
return true;
}
// 删除顶点
bool DeleteVex(AMGraph &graph, char v) {
int i = LocateVex(graph, v);
if (i == -1) { // 顶点不存在
return false;
}
// 删除顶点及其相关边
for (int j = 0; j < graph.vexnum; j++) {
if (graph.arcs[i][j] != INF) { // 有边相连,删除边
graph.arcnum--;
}
if (graph.arcs[j][i] != INF) { // 有边相连,删除边
graph.arcnum--;
}
graph.arcs[i][j] = INF;
graph.arcs[j][i] = INF;
}
// 删除顶点
graph.vexnum--;
for (; i < graph.vexnum; i++) {
graph.vexs[i] = graph.vexs[i + 1];
}
return true;
}
// 添加边
bool InsertArc(AMGraph &graph, char v, char w) {
int i = LocateVex(graph, v);
int j = LocateVex(graph, w);
if (i == -1 || j == -1) { // 顶点不存在
return false;
}
if (graph.arcs[i][j] != INF) { // 边已存在,无需添加
return false;
}
graph.arcs[i][j] = graph.arcs[j][i] = 1; // 添加边
graph.arcnum++;
return true;
}
// 删除边
bool DeleteArc(AMGraph &graph, char v, char w) {
int i = LocateVex(graph, v);
int j = LocateVex(graph, w);
if (i == -1 || j == -1) { // 顶点不存在
return false;
}
if (graph.arcs[i][j] == INF) { // 边不存在
return false;
}
graph.arcs[i][j] = graph.arcs[j][i] = INF; // 删除边
graph.arcnum--;
return true;
}
// 打印无向图
void printUDN(AMGraph graph) {
cout << "图的邻接矩阵表示法:" << endl;
cout << "\t";
for (int i = 0; i < graph.vexnum; i++) {
cout << graph.vexs[i] << "\t";
}
cout << endl;
for (int i = 0; i < graph.vexnum; i++) {
cout << graph.vexs[i] << "\t";
for (int j = 0; j < graph.vexnum; j++) {
if (graph.arcs[i][j] == INF) {
cout << "∞\t";
} else {
cout << graph.arcs[i][j] << "\t";
}
}
cout << endl;
}
}
int main() {
AMGraph graph;
InitGraph(graph);
// 添加顶点
InsertVex(graph, 'A');
InsertVex(graph, 'B');
InsertVex(graph, 'C');
InsertVex(graph, 'D');
InsertVex(graph, 'E');
// 添加边
InsertArc(graph, 'A', 'B');
InsertArc(graph, 'A', 'C');
InsertArc(graph, 'B', 'C');
InsertArc(graph, 'B', 'D');
InsertArc(graph, 'C', 'D');
InsertArc(graph, 'C', 'E');
InsertArc(graph, 'D', 'E');
printUDN(graph); // 打印无向图
// 删除顶点和边
DeleteVex(graph, 'C');
DeleteArc(graph, 'B', 'D');
printUDN(graph); // 打印无向图
return 0;
}
```
解释一下代码:
1. 定义常量 `MAX_VERTEX_NUM` 表示图的最大顶点数,定义常量 `INF` 表示无穷大。
2. 定义结构体 `AMGraph` 表示图的邻接矩阵表示法,包括顶点信息 `vexs`、边信息 `arcs`、顶点数 `vexnum` 和边数 `arcnum`。
3. 定义函数 `InitGraph` 初始化图,函数 `LocateVex` 在图中查找元素位置。
4. 实现函数 `InsertVex` 添加顶点,函数 `DeleteVex` 删除顶点及其相关边,函数 `InsertArc` 添加边,函数 `DeleteArc` 删除边。
5. 实现函数 `printUDN` 打印无向图,使用邻接矩阵输出图的信息。
6. 在 `main` 函数中添加顶点和边,打印无向图,删除顶点和边,再次打印无向图。
阅读全文