试在邻接组阵存储结构上实现图的基本操作: Insert Vex ( G , v) , Insert Arc (G,v,w), DeleteVex(G,v )和 DeleteArc(G ,v ,w )。写一c语言代码解决上述问题
时间: 2023-10-11 15:10:38 浏览: 81
头歌数据结构图的邻接表存储及遍历操作
5星 · 资源好评率100%
以下是基于邻接矩阵存储结构的C语言代码实现了图的基本操作:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_VERTEX_NUM 20
#define INF 65535
typedef struct {
char vexs[MAX_VERTEX_NUM]; // 顶点信息
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vexnum, arcnum; // 顶点数目和弧的数目
} MGraph;
// 初始化邻接矩阵
void init(MGraph *G) {
G->vexnum = 0;
G->arcnum = 0;
for (int i = 0; i < MAX_VERTEX_NUM; i++) {
G->vexs[i] = ' ';
for (int j = 0; j < MAX_VERTEX_NUM; j++) {
G->arcs[i][j] = INF;
}
}
}
// 插入一个顶点
void insertVex(MGraph *G, char v) {
if (G->vexnum == MAX_VERTEX_NUM) {
printf("插入失败,顶点数已达到上限!\n");
return;
}
G->vexs[G->vexnum++] = v; // 将新顶点添加到顶点信息数组中
}
// 插入一条弧
void insertArc(MGraph *G, char v, char w) {
int i = locateVex(G, v);
int j = locateVex(G, w);
if (i == -1 || j == -1) {
printf("插入失败,顶点不存在!\n");
return;
}
if (G->arcs[i][j] != INF) {
printf("插入失败,该弧已经存在!\n");
return;
}
G->arcs[i][j] = 1; // 将新弧添加到邻接矩阵中
G->arcnum++;
}
// 删除一个顶点
void deleteVex(MGraph *G, char v) {
int i = locateVex(G, v);
if (i == -1) {
printf("删除失败,顶点不存在!\n");
return;
}
// 删除该顶点的所有弧
for (int j = 0; j < G->vexnum; j++) {
if (G->arcs[i][j] != INF) {
G->arcs[i][j] = INF;
G->arcnum--;
}
if (G->arcs[j][i] != INF) {
G->arcs[j][i] = INF;
G->arcnum--;
}
}
// 将该顶点从顶点信息数组中删除
for (int j = i; j < G->vexnum - 1; j++) {
G->vexs[j] = G->vexs[j + 1];
}
G->vexnum--;
}
// 删除一条弧
void deleteArc(MGraph *G, char v, char w) {
int i = locateVex(G, v);
int j = locateVex(G, w);
if (i == -1 || j == -1) {
printf("删除失败,顶点不存在!\n");
return;
}
if (G->arcs[i][j] == INF) {
printf("删除失败,该弧不存在!\n");
return;
}
G->arcs[i][j] = INF; // 将该弧从邻接矩阵中删除
G->arcnum--;
}
// 定位一个顶点在顶点信息数组中的位置
int locateVex(MGraph *G, char v) {
for (int i = 0; i < G->vexnum; i++) {
if (G->vexs[i] == v) {
return i;
}
}
return -1;
}
// 测试函数
int main() {
MGraph G;
init(&G);
insertVex(&G, 'A');
insertVex(&G, 'B');
insertVex(&G, 'C');
insertArc(&G, 'A', 'B');
insertArc(&G, 'B', 'C');
deleteArc(&G, 'A', 'B');
deleteVex(&G, 'B');
return 0;
}
```
该代码实现了四个基本操作:插入顶点、插入弧、删除顶点和删除弧。其中,插入顶点和插入弧分别将新顶点和新弧添加到邻接矩阵中;删除顶点将该顶点的所有弧从邻接矩阵中删除,并将该顶点从顶点信息数组中删除;删除弧将该弧从邻接矩阵中删除。
阅读全文