c语言编写完整代码 假设带权有向图采用邻接表存储,顶点i,j已存在,设计一个算法删除一条给定的边<i,j>
时间: 2024-05-10 20:16:29 浏览: 13
以下是使用邻接表存储的带权有向图删除一条给定边的C语言代码:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100
// 结点结构体
typedef struct node {
int vertex; // 顶点
int weight; // 权重
struct node* next; // 下一个结点
} Node;
// 邻接表结构体
typedef struct graph {
Node* vertices[MAX_VERTICES]; // 顶点数组
int num_vertices; // 顶点数
} Graph;
// 初始化邻接表
void initGraph(Graph* graph) {
graph->num_vertices = 0;
for (int i = 0; i < MAX_VERTICES; i++) {
graph->vertices[i] = NULL;
}
}
// 添加边
void addEdge(Graph* graph, int from_vertex, int to_vertex, int weight) {
Node* new_node = (Node*)malloc(sizeof(Node));
new_node->vertex = to_vertex;
new_node->weight = weight;
new_node->next = graph->vertices[from_vertex];
graph->vertices[from_vertex] = new_node;
}
// 删除边
void deleteEdge(Graph* graph, int from_vertex, int to_vertex) {
Node* curr_node = graph->vertices[from_vertex];
Node* prev_node = NULL;
while (curr_node != NULL) {
if (curr_node->vertex == to_vertex) { // 找到目标结点
if (prev_node == NULL) { // 目标结点是第一个结点
graph->vertices[from_vertex] = curr_node->next;
} else { // 目标结点不是第一个结点
prev_node->next = curr_node->next;
}
free(curr_node);
return;
}
prev_node = curr_node;
curr_node = curr_node->next;
}
}
// 打印邻接表
void printGraph(Graph* graph) {
for (int i = 0; i < graph->num_vertices; i++) {
printf("%d:", i);
Node* curr_node = graph->vertices[i];
while (curr_node != NULL) {
printf(" %d(%d)", curr_node->vertex, curr_node->weight);
curr_node = curr_node->next;
}
printf("\n");
}
}
int main() {
Graph graph;
initGraph(&graph);
// 添加边
addEdge(&graph, 0, 1, 2);
addEdge(&graph, 0, 2, 3);
addEdge(&graph, 1, 2, 4);
addEdge(&graph, 2, 3, 5);
addEdge(&graph, 3, 1, 6);
printf("Before deleting edge:\n");
printGraph(&graph);
// 删除边
deleteEdge(&graph, 0, 1);
printf("After deleting edge:\n");
printGraph(&graph);
return 0;
}
```
假设要删除的边是<i,j>,则可以在邻接表中遍历顶点i的链表,找到目标结点j,然后将目标结点从链表中删除即可。如果顶点i的链表中没有目标结点j,则说明要删除的边不存在。上述代码中的`deleteEdge()`函数就是删除边的具体实现。