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

邻接矩阵的构造

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

#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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用结构体来实现带权无向图邻接矩阵C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #define MAX_VERTICES 100 // 边的结构体 typedef struct { int v1; // 边的起点 int v2; // 边的终点 int weight; // 边的权值 } Edge; // 图的结构体 typedef struct { int matrix[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵 int n; // 顶点数 int m; // 边数 } Graph; // 初始化图 void initGraph(Graph *g) { int i, j; g->n = 0; g->m = 0; for (i = 0; i < MAX_VERTICES; i++) { for (j = 0; j < MAX_VERTICES; j++) { g->matrix[i][j] = 0; } } } // 添加边 void addEdge(Graph *g, int v1, int v2, int weight) { g->matrix[v1][v2] = weight; g->matrix[v2][v1] = weight; g->m++; } // 创建图 void createGraph(Graph *g) { int i, v1, v2, weight; printf("请输入顶点数:"); scanf("%d", &g->n); printf("请输入边的数量:"); scanf("%d", &g->m); for (i = 0; i < g->m; i++) { printf("请输入第%d条边的起点、终点和权值:", i+1); scanf("%d %d %d", &v1, &v2, &weight); addEdge(g, v1, v2, weight); } } // 打印邻接矩阵 void printGraph(Graph *g) { int i, j; printf("邻接矩阵为:\n"); for (i = 0; i < g->n; i++) { for (j = 0; j < g->n; j++) { printf("%d ", g->matrix[i][j]); } printf("\n"); } } int main() { Graph g; initGraph(&g); createGraph(&g); printGraph(&g); return 0; } ``` 上面的代码中,我们定义了一个边的结构体和一个图的结构体,使用邻接矩阵来存储图。程序首先会要用户输入顶点数和边的数量,然后逐个输入每条边的起点、终点和权值,最后输出邻接矩阵

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值