分别以邻接矩阵和邻接表作为存储结构,实现以下图的基本操作: 1.增加一个新顶点v,InsertVex(G, v); 2.删除顶点v及其相关的边,DeleteVex(G, v); 3.增加一条边<v,w>,InsertArc(G, v, w); 4.删除一条边<v,w>,DeleteArc(G, v, w)。代码
时间: 2024-03-17 17:45:36 浏览: 64
分别采用邻接矩阵、邻接表存储结构实现图的遍历
4星 · 用户满意度95%
好的,以下是基于邻接矩阵和邻接表的图的基本操作的代码实现:
邻接矩阵:
```c++
const int MAXVEX = 100; // 最大顶点数
typedef struct {
char vexs[MAXVEX]; // 顶点表
int arcs[MAXVEX][MAXVEX]; // 邻接矩阵
int vexnum, arcnum; // 当前顶点数和边数
} MGraph;
// 增加一个新顶点v
void InsertVex(MGraph &G, char v) {
G.vexs[G.vexnum] = v;
for (int i = 0; i <= G.vexnum; i++) {
G.arcs[i][G.vexnum] = 0;
G.arcs[G.vexnum][i] = 0;
}
G.vexnum++;
}
// 删除顶点v及其相关的边
void DeleteVex(MGraph &G, char v) {
int i, j, k;
for (i = 0; i < G.vexnum; i++) {
if (G.vexs[i] == v) break;
}
if (i == G.vexnum) return; // 未找到该顶点
for (j = 0; j < G.vexnum; j++) {
if (G.arcs[i][j] == 1 || G.arcs[j][i] == 1) {
G.arcnum--;
}
G.arcs[i][j] = 0;
G.arcs[j][i] = 0;
}
for (k = i; k < G.vexnum - 1; k++) {
G.vexs[k] = G.vexs[k + 1];
}
G.vexnum--;
}
// 增加一条边<v,w>
void InsertArc(MGraph &G, char v, char w) {
int i, j;
for (i = 0; i < G.vexnum; i++) {
if (G.vexs[i] == v) break;
}
for (j = 0; j < G.vexnum; j++) {
if (G.vexs[j] == w) break;
}
G.arcs[i][j] = 1;
G.arcnum++;
}
// 删除一条边<v,w>
void DeleteArc(MGraph &G, char v, char w) {
int i, j;
for (i = 0; i < G.vexnum; i++) {
if (G.vexs[i] == v) break;
}
for (j = 0; j < G.vexnum; j++) {
if (G.vexs[j] == w) break;
}
G.arcs[i][j] = 0;
G.arcnum--;
}
```
邻接表:
```c++
typedef struct ArcNode {
int adjvex; // 该弧所指向的顶点的位置
ArcNode *nextarc; // 指向下一条弧的指针
int info; // 弧相关信息
} ArcNode;
typedef struct VNode {
char data; // 顶点信息
ArcNode *firstarc; // 指向第一条依附该顶点的弧的指针
} VNode, AdjList[MAXVEX];
typedef struct {
AdjList adjlist; // 邻接表
int vexnum, arcnum; // 当前顶点数和边数
} ALGraph;
// 增加一个新顶点v
void InsertVex(ALGraph &G, char v) {
G.adjlist[G.vexnum].data = v;
G.adjlist[G.vexnum].firstarc = NULL;
G.vexnum++;
}
// 删除顶点v及其相关的边
void DeleteVex(ALGraph &G, char v) {
int i;
ArcNode *p, *q;
for (i = 0; i < G.vexnum; i++) {
p = G.adjlist[i].firstarc;
q = NULL;
while (p != NULL) {
if (G.adjlist[p->adjvex].data == v) {
if (q == NULL) {
G.adjlist[i].firstarc = p->nextarc;
} else {
q->nextarc = p->nextarc;
}
delete p;
G.arcnum--;
p = q == NULL ? G.adjlist[i].firstarc : q->nextarc;
} else {
q = p;
p = p->nextarc;
}
}
}
for (i = 0; i < G.vexnum; i++) {
p = G.adjlist[i].firstarc;
q = NULL;
while (p != NULL) {
if (G.adjlist[p->adjvex].data == v) {
if (q == NULL) {
G.adjlist[i].firstarc = p->nextarc;
} else {
q->nextarc = p->nextarc;
}
delete p;
G.arcnum--;
p = q == NULL ? G.adjlist[i].firstarc : q->nextarc;
} else {
p->adjvex = p->adjvex > v - 'a' ? p->adjvex - 1 : p->adjvex;
q = p;
p = p->nextarc;
}
}
}
for (i = v - 'a'; i < G.vexnum - 1; i++) {
G.adjlist[i] = G.adjlist[i + 1];
}
G.vexnum--;
}
// 增加一条边<v,w>
void InsertArc(ALGraph &G, char v, char w) {
int i, j;
ArcNode *p;
for (i = 0; i < G.vexnum; i++) {
if (G.adjlist[i].data == v) break;
}
for (j = 0; j < G.vexnum; j++) {
if (G.adjlist[j].data == w) break;
}
p = new ArcNode;
p->adjvex = j;
p->nextarc = G.adjlist[i].firstarc;
G.adjlist[i].firstarc = p;
G.arcnum++;
}
// 删除一条边<v,w>
void DeleteArc(ALGraph &G, char v, char w) {
int i, j;
ArcNode *p, *q;
for (i = 0; i < G.vexnum; i++) {
if (G.adjlist[i].data == v) break;
}
for (j = 0; j < G.vexnum; j++) {
if (G.adjlist[j].data == w) break;
}
p = G.adjlist[i].firstarc;
q = NULL;
while (p != NULL) {
if (p->adjvex == j) {
if (q == NULL) {
G.adjlist[i].firstarc = p->nextarc;
} else {
q->nextarc = p->nextarc;
}
delete p;
G.arcnum--;
break;
} else {
q = p;
p = p->nextarc;
}
}
}
```
阅读全文