编写算法在邻接矩阵存储结构上实现图的基本操作InsertVex(G,v);InsertArc(G,v,w);DeleteVex(G,v);DeleteArc(G,v,w)
时间: 2023-11-18 13:02:59 浏览: 86
好的,我来给你编写算法在邻接矩阵存储结构上实现图的基本操作。
首先,我们需要定义邻接矩阵的数据结构:
```
#define MAX_VERTEX_NUM 20 // 顶点数的最大值
typedef struct {
char vexs[MAX_VERTEX_NUM]; // 顶点数组
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵,用二维数组表示
int vexnum, arcnum; // 图的当前顶点数和边数
} MGraph;
```
然后,我们可以按照以下算法实现四个基本操作:
InsertVex(G,v):
```
bool InsertVex(MGraph &G, char v) {
if (G.vexnum == MAX_VERTEX_NUM) {
return false; // 顶点数已满,无法插入
}
G.vexs[G.vexnum++] = v; // 在顶点数组中添加新的顶点
for (int i = 0; i < G.vexnum; i++) {
G.arcs[i][G.vexnum - 1] = 0; // 新顶点到其他顶点的边初始化为0
G.arcs[G.vexnum - 1][i] = 0; // 其他顶点到新顶点的边初始化为0
}
return true;
}
```
InsertArc(G,v,w):
```
bool InsertArc(MGraph &G, char v, char w) {
int i = LocateVex(G, v);
int j = LocateVex(G, w);
if (i == -1 || j == -1) {
return false; // 顶点不存在,无法插入边
}
G.arcs[i][j] = 1; // 添加从v到w的边
if (!G.is_directed) {
G.arcs[j][i] = 1; // 如果是无向图,还要添加从w到v的边
}
G.arcnum++; // 边数加一
return true;
}
```
DeleteVex(G,v):
```
bool DeleteVex(MGraph &G, char v) {
int i = LocateVex(G, v);
if (i == -1) {
return false; // 顶点不存在,无法删除
}
for (int j = 0; j < G.vexnum; j++) {
if (G.arcs[i][j] != 0) {
G.arcnum--; // 删除从v出发的边,边数减一
}
if (G.arcs[j][i] != 0) {
G.arcnum--; // 删除到v的边,边数减一
}
}
for (int j = i + 1; j < G.vexnum; j++) {
G.vexs[j - 1] = G.vexs[j]; // 删除顶点v,顶点数组整体向前移动一位
}
for (int j = i + 1; j < G.vexnum; j++) {
for (int k = 0; k < G.vexnum; k++) {
G.arcs[j - 1][k] = G.arcs[j][k]; // 删除顶点v,邻接矩阵整体向上移动一行
}
}
for (int j = i + 1; j < G.vexnum; j++) {
for (int k = 0; k < G.vexnum; k++) {
G.arcs[k][j - 1] = G.arcs[k][j]; // 删除顶点v,邻接矩阵整体向左移动一列
}
}
G.vexnum--; // 顶点数减一
return true;
}
```
DeleteArc(G,v,w):
```
bool DeleteArc(MGraph &G, char v, char w) {
int i = LocateVex(G, v);
int j = LocateVex(G, w);
if (i == -1 || j == -1) {
return false; // 顶点不存在,无法删除边
}
G.arcs[i][j] = 0; // 删除从v到w的边
if (!G.is_directed) {
G.arcs[j][i] = 0; // 如果是无向图,还要删除从w到v的边
}
G.arcnum--; // 边数减一
return true;
}
```
以上就是在邻接矩阵存储结构上实现图的基本操作的算法,希望能对你有所帮助。
阅读全文