数据结构与算法之图的存储-邻接表法
邻接表法 (顺序 + 链式存储)
图有以下四种存储方式
- 邻接矩阵:数组实现的顺序存储,空间复杂度高,不适合存储稀疏图
- 邻接表:顺序 + 链式存储
- 十字链表:存储有向图
- 邻接多重表:存储无向图
结构 (顺序 + 链式存储)
//顶点
typedef struct VNode{
VertexType data; //顶点信息
ArcNode *first; //第一条边/弧
}VNode,AdjList[MaxVertxNum];
//邻接表存储的图
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
//边/弧
typedef struct ArcNode{
int adjvex; //边/弧指向那个结点
struct ArcNode *next; //指向下一条弧
//InfoType info; //边权值
}ArcNode;
邻接表法——无向图说明
- 边结点的数量是 2 ∣ E ∣ 2|E| 2∣E∣,整体空间复杂度为 O ( ∣ V ∣ + 2 ∣ E ∣ ) O(|V|+2|E|) O(∣V∣+2∣E∣)
- 度:遍历和顶点相关的边链表即可;有多少个边结点,度就是多少
- 图的邻接表表示方式并不唯一
邻接表法——有向图说明
- 边结点的数量是|E|,整体空间复杂度为 O ( ∣ V ∣ + ∣ E ∣ ) O(|V|+|E|) O(∣V∣+∣E∣)
- 度:入度 + 出度
- 出度:遍历和顶点相关的边链表即可;有多少个边结点,出度就是多少
- 入度:除该节点外,遍历所有指向当前结点的结点,有多少个结点指向当前结点,入度就是多少
- 图的邻接表表示方式并不唯一
知识回顾与重要考点
邻接表 | 邻接矩阵 | |
---|---|---|
空间复杂度 | 无向图 $O( | V |
适合用于 | 存储稀疏图 | 存储稠密图 |
表示方式 | 不唯一 | 唯一 |
计算度/入度/出度 | 计算有向图的度、入度不方便,其余很方便 | 必须遍历对应行或列 |
找相邻的边 | 找有向图的入边不方便,其余很方便 | 必须遍历对应行或列 |
![]() |