将邻接矩阵转化为邻接表(C语言版)

当将邻接矩阵转换为邻接表时,我们需要遍历邻接矩阵的每个元素,找到非零元素的位置,并将其添加到相应的邻接表中。以下是代码:

// 邻接表节点
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);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以帮你编写一个将图的邻接矩阵表示转换为邻接表表示的算法。以下是一个示例的C语言实现: ```c #include <stdio.h> #include <stdlib.h> // 图的最大顶点数 #define MAX_VERTICES 100 // 邻接表节点 typedef struct Node { int vertex; struct Node* next; } Node; // 邻接表 typedef struct List { Node* head; } List; // 图结构 typedef struct Graph { int numVertices; List* array; } Graph; // 创建节点 Node* createNode(int vertex) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->vertex = vertex; newNode->next = NULL; return newNode; } // 创建图 Graph* createGraph(int numVertices) { Graph* graph = (Graph*)malloc(sizeof(Graph)); graph->numVertices = numVertices; // 创建邻接表数组 graph->array = (List*)malloc(numVertices * sizeof(List)); // 初始化邻接表为空 for (int i = 0; i < numVertices; i++) { graph->array[i].head = NULL; } return graph; } // 添加边 void addEdge(Graph* graph, int src, int dest) { // 添加从src到dest的边 Node* newNode = createNode(dest); newNode->next = graph->array[src].head; graph->array[src].head = newNode; // 添加从dest到src的边(无向图) newNode = createNode(src); newNode->next = graph->array[dest].head; graph->array[dest].head = newNode; } // 打印邻接表表示的图 void printGraph(Graph* graph) { for (int i = 0; i < graph->numVertices; i++) { Node* currentNode = graph->array[i].head; printf("顶点 %d 的邻接表:", i); while (currentNode) { printf(" -> %d", currentNode->vertex); currentNode = currentNode->next; } printf("\n"); } } int main() { int numVertices, numEdges; printf("请输入顶点数:"); scanf("%d", &numVertices); // 创建图 Graph* graph = createGraph(numVertices); printf("请输入边数:"); scanf("%d", &numEdges); // 添加边 for (int i = 0; i < numEdges; i++) { int src, dest; printf("请输入边的起点和终点:"); scanf("%d %d", &src, &dest); addEdge(graph, src, dest); } // 打印邻接表表示的图 printGraph(graph); return 0; } ``` 这个算法首先定义了邻接表节点和邻接表数据结构,然后创建了一个图的数据结构。接下来,通过`createNode`函数来创建一个新的节点,`createGraph`函数来创建一个新的图。然后使用`addEdge`函数添加边到图中。最后,使用`printGraph`函数打印出邻接表表示的图。 你可以根据需要修改输入和输出的方式来适应你的具体应用场景。希望这个算法能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值