首先,我们需要定义一个邻接表的结构体,代码如下:
struct EdgeNode { int adjvex; // 邻接点的下标 int weight; // 边的权值 struct EdgeNode *next; // 指向下一条边的指针 };
struct VertexNode { int data; // 顶点的数据域 struct EdgeNode *firstedge; // 指向第一条边的指针 };
struct AdjList { struct VertexNode adjList[MAX_VERTEX_NUM]; // 邻接表 int n, e; // 顶点数和边数 };
其中,MAX_VERTEX_NUM是最大顶点数,adjList数组是邻接表,n是顶点数,e是边数。
然后,我们就可以开始写删除边的算法了。我们可以在邻接表中查找给定的边<i, j>,然后删除它。具体的,我们可以使用指针来遍历邻接表,并找到给定的边。具体实现如下:
void DeleteEdge(AdjList *G, int i, int j) { // 找到给定的边<i, j> EdgeNode *p = G->adjList[i].firstedge; EdgeNode *q = NULL; // q用于记录p的前驱 while (p != NULL && p->adjvex != j) { q = p; p = p->next; } if (p == NULL) { // 没有找到给定的边<i, j> return; } // 找到了给定的边<i, j> if (q == NULL) { // p是邻接表的第一个节点 G->adjList[i].firstedge = p->next; } else { q->next = p->next; } // 释放p节点所