数据结构:图;邻接矩阵和邻接表

邻接矩阵:

1.概念:

邻接矩阵是图的存储结构之一,通过二维数组表示顶点间的连接关系。

2.具体例子 :

一.无向图邻接矩阵示例:

示例图(顶点:A、B、C,边:A-B、B-C):

复制代码
邻接矩阵:
  A B C  
A 0 1 0  
B 1 0 1  
C 0 1 0  

特点

  1. 矩阵对称,主对角线为0(无自环边)。
  2. 顶点B的度为2,对应第2行/列非零元素数量。
  3. 非零元素总数=边数×2(无向图双向性)。

二、有向图邻接矩阵示例

示例图(顶点:V1→V2、V2→V3、V3→V1):

复制代码
邻接矩阵:
   V1 V2 V3  
V1 0   1  0  
V2 0   0  1  
V3 1   0  0  

特点

  1. 矩阵不对称(边方向性)。
  2. V3的入度=1(第3列非零数),出度=1(第3行非零数)。

三、带权图(网)邻接矩阵示例

示例图(顶点:A、B、C,边:A-B权2,B-C权5):

复制代码
邻接矩阵(∞表示无穷):
  A   B     C  
A 0   2     ∞  
B 2   0     5  
C ∞   5     0  

特点

  1. 权值替代0/1,主对角线仍为0。
  2. 对称性保留(无向网),稀疏图可能用压缩存储。

邻接表:

概念:

邻接表是图数据结构最常用的链式存储方式,通过数组与链表结合实现顶点与边的离散化存储。

  1. 组成结构
    • 顶点表(头节点表) :一维数组存储顶点信息,每个元素包含顶点值和指向首个邻接点的指针。
    • 边表(链表节点):每个顶点对应的链表,存储其所有邻接点的索引(或地址)及边权重(网图)。例如顶点A的链表包含C,表示存在边AC。

示例图结构:

假设存在无向图如下(顶点:A、B、C、D;边:A-B、A-C、B-C、B-D、C-D):

复制代码
 A 
/ \
B------C 
 \ /
  D 

邻接表存储实现

1. 顶点表(顺序存储)

顶点表使用数组存储,每个元素包含顶点信息和指向邻接链表的指针:

复制代码
顶点表索引 | 顶点数据 | 边表头指针 
---------------------------------
0         |   A     | → 1 → 2 → NULL 
1         |   B     | → 0 → 2 → 3 → NULL 
2         |   C     | → 0 → 1 → 3 → NULL 
3         |   D     | → 1 → 2 → NULL 
2. 边表(链表存储)

每个顶点的边表以链表形式存储邻接顶点(本例使用头插法):

  • 顶点A的邻接链表:B(索引1)、C(索引2)
  • 顶点B的邻接链表:A(索引0)、C(索引2)、D(索引3)
  • 顶点C的邻接链表:A(索引0)、B(索引1)、D(索引3)
  • 顶点D的邻接链表:B(索引1)、C(索引2)
cs 复制代码
// C语言实现(无向图)
typedef struct ArcNode {    // 边表节点 
    int adjvex;             // 邻接顶点索引 
    struct ArcNode *next;   // 指向下一邻接点 
} ArcNode;

typedef struct VNode {      // 顶点表节点 
    char data;              // 顶点数据 
    ArcNode *firstarc;      // 指向第一个邻接点 
} VNode, AdjList[MAX_VERTEX];

typedef struct {
    AdjList vertices;       // 顶点表数组 
    int vexnum, arcnum;     // 顶点数和边数 
} ALGraph;
相关推荐
董董灿是个攻城狮11 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员18 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish18 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱19 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考1 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx2 天前
CART决策树基本原理
算法·机器学习
Wect2 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript