首页/数据结构/05-graph/邻接表存储 🔗 在 Obsidian 中打开
数据结构 · 05-graph

邻接表存储

重要度 ⭐⭐⭐⭐ 邻接表图的存储链表
速查
邻接表:每个顶点一个单链表存放其邻接点。空间 O(n+e);适合稀疏图;无向图边结点数 2e、有向图为 e;同一图的邻接表不唯一

核心概念

邻接表是图的链式存储:对每个顶点建一个单链表,存与该顶点邻接的顶点。结构由顶点表(数组,含顶点数据 + 指向第一条边的指针)和边表(弧结点)(含邻接点下标、权值可选、指向下一条边的指针)组成。

typedef struct ArcNode {     // 边结点
    int adjvex;               // 邻接点下标
    struct ArcNode *next;     // 指向下一条边
} ArcNode;
typedef struct VNode {        // 顶点结点
    char data;                // 顶点数据
    ArcNode *first;           // 指向第一条边
} VNode, AdjList[MaxVertexNum];
typedef struct {
    AdjList vertices;         // 顶点表
    int vexnum, arcnum;       // 顶点数、边数
} ALGraph;
有向图:邻接表与逆邻接表邻接表存出边→求出度方便;逆邻接表存入边→求入度方便。求出入度需同时建两种表。

关键性质

性质说明
空间复杂度O(n+e):n 个顶点表 + 2e 个边结点(无向图)
无向图边结点数2e(每条边在两个链表中各出现一次)
有向图边结点数e
求无向图度遍历该顶点链表,O(deg)
求有向图出度 / 入度出度 O(OD);入度需遍历所有链表,最坏 O(n+e)
判断边存在遍历该顶点链表,O(deg(u))
不唯一性边上插入顺序不同 → 不同邻接表

邻接矩阵 vs 邻接表

比较项邻接矩阵邻接表
空间O(n²)O(n+e)
判断边存在O(1)O(度)
求度O(n)O(度)
适用稠密图稀疏图
唯一性唯一(给定编号)不唯一

常见考法

考法解题套路
写出邻接表对每个顶点列出其所有邻接点
空间复杂度O(n+e)
从邻接表求度遍历链表计数
选存储结构稀疏图→邻接表,稠密图→邻接矩阵
有向图求入度遍历所有链表或用逆邻接表

易错点

易错清单
  • ⚠️ 无向图每条边出现两次 → 边结点数 = 2e。
  • ⚠️ 有向图邻接表只能方便求出度,求入度要遍历所有链表。
  • ⚠️ 同一图的邻接表不唯一(边的顺序可变)。
  • ⚠️ 邻接表不适合频繁判断边是否存在。
  • ⚠️ 稀疏图用邻接表,空间 O(n+e) 远优于 O(n²)。

核心结论

  1. 邻接表适合稀疏图,空间 O(n+e)。
  2. 无向图边结点数 2e,有向图边结点数 e
  3. 求出度方便 O(OD),求入度需遍历 O(n+e)。
  4. 同一图的邻接表表示不唯一。
  5. DFS/BFS 在邻接表上时间 O(n+e),在邻接矩阵上 O(n²)。

记忆卡片

邻接表的空间复杂度?
O(n+e):n 个顶点表 + 2e 个边结点(无向图)。
无向图邻接表边结点数?
2e,每条边在两个端点链表中各出现一次。
邻接表适合什么图?
稀疏图;稠密图用邻接矩阵。
有向图如何方便求入度?
用逆邻接表,或遍历所有链表统计。

交互动画 · 邻接表与求度

无向图(5 顶点 5 边);左=顶点表,右侧=各顶点邻接链表 V1 V2 V3 V4 4 3 2 5 1 4 1 3 1 2 V1 链表长度 3 → deg(V1)=3 V3 链表长度 2 → deg(V3)=2
邻接表已建好:每个顶点链一个「邻接点单链表」
点按钮:沿某顶点链表数结点,即其度;或统计全部边结点
无向图每条边在两端点各出现一次 → 边结点数 2e;空间 O(n+e),适合稀疏图。

相关知识点

adjacency-matrix adjacency-mulitlist-and-orthogonal

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。