将无向图的邻接矩阵转为对应邻接表的算法,使用c语言

  • 创建一个结构体,包含顶点数据域和指向邻接点的指针域。
  • 创建一个数组,存放所有顶点的结构体指针。
  • 遍历邻接矩阵,对于每个非零元素,创建一个新的结构体节点,存放相应的顶点数据和权值,并将其插入到对应的链表中。
#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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以按照以下步骤设计一个算法,将无向图邻接矩阵转换为对应邻接: 1. 创建一个空的邻接,用于存储转换后的图。 2. 遍历邻接矩阵的每一行: - 创建一个空的链,用于存储当前行对应的顶点的邻接点。 - 遍历当前行的每一个顶点: - 如果当前顶点与该行的其他顶点存在边连接(邻接矩阵中的值不为0): - 创建一个新的节点,示与当前顶点相邻的另一个顶点。 - 将该节点插入到当前顶点对应的末尾。 - 将当前行对应插入到邻接中,作为当前顶点的邻接。 3. 返回最终生成的邻接。 下面是一个使用C语言实现上述算法的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 邻接节点 typedef struct Node { int vertex; // 相邻顶点的索引 struct Node* next; // 指向下一个节点的指针 } Node; // 邻接 typedef struct AdjList { Node* head; // 指向链头节点的指针 } AdjList; // 创建节点 Node* createNode(int v) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->vertex = v; newNode->next = NULL; return newNode; } // 创建邻接 AdjList* createAdjList(int vertices) { AdjList* adjList = (AdjList*)malloc(vertices * sizeof(AdjList)); for (int i = 0; i < vertices; ++i) { adjList[i].head = NULL; } return adjList; } // 添加边到邻接 void addEdge(AdjList* adjList, int src, int dest) { // 添加从 src 到 dest 的边 Node* newNode = createNode(dest); newNode->next = adjList[src].head; adjList[src].head = newNode; // 添加从 dest 到 src 的边(无向图) newNode = createNode(src); newNode->next = adjList[dest].head; adjList[dest].head = newNode; } // 打印邻接 void printAdjList(AdjList* adjList, int vertices) { for (int i = 0; i < vertices; ++i) { Node* current = adjList[i].head; printf("顶点 %d 的邻接 ", i); while (current) { printf("-> %d ", current->vertex); current = current->next; } printf("\n"); } } int main() { int vertices; // 顶点数量 printf("请输入顶点数量:"); scanf("%d", &vertices); // 创建邻接 AdjList* adjList = createAdjList(vertices); // 读取邻接矩阵 int adjacencyMatrix[vertices][vertices]; printf("请输入邻接矩阵:\n"); for (int i = 0; i < vertices; ++i) { for (int j = 0; j < vertices; ++j) { scanf("%d", &adjacencyMatrix[i][j]); } } // 将邻接矩阵转换为邻接 for (int i = 0; i < vertices; ++i) { for (int j = 0; j < vertices; ++j) { if (adjacencyMatrix[i][j] != 0) { addEdge(adjList, i, j); } } } // 打印邻接 printAdjList(adjList, vertices); return 0; } ``` 你可以根据需要修改这段代码,并根据输入的邻接矩阵生成对应邻接。希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值