c语言编写完整代码 假设带权有向图采用邻接表存储,顶点i,j已存在,设计一个算法删除一条给定的边<i,j>
时间: 2024-05-12 16:12:48 浏览: 76
以下是C语言实现删除给定边<i,j>的算法:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
// 边表结点
typedef struct ArcNode {
int adjvex; // 该弧所指向的顶点的位置
int weight; // 权值
struct ArcNode *next; // 指向下一条弧的指针
} ArcNode;
// 顶点表结点
typedef struct VNode {
int data; // 顶点信息
ArcNode *firstarc; // 指向第一条依附该顶点的弧的指针
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices; // 邻接表
int vexnum, arcnum; // 图的当前顶点数和弧数
} ALGraph;
// 初始化邻接表
void InitGraph(ALGraph *G) {
G->vexnum = 0;
G->arcnum = 0;
for (int i = 0; i < MAX_VERTEX_NUM; i++) {
G->vertices[i].firstarc = NULL;
}
}
// 添加边<i, j>,权值为w
void AddArc(ALGraph *G, int i, int j, int w) {
ArcNode *p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = j;
p->weight = w;
p->next = G->vertices[i].firstarc;
G->vertices[i].firstarc = p;
G->arcnum++;
}
// 删除边<i, j>
void DeleteArc(ALGraph *G, int i, int j) {
ArcNode *p = G->vertices[i].firstarc;
ArcNode *pre = NULL;
while (p != NULL && p->adjvex != j) {
pre = p;
p = p->next;
}
if (p != NULL) {
if (pre != NULL) {
pre->next = p->next;
} else {
G->vertices[i].firstarc = p->next;
}
free(p);
G->arcnum--;
}
}
// 打印邻接表
void PrintGraph(ALGraph *G) {
for (int i = 0; i < G->vexnum; i++) {
printf("%d: ", i);
ArcNode *p = G->vertices[i].firstarc;
while (p != NULL) {
printf("(%d, %d) ", p->adjvex, p->weight);
p = p->next;
}
printf("\n");
}
}
int main() {
ALGraph G;
InitGraph(&G);
G.vexnum = 4;
AddArc(&G, 0, 1, 1);
AddArc(&G, 0, 2, 2);
AddArc(&G, 1, 2, 3);
AddArc(&G, 1, 3, 4);
AddArc(&G, 2, 3, 5);
printf("原邻接表:\n");
PrintGraph(&G);
DeleteArc(&G, 1, 3);
printf("删除边(1, 3)后的邻接表:\n");
PrintGraph(&G);
return 0;
}
```
上述代码中,我们首先定义了邻接表的数据结构,包括边表结点和顶点表结点,然后定义了初始化邻接表、添加边、删除边和打印邻接表等函数。在主函数中,我们创建了一个带权有向图,并添加了若干条边,然后删除了边(1, 3),最后打印删除后的邻接表。
阅读全文