图的邻接表是一种顺序分配(如数组)和链式分配(如链表)相结合的存储方法。其中数组(顺序分配)用来存放图的各个顶点的数据信息,链表(链式分配)用来存放依附于相应顶点的边的信息。
数组中的每个顶点的信息都是由两部分组成的:顶点域和指针域。结构如下:
V | Link |
网的链表每个节点包含三个要素:顶点位置,权值,指针域。若图不是网络,则可以去掉权值这个要素。结构如下:
Position | Weight | Next |
通常情况下,我们将n个顶点的数据信息存放在一个V[n]数组中,该数组中的每一个数据均表示链表的头结点,共有n个链表。举个例子,如下图所示:
该图中共有5个顶点,因此顶点数组下标为0~4。顶点1,2之间存在权值为3的边,顶点2,3之间存在权值为4的边,顶点3,4之间存在权值为9的边,顶点4,5之间存在权值为6的边,顶点5,1之间存在权值为2的边。邻接表如下:
下面我们通过代码来构建以下上述图中的邻接表。
首先建立顶点与边结点的结构。
-
//邻接表的边结点类型
-
typedef
struct edge {
-
int adjvex;
//该边的终止顶点在顶点数组中的位置
-
int weight;
//该边的权值
-
edge* next;
//指向下一个边结点
-
}ELink;
-
//邻接表的顶点类型
-
typedef
struct ver {
-
int vertex;
//顶点的数据信息
-
ELink* link;
//指向第一条边对应的边结点
-
}VLink;
然后创建一个邻接表。