c语言编写完整代码 假设带权有向图采用邻接表存储,顶点i,j已存在,设计一个算法删除一条给定的边<i,j>
时间: 2024-04-30 07:18:08 浏览: 83
假设以邻接矩阵作为图的存储结构,编写算法判别在给定的有向图中是否存在一个简单有向回路,若存在,则以顶点序列的方式输出该回路
5星 · 资源好评率100%
以下是 C 语言实现删除给定边的算法:
```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 {
int data; // 数据域,存储顶点编号
ArcNode *firstarc; // 指向第一个邻接点
} VNode;
// 图结构体
typedef struct {
VNode vertex[MAX_VERTEX_NUM]; // 存储顶点的数组
int vexnum, arcnum; // 顶点数和边数
} ALGraph;
// 删除边
void DeleteArc(ALGraph *G, int i, int j) {
ArcNode *p = G->vertex[i].firstarc; // 指向顶点 i 的第一个邻接点
ArcNode *pre = NULL; // p 的前驱节点
while (p != NULL && p->adjvex != j) {
pre = p;
p = p->next;
}
if (p == NULL) { // 没找到边<i,j>
printf("There is no arc from vertex %d to vertex %d.\n", i, j);
return;
}
if (pre == NULL) { // p 是第一个邻接点
G->vertex[i].firstarc = p->next;
} else {
pre->next = p->next;
}
free(p); // 释放内存
G->arcnum--; // 边数减1
}
// 测试
int main() {
ALGraph G;
// 初始化图结构体,省略
int i = 1, j = 2; // 要删除的边<i,j>
DeleteArc(&G, i, j);
return 0;
}
```
算法的核心是在顶点 i 的邻接表中查找到顶点 j,然后删除该边。由于邻接表是链表,我们需要维护 p 和 pre 两个指针,其中 p 指向当前遍历到的边节点,pre 指向 p 的前驱节点。当找到边<i,j>时,如果 p 是第一个邻接点,需要更新顶点 i 的 firstarc 指针,否则需要更新 pre 的 next 指针。最后释放 p 所指向的内存,并将图的边数减1。
阅读全文