- 创建一个结构体,包含顶点数据域和指向邻接点的指针域。
- 创建一个数组,存放所有顶点的结构体指针。
- 遍历邻接矩阵,对于每个非零元素,创建一个新的结构体节点,存放相应的顶点数据和权值,并将其插入到对应的链表中。
#include <stdio.h>
#include <stdlib.h>
// 定义一个结构体,表示邻接表中的节点
typedef struct node {
int vertex; // 顶点数据域
int weight; // 权值数据域
struct node *next; // 指向下一个邻接点的指针域
} node;
// 定义一个函数,根据给定的顶点数据和权值,创建一个新的节点
node *create_node(int vertex, int weight) {
node *new_node = (node *)malloc(sizeof(node)); // 分配内存空间
new_node->vertex = vertex; // 赋值顶点数据
new_node->weight = weight; // 赋值权值数据
new_node->next = NULL; // 初始化指针域为NULL
return new_node; // 返回新节点的指针
}
// 定义一个函数,将一个节点插入到链表的头部
void insert_node(node **head, node *new_node) {
new_node->next = *head; // 将新节点的指针域指向原来的头节点
*head = new_node; // 将头节点更新为新节点
}
// 定义一个函数,根据给定的邻接矩阵和顶点数,创建对应的邻接表
node **create_adj_list(int **matrix, int n) {
node **adj_list = (node **)malloc(sizeof(node *) * n); // 分配内存空间,存放n个顶点的链表头指针
for (int i = 0; i < n; i++) { // 遍历每个顶点
adj_list[i] = NULL; // 初始化链表头指针为NULL
for (int j = 0; j < n; j++) { // 遍历每个邻接点
if (matrix[i][j] != 0) { // 如果邻接矩阵中有非零元素,表示存在边
node *new_node = create_node(j, matrix[i][j]); // 创建一个新的节点,存放邻接点的数据和权值
insert_node(&adj_list[i], new_node); // 将新节点插入到链表的头部
}
}
}
return adj_list; // 返回邻接表的指针
}
// 定义一个函数,打印邻接表的内容
void print_adj_list(node **adj_list, int n) {
for (int i = 0; i < n; i++) { // 遍历每个顶点
printf("%d: ", i); // 打印顶点编号
node *cur = adj_list[i]; // 获取链表头指针
while (cur != NULL) { // 遍历链表中的每个节点
printf("%d(%d) -> ", cur->vertex, cur->weight); // 打印邻接点的数据和权值
cur = cur->next; // 移动到下一个节点
}
printf("NULL\n"); // 打印链表结束标志
}
}
// 定义一个函数,释放邻接表占用的内存空间
void free_adj_list(node **adj_list, int n) {
for (int i = 0; i < n; i++) { // 遍历每个顶点
node *cur = adj_list[i]; // 获取链表头指针
while (cur != NULL) { // 遍历链表中的每个节点
node *temp = cur; // 保存当前节点的指针
cur = cur->next; // 移动到下一个节点
free(temp); // 释放当前节点的内存空间
}
}
free(adj_list); // 释放邻接表的内存空间
}
// 测试代码
int main() {
// 定义一个邻接矩阵,表示一个无向图
int matrix[5][5] = {
{0, 1, 0, 1, 0},
{1, 0, 1, 0, 1},
{0, 1, 0, 1, 0},
{1, 0, 1, 0, 1},
{0, 1, 0, 1, 0}
};
int n = 5; // 定义顶点数
node **adj_list = create_adj_list((int **)matrix, n); // 创建对应的邻接表
print_adj_list(adj_list, n); // 打印邻接表的内容
free_adj_list(adj_list, n); // 释放邻接表占用的内存空间
return 0;
}