
在数据结构的世界里,“图” 是个神奇的存在 —— 它能像地图一样描绘城市间的道路,也能像通讯录一样记录人与人的关联。而今天我们要聊的 “无向邻接矩阵”,就是描述图的 “万能密码本”,哪怕是新手也能轻松 get 它的核心逻辑。
其实图的概念特别好理解,我们可以把它想象成一个 “社交圈”:
举个具体的例子:如果有 4 个人(0、1、2、3),他们的朋友关系是这样的:0 和 1 是朋友、0 和 2 是朋友、0 和 3 是朋友、1 和 2 是朋友、2 和 3 是朋友。把这些关系画出来,就是一个典型的 “无向图”—— 没有箭头,只靠线条连接彼此。
既然无向图是 “社交圈”,那怎么把这个圈子 “写进代码” 里?答案就是邻接矩阵—— 一个用 “行” 和 “列” 对应顶点,用 “0 和 1” 表示是否有边的表格。
假设我们有 4 个顶点(编号 0-3),邻接矩阵就是一个 4×4 的表格:
因为是 “无向图”,朋友关系双向,所以邻接矩阵一定是对称的—— 比如 matrix[0][1] = 1,那 matrix[1][0] 也必须是 1,就像 “你是我的朋友,我也是你的朋友” 一样。


光说理论不够,我们直接看 C 语言的实现(这也是最直观的理解方式)。首先要定义一个 “图的结构体”,把顶点、邻接矩阵、顶点数、边数都装进去:
#include<stdio.h>
// 定义顶点类型(这里用字符表示顶点编号,比如'0'、'1')
typedef char vertaxType;
// 定义边的类型(0表示无边,1表示有边)
typedef int edgeType;
// 最大顶点数(可根据需求调整)
#define maxsize 100 图的邻接矩阵结构体
typedef struct mat_grph {
vertaxType ver[maxsize]; / 存储所有顶点
edgeType arc[maxsize][maxsize];// 邻接矩阵(核心!)
int ver_num; 际顶点个数
int arc_num; / 实际边的个数
} mat_grph; 结构体命名为mat_grph // / // 实 /
//这个结构体就像一个 “图的工具箱”:ver数组存顶点名字,arc二维数组就是邻接矩阵,ver_num和arc_num则记录图的大小。
知道了结构,我们就来 “搭建” 一个具体的无向图 —— 还是用之前的 4 人社交圈举例。
初始化的核心是两步:先把矩阵 “清空”(全设为 0),再根据实际关系 “填 1”。
// 初始化图
void init_grph(mat_grph* G) {
// 1. 设置顶点数和边数(4个顶点,5条边)
G->ver_num = 4;
G->arc_num = 5;
// 2. 给顶点命名(这里直接用'0'~'3')
G->ver[0] = '0';
G->ver[1] = '1';
G->ver[2] = '2';
G->ver[3] = '3';
// 3. 初始化邻接矩阵:先全设为0(默认无边)
for (int i = 0; i < G->ver_num; i++) {
for (int j = 0; j < G->ver_num; j++) {
G->arc[i][j] = 0;
}
}
// 4. 填充边(无向图要对称赋值!)
G->arc[0][1] = 1; G->arc[1][0] = 1; // 0和1是朋友
G->arc[0][2] = 1; G->arc[2][0] = 1; // 0和2是朋友
G->arc[0][3] = 1; G->arc[3][0] = 1; // 0和3是朋友
G->arc[1][2] = 1; G->arc[2][1] = 1; // 1和2是朋友
G->arc[2][3] = 1; G->arc[3][2] = 1; // 2和3是朋友
}这里一定要注意 “对称赋值”—— 比如给arc[0][1]设 1 后,必须给arc[1][0]也设 1,否则就变成 “单向关系”(有向图)了,不符合我们的无向图需求。
初始化后,我们可以写一个函数把邻接矩阵打印出来,看看是不是符合预期:
// 输出邻接矩阵
void print_grph(mat_grph G) {
printf("无向图的邻接矩阵:\n");
for (int i = 0; i < G.ver_num; i++) {
for (int j = 0; j < G.ver_num; j++) {
printf("%4d", G.arc[i][j]); // 每个元素占4位,排版更整齐
}
printf("\n"); // 每行结束换行
}
}最后写个主函数,把前面的功能串起来:
int main() {
mat_grph G; 图的结构体变量
init_grph(&G); // 初始化图(传地址,修改结构体内容)
print_grph(G); // 打印邻接矩阵
return 0;
} // 创建运行结果会是这样的(注意看对称性!):
无向图的邻接矩阵:
0 1 1 1
1 0 1 0
1 1 0 1
1 0 1 0对比我们之前的 “社交圈”,这个矩阵完美记录了所有朋友关系 —— 比如第 0 行有 3 个 1,说明顶点 0 和 1、2、3 都是朋友,完全正确!
可能有人会问:记录关系的方式有很多,为啥偏偏选邻接矩阵?它的优势很明显:
当然,它也有小缺点 —— 如果顶点多但边少(比如 1000 个人,只有 10 对朋友),邻接矩阵会有很多 0,浪费内存。但对于边比较多的 “稠密图”,它绝对是首选。
其实看完这么多,你会发现无向邻接矩阵一点都不复杂:
下次再看到 “图” 的问题,不妨先想想:如果用邻接矩阵来表示,这个 “社交圈” 会是什么样的表格?跟着这个思路走,数据结构的很多难题都会变得简单~