邻接矩阵-数据结构(C语言)

导读:本篇文章讲解 邻接矩阵-数据结构(C语言),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

邻接矩阵的构造

第一种存储结构- 邻接矩阵。需要注意的事, 我们接下来针对的是有向图。 今后如果遇到无向图的情况,将每条无向图看成有向图中的正反两条有向边即可。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_N 500

typedef struct Graph {
    int mat[MAX_N][MAX_N];
    int n;
} Graph;
// 首先来实现结构体 Graph 的初始化函数init 吧。函数有两个参数,一个是Grap类型的指针变量g; 另一个是 int 类型的变量n, 表示图中顶点个数。
void init(Graph *g, int n) {
    g->n = n;
    // 接下来, 就要初始化 mat 二位数组,也就邻接矩阵g 中使用的矩阵,我们可以用memset 将 其中的元素 置为0.
    memset(g->mat, 0, sizeof(g->mat));
}

int main() {
    Graph *graph = (Graph *)malloc(sizeof(Graph));
    init(graph, 100);
    return 0;
}

邻接矩阵的使用

在这里插入图片描述
在这里插入图片描述
有向图中得到一条从x 连向y 的有向边,对应邻接矩阵第x 行 y 列元素的值为1。 我们现在不考虑有重复边的情况, 如果有多条边从 x 连到 y 的边, 我们就认为其中只有一条边是有意义的。

在插入之前, 我们需要先判断一下输入是否合法; 如果x 不在区间 【0, n】或者 y 不在区间【0,n】 内,则直接结束函数即可. 注意这里的 n 是指邻接矩阵的维度 n.

  1. 如果插入数据合法,我们在插入从x 连向 y 的边时 只需要将矩阵 第 x 行 y 列的值 设为 1 即可。

  2. 在实现 insert 函数之后, 我们就是实现 output 的具体逻辑了。
    output 函数要实现的功能是将邻接矩阵的所有元素值遍历输出,每行n 个 元素, 一共你行。 首先 ,我们来实现最外层的循环。让循环变量i 从 0 循环到不小于 邻接矩阵 g 的 维度 n 时 退出, 记得加上一对大括号。

  3. 接下来要实现内存的循环了, 让循环变量 j 从 0 循环到不小于邻接矩阵 g 的维度 n 时退出,并且输出矩阵第i 行 j 列 的值。 每输出一个元素之后要输出一个空格。

  4. 邻接矩阵的输出还差最后一步,在每一行输出n 个元素之后 输出一个换行。

  5. 首先输入两个值n 和 m, 分别表示 图中顶点个数 和 图中 有向边的数量。之后输入m 条 有向边,每次读入两个变量 x 和 y, 表示插入一条 从 x 连向 y 的边。 注意 x 和 y 的 取值 范围时 0 到 n -1. m 条 边 输入完成后,程序会将邻接矩阵完成输出。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_N 500

typedef struct Graph {
    int mat[MAX_N][MAX_N];
    int n;
} Graph;

void init(Graph *g, int n) {
    g->n = n;
    memset(g->mat, 0, sizeof(g->mat));
}

void insert(Graph *g, int x, int y) {
    if(x < 0 || x >= g->n || y < 0 || y>= g->n ) {
        return ;
    }
    g->mat[x][y] = 1;
}

void output(Graph *g) {
    for(int i = 0; i < g->n; ++i) {
        for(int j =0; j < g->n; ++j) {
            printf("%d ", g->mat[i][j]);
        }
         printf("\n");
    }
   
}

int main() {
    int n, m, x, y;
    scanf("%d %d", &n, &m);
    Graph *graph = (Graph *)malloc(sizeof(Graph));
    init(graph, n);
    for (int i = 0; i < m; ++i) {
        scanf("%d %d", &x, &y);
        insert(graph, x, y);
    }
    output(graph);
    free(graph);
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/76965.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!