c语言编写完整代码 假设带权有向图采用邻接表存储,顶点i,j已存在,设计一个算法删除一条给定的边<i,j>
时间: 2024-02-13 20:01:48 浏览: 104
数据结构学习--图的邻接矩阵和邻接表存储
以下是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)
{
int i;
G->vexnum = G->arcnum = 0;
for (i = 0; i < MAX_VERTEX_NUM; i++) {
G->vertices[i].firstarc = NULL;
}
}
// 增加一条边
void AddArc(ALGraph *G, int i, int j, int weight)
{
ArcNode *p, *q;
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = j;
p->weight = weight;
p->next = G->vertices[i].firstarc;
G->vertices[i].firstarc = p;
G->arcnum++;
}
// 删除一条边
void DeleteArc(ALGraph *G, int i, int j)
{
ArcNode *p, *q;
p = G->vertices[i].firstarc;
if (p->adjvex == j) { // 删除第一个结点
G->vertices[i].firstarc = p->next;
free(p);
} else {
while (p->next && p->next->adjvex != j) {
p = p->next;
}
if (p->next) { // 找到了要删除的结点
q = p->next;
p->next = q->next;
free(q);
}
}
G->arcnum--;
}
// 主函数
int main()
{
int i, j, weight;
ALGraph G;
InitGraph(&G);
// 增加边
AddArc(&G, 1, 2, 10);
AddArc(&G, 1, 3, 20);
AddArc(&G, 2, 1, 30);
AddArc(&G, 2, 3, 40);
AddArc(&G, 3, 1, 50);
AddArc(&G, 3, 2, 60);
// 删除边
DeleteArc(&G, 1, 2);
// 输出邻接表
for (i = 1; i <= G.vexnum; i++) {
printf("%d: ", G.vertices[i].data);
ArcNode *p = G.vertices[i].firstarc;
while (p) {
printf("%d[%d] ", p->adjvex, p->weight);
p = p->next;
}
printf("\n");
}
return 0;
}
```
在上面的代码中,我们首先定义了带权有向图的邻接表存储结构,然后实现了初始化图、增加边和删除边的三个函数。最后在主函数中增加了一些边,删除了一条边,并输出了邻接表。注意,这里我们只是对边进行了删除,而没有删除结点,如果需要删除结点,还需要考虑它是否有入度或出度。
阅读全文