当将邻接矩阵转换为邻接表时,我们需要遍历邻接矩阵的每个元素,找到非零元素的位置,并将其添加到相应的邻接表中。以下是代码:
// 邻接表节点
typedef struct Node {
int vertex;
struct Node* next;
} Node;
// 邻接表
typedef struct AdjList {
Node* head;
} AdjList;
// 图
typedef struct Graph {
int numNodes;
AdjList* array;
} Graph;
// 将邻接矩阵转换为邻接表
Graph* convertToAdjList(int** matrix, int numNodes) {
Graph* graph = createGraph(numNodes);
for (int i = 0; i < numNodes; ++i) {
for (int j = 0; j < numNodes; ++j) {
if (matrix[i][j] != 0) {
addEdge(graph, i, j);
}
}
}
return graph;
}
// 打印邻接表
void printAdjList(Graph* graph) {
for (int i = 0; i < graph->numNodes; ++i) {
Node* currentNode = graph->array[i].head;
printf("邻接表节点 %d: ", i);
while (currentNode) {
printf("%d -> ", currentNode->vertex);
currentNode = currentNode->next;
}
printf("NULL\n");
}
}
// 释放内存
void freeGraph(Graph* graph) {
if (graph) {
if (graph->array) {
for (int i = 0; i < graph->numNodes; ++i) {
Node* currentNode = graph->array[i].head;
while (currentNode) {
Node* temp = currentNode;
currentNode = currentNode->next;
free(temp);
}
}
free(graph->array);
}
free(graph);
}
}