C语言带权无向图的邻接表创建和输出
时间: 2024-03-17 15:47:19 浏览: 67
邻接表是一种存储图的数据结构,对于带权无向图,我们可以使用邻接表来进行存储和操作。下面是 C 语言中带权无向图邻接表的创建和输出的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义邻接表的结构体
typedef struct node {
int vertex; // 顶点
int weight; // 权重
struct node* next; // 指向下一个邻接点的指针
} Node;
// 创建邻接表
void createGraph(Node** graph, int* vertices, int* edges) {
int u, v, w;
// 读入图的顶点数和边数
printf("Enter the number of vertices: ");
scanf("%d", vertices);
printf("Enter the number of edges: ");
scanf("%d", edges);
// 初始化邻接表
*graph = (Node*) malloc((*vertices) * sizeof(Node));
for (int i = 0; i < *vertices; i++) {
(*graph)[i].vertex = i;
(*graph)[i].weight = 0;
(*graph)[i].next = NULL;
}
// 逐个读入边,并添加到邻接表中
for (int i = 0; i < *edges; i++) {
printf("Enter edge %d: ", i+1);
scanf("%d %d %d", &u, &v, &w);
// 添加边 u->v
Node* temp = (Node*) malloc(sizeof(Node));
temp->vertex = v;
temp->weight = w;
temp->next = (*graph)[u].next;
(*graph)[u].next = temp;
// 添加边 v->u
temp = (Node*) malloc(sizeof(Node));
temp->vertex = u;
temp->weight = w;
temp->next = (*graph)[v].next;
(*graph)[v].next = temp;
}
}
// 输出邻接表
void printGraph(Node* graph, int vertices) {
printf("Adjacency list:\n");
for (int i = 0; i < vertices; i++) {
printf("%d: ", i);
Node* temp = graph[i].next;
while (temp != NULL) {
printf("(%d, %d) ", temp->vertex, temp->weight);
temp = temp->next;
}
printf("\n");
}
}
// 主函数
int main() {
Node* graph;
int vertices, edges;
createGraph(&graph, &vertices, &edges);
printGraph(graph, vertices);
return 0;
}
```
该代码会先读入带权无向图的顶点数和边数,然后根据输入,逐个添加边到邻接表中。最后,使用 `printGraph()` 函数输出邻接表。注意,为了方便起见,这里使用了链表来表示邻接表。如果需要使用数组来表示邻接表,可以将 `Node** graph` 改为 `Node graph[]`。
阅读全文