相关定义
-
邻接表:
是图的一种链式
存储结构。
在邻接表中,对每个顶点建立一个单链表,第 i 个单链表中的结点
表示依附于 顶点 vi 的边
(对有向图
而言则是以顶点 vi 为弧尾的弧)。
每个单链表
由一个表头结点
和若干个表中结点
组成。 -
表头结点 (顶点)
此类型结点设置有数据域
和链域
。(data域
和firstarc域
)
数据域
存储存储顶点 vi 的名或其它相关信息。
链域
指向链表中的第一个表中结点
,代表表头结点关联的第一条弧
; -
表结点 ( 弧 )
此类型结点设置有邻接点域
,链域
和数据域
。(adjvex域
,nextarc域
和info域
)
邻接点域
:指示与顶点 vi 邻接的点在图中的位置。
链域
:指示下一条边 / 弧的表中结点
。
数据域
:存储 边 / 弧 相关的信息,如权值等。
-
表头结点
可以用链来连接,但通常以顺序结构
来存储,以便随机访问任一顶点的链表.
邻接表存储结构
#define MAX_VERTEX_NUM 20
typedef struct ArcNode
{
int adjvex; // 该弧所指向的顶点的位置
struct ArcNode *nextarc; // 指向的下一条弧的指针
InfoType *info; // 指向该弧相关信息的指针
} ArcNode; // 表中结点,表示一条弧(也可以是一条边)
typedef struct VNode
{
VertexType data; //顶点信息
ArcNode *firstarc; //指向第一条依附于该顶点的弧的指针
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct
{
AdjList vertices; //存放顶点结点的顺序表
int vexnum, arcnum; //图的当前顶点数和弧数
int kind; //图的种类,标志
} ALGraph;
性质
-
对于一个有 n 个顶点,e 条边的无向图:
它的邻接表需要 n 个头结点和 2e 个表结点,
而它的邻接矩阵需要 n2 个单元,
在边比较少 (即稀疏图
) 的情况下,使用邻接表
比邻接矩阵
节约存储空间。 -
对于
无向图
而言,顶点 vi 的度为 :邻接表中第 i 个链表中的结点个数 (不包括表头结点
)
对于有向图
而言,第 i 个链表中的结点个数只是顶点 vi 的出度
;若要求 vi 的入度,则需要遍历整个邻接表,所有链表中邻接点域的值为 i 的结点的个数是顶点 vi 的入度
。 -
对于有向图而言,可以建立有向图的
逆邻接表
,以便于求顶点的入度。(就是对每个顶点 vi 建立一个 以 vi 为弧头的弧 的链表)
-
时间复杂度
对于一个有 n 个顶点,e 条弧的有向图,在建立邻接表
或者逆邻接表
时:
若输入的顶点信息
即为顶点的编号
,则建立邻接表的时间复杂度
为 O( n+e )
否则,需要通过查找才能得到顶点在图中位置,则时间复杂度为 O( n*e ),每一条弧求顶点在图中位置都需要遍历 n 个顶点。 -
邻接表
与邻接矩阵
相比较
邻接表上容易找到任一顶点的第一个邻接点和下一个邻接点;
判定任意两个顶点 vi 和 vj 之间是否有边或者有弧相连则需要分别搜索第 i 个或第 j 个链表,此时邻接表
不如邻接矩阵
来的方便。邻接矩阵之间看 A [ i ] [ j ] 和 A [ j ] [ i ] 是否为 1 即可。