c语言把无向图的邻接矩阵表示转换为邻接表表示
时间: 2023-12-12 20:01:21 浏览: 134
C++实现有向图的邻接表表示
5星 · 资源好评率100%
C语言可以通过以下步骤将无向图的邻接矩阵表示转换为邻接表表示:
1. 首先,我们定义一个结构体来表示图的每个顶点的邻接节点。结构体包含两个成员变量:顶点的值(vertex)和指向下一个邻接节点的指针(next)。
```c
typedef struct AdjListNode {
int vertex;
struct AdjListNode* next;
} AdjListNode;
```
2. 接下来,我们定义另一个结构体来表示整个邻接表。它包含一个数组,数组的每个元素是一个指向AdjListNode结构体的指针,用于表示顶点及其邻接节点。
```c
typedef struct AdjList {
AdjListNode* head;
} AdjList;
```
3. 然后,我们创建一个大小为顶点数的邻接表数组。初始化每个元素为空指针,表示每个顶点的邻接节点列表为空。
```c
AdjList* graph = (AdjList*)malloc(numVertices * sizeof(AdjList));
for (int i = 0; i < numVertices; i++) {
graph[i].head = NULL;
}
```
4. 接下来,我们遍历邻接矩阵。对于每一个非零元素 matrix[i][j],我们创建一个新的邻接节点,并将其插入到顶点 i 的邻接链表中。同时,也将顶点 j 插入到顶点 i 的邻接链表中。
```c
for (int i = 0; i < numVertices; i++) {
for (int j = 0; j < numVertices; j++) {
if (matrix[i][j] != 0) {
AdjListNode* newNode = (AdjListNode*)malloc(sizeof(AdjListNode));
newNode->vertex = j;
newNode->next = graph[i].head;
graph[i].head = newNode;
newNode = (AdjListNode*)malloc(sizeof(AdjListNode));
newNode->vertex = i;
newNode->next = graph[j].head;
graph[j].head = newNode;
}
}
}
```
最后,通过这种方式我们可以将无向图的邻接矩阵表示转换为邻接表表示。这种表示方法可以更加高效地处理图的遍历和查找等操作,并且节省了存储空间。
阅读全文