6.3.1 无向图的邻接表
顶点:按编号顺序将顶点数据存储在一维数组中。
关联同一顶点的边(以顶点为尾的弧)用线性表存储。
无向图的邻接表的特点:邻接表不唯一;若无向图有n个顶点、e条边,则题邻接表需要n个头结点和2e个表结点,它适用于存储稀疏图;无向图中顶点vi的度为第i个单链表中的结点数。
6.3.2 有向图的邻接表
有向图的邻接表找出度容易,找入度难。
特点:
1、顶点vi的出度为第i个单链表中的结点个数;
2、顶点vi的入度为整个单链表中邻接点域值是i-1的结点个数。
逆邻接表:
1、顶点vi的入度为第i个单链表中的结点个数;
2、顶点vi的出度为整个单链表中邻接点域值是i-1的结点个数。
6.3.3 图的邻接表存储表示
弧(边)的结点结构:
#define MVNum 100 //最大顶点数
typedef struct ArcNode
{
int adjvex; //边所指向的顶点在数组中的位置
struct ArcNode *nextarc; //指向下一条边的指针
OtherInfo info; //和边相关的信息
}ArcNode;
邻接表的结构:
typedef struct VNode
{
VerTexType data; //顶点信息
ArcNode *firstarc; //指向第一条边依附该顶点的边的指针
}VNode, AdjList[NVNum];
图的结构定义:
typedef struct
{
AdjList vertices;
int vexnum, arcnum; //图的顶点个数和边的个数
}ALGraph;
6.3.4 邻接表的特点
1、方便找任一顶点的所有“邻接点”;
2、节约稀疏图的空间;
3、不方便检查任一对顶点间是否存在边。
6.3.5 邻接矩阵与邻接表表示法的关系
1、联系:
邻接表中每个链表对应邻接距阵的一行,链表中点解个数等于邻接矩阵一行中非零元素的个数。
2、区别:
(1)对于任一确定的无向图,邻接距阵是唯一的(行列号与顶点编号一致),但邻接表不唯一(链接次序与顶点编号无关)。
(2)邻接距阵的空间复杂度为,而邻接表的空间复杂度为。
3、用途:
邻接距阵多用于稠密图;而邻接表多用于稀疏图。