1、
》》当一个图为稀疏图时,使用邻接矩阵表示法显然要浪费大量的存储空间。而图的邻接表法结合了
“ 顺序存储 ” 和 “ 链式存储 ” 方法,大大减少了这种不必要的浪费。
》》 所谓邻接表就是对图G中的每个顶点 Vi 建立一个单链表,第 i 个单链表中结点表示依附
顶点 Vi的边(对于有向图则是以顶点 Vi 的弧),这个单链表就称为顶点 Vi 的边表
(对于有向图则称为“ 出边表 ”)。
边表的头指针和顶点的数据信息采用顺序存储(称为顶点表),所以在邻接表中存在两种结点:
“ 顶点表法 ” 和 “ 边表结点 ”。
补充1:顶点表结点由 “ 顶点域(data)”和“ 指向第一条邻接边的指针(firstarc)”构成
补充2: 边表(邻接表)结点由“ 邻接点域(adjvex)” 和 “ 指向下一条邻接边的指针域(nextarc)”构成。
》》无向图邻接表法的示例:
》》 有向图邻接标法的实例:
》》 图的邻接表存储结构定义如下:
#define MaxVertexNum 100 // 图中顶点数目的最大值
typedef struct ArcNode{ // 边表结点
int adjvex; // 该弧所指向的顶点的位置
struct ArcNode *next; // 指向下一条弧的指针
// InfoType info ; // 网的权值
}ArcNode;
typedef struct VNode{ // 顶点表结点
VertexType data; // 顶点信息
ArcNode *first; // 指向第一条依附该顶点的弧的指针
}VNode , AdjList[MaxVertexNum];
typedef struct{
AdjList vertices; // 邻接表
int vexnum , arcnum ; // 图的顶点数和弧数
}ALGraph; // ALGraph 是以邻接表存储的图类型
》》图的邻接表存储方法具有以下特点:
1)、如果图G为无向图,则所需要的存储空间为O( |V| + 2|E| ) ;
如果图 G 为有向图,则所需要的存储空间为 O( |V| + |E| )
2)、对于稀疏图,采用邻接表表示将极大地节省存储空间。
3)、在邻接表中,给定一顶点,能很容易地找到它的所有边,因为只需要读取它的邻接表就可以了。
在邻接矩阵中,相同的操作则需要扫描一行,花费的时间为 O( n ) 。
但是,如果要确定给定的两个顶点间是否存在边,则在邻接矩阵里可以立刻查到,在邻接表中
则需要在相应结点对应的边表中查找另一个结点,效率较低。
4)、在有向图的邻接表表中,求一个给定顶点的出度只需要计算其邻接表中的结点个数即可;但是
求其顶点的入度,则需要遍历全部的邻接表。因此,也有人采用逆邻接表的存储方式来加速求解
给定顶点的入度。当然,这实际上与邻接表存储方式是类似的。
5)、图的邻接表表示并不唯一,这是因为在每个顶点对应的单链表中,各边结点的链接次序可以是
任意的,取决于建立邻接表的算法以及边的输入次序。