c语言将邻接矩阵转化为邻接表
时间: 2023-08-10 13:02:18 浏览: 106
好的,我可以帮您回答这个问题。邻接矩阵是一种表示图的方式,而邻接表也是一种表示图的方式,它更加节省空间。将邻接矩阵转化为邻接表的过程如下:
1. 定义一个结构体来表示邻接表中每个节点的信息,包括节点编号和指向其他节点的指针。
2. 遍历邻接矩阵,对于每个节点,创建一个邻接表节点,并将该节点的编号存储在邻接表节点中。
3. 对于邻接矩阵中每个节点的邻居,将其在邻接表中的对应节点添加到邻接表节点的指针列表中。如果邻接矩阵中的值为 0,则不需要添加邻居节点。
4. 最终得到的邻接表就是将邻接矩阵转化而来的,可以使用链表的形式来存储。
下面是一个示例代码,将大小为 n 的邻接矩阵转化为邻接表:
```c
#include <stdio.h>
#include <stdlib.h>
// 邻接表节点的结构体
typedef struct Node {
int val; // 节点编号
struct Node* next; // 指向下一个节点的指针
} Node;
// 创建一个邻接表节点
Node* create_node(int val) {
Node* node = (Node*)malloc(sizeof(Node));
node->val = val;
node->next = NULL;
return node;
}
// 将邻接矩阵转化为邻接表
Node** matrix_to_list(int** matrix, int n) {
Node** list = (Node**)malloc(sizeof(Node*) * n);
for (int i = 0; i < n; i++) {
list[i] = create_node(i);
Node* tail = list[i];
for (int j = 0; j < n; j++) {
if (matrix[i][j] != 0) {
tail->next = create_node(j);
tail = tail->next;
}
}
}
return list;
}
// 打印邻接表
void print_list(Node** list, int n) {
for (int i = 0; i < n; i++) {
printf("%d: ", list[i]->val);
Node* node = list[i]->next;
while (node != NULL) {
printf("%d ", node->val);
node = node->next;
}
printf("\n");
}
}
int main() {
int n = 4;
int** matrix = (int**)malloc(sizeof(int*) * n);
for (int i = 0; i < n; i++) {
matrix[i] = (int*)malloc(sizeof(int) * n);
}
matrix[0][1] = 1;
matrix[0][2] = 1;
matrix[1][2] = 1;
matrix[2][0] = 1;
matrix[2][3] = 1;
matrix[3][3] = 1;
Node** list = matrix_to_list(matrix, n);
print_list(list, n);
return 0;
}
```
输出结果为:
```
0: 1 2
1: 2
2: 0 3
3: 3
```
注意,该示例代码中的邻接矩阵是一个有向图的邻接矩阵。如果需要处理无向图,则需要在转化为邻接表时同时添加双向的边。
阅读全文