图的邻接表表示法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图的邻接表表示法
图的邻接表表示法类似于树的孩子链表表示法。对于图G中的每个顶点v i,该方法把所有邻接于v i的顶点v j链成一个带头结点的单链表,这个单链表就称为顶点v i的邻接表(Adjacency List)。
1.邻接表的结点结构
(1
:
① 邻接点域adjvex
存放与vi相邻接的顶点v j的序号j。
② 链域next
将邻接表的所有表结点链在一起。
注意:若要表示边上的信息(如权值),则在表结点中还应增加一个数据域。
顶点v i邻接表的头结点包含两个域:
① 顶点域vertex
存放顶点v i的信息
② 指针域firstedge
v i的邻接表的头指针。
注意:
① 为了便于随机访问任一顶点的邻接表,将所有头结点顺序存储在一个向量中就构成了图的邻接表表示。
② 有时希望增加对图的顶点数及边数等属性的描述,可将邻接表和这些属性放在一起来描述图的存储结构。
2.无向图的邻接表
对于无向图,v i的邻接表中每个表结点都对应于与v i相关联的一条边。因此,将邻接表的表头向量称为顶点表。将无向图的邻接表称为边表。
【例】对于无向图G5,其邻接表表示如下面所示,其中顶点v0的边表上三个表结点中的顶点序号分别为1、2和3,它们分别表示关联于v0的三条边(v0,v1),(v0,v2)和(v0,v3)。
注意:n个顶点e条边的无向图的邻接表表示中有n个顶点表结点和2e个边表结点。
3.有向图的邻接表
对于有向图,v i的邻接表中每个表结点都对应于以v i为始点射出的一条边。因此,将有向图的邻接表称为出边表。
【例】有向图G6的邻接表表示如下面(a)图所示,其中顶点v1的邻接表上两个表结点中的顶点序号分别为0和4,它们分别表示从v1射出的两条边(简称为v1的出边):
注意:n个顶点e条边的有向图,它的邻接表表示中有n个顶点表结点和e个边表结点。
4.有向图的逆邻接表
在有向图中,为图中每个顶点v i建立一个入边表的方法称逆邻接表表示法。
入边表中的每个表结点均对应一条以v i为终点(即射入v i)的边。
【例】G6的逆邻表如上面(b)图所示,其中v0的人边表上两个表结点1和3分别表示射人v0的两条边(简称为v0的入边):
注意:
n个顶点e条边的有向图,它的邻接表表示中有n个顶点表结点和e个边表结点。
5.邻接表的形式说明及其建表算法
(1)邻接表的形式说明
var
head,next,point:array[0..2001]of longint; /*邻接表的表首顶点为head,后继指针为next,顶点序列为point */
p:longint;
proc addedge(a,b:longint); /*(a,b)进入邻接表*/
var t:longint;
{ inc(p);point[p]←b; /*增加顶点b*/
if head[a]=0 /*(a,b)进入邻接表*/
then head[a]←p
else{ t←head[a];
while next[t]<>0 do t←next[t];
next[t]←p };/*else*/
};/* addedge } */
(2)邻接表的形式说明
const n=10; e=20; {n为顶点数,e为边数}
type edge=^edgenode;
edgenode=record {边节点信息}
adjvex:1..n; {边的终点(链接点)}
weight:integer;{该边上的权,无权图可以省去}
next:edge; {指向下一条边的链接}
end;
vex=record
vertex:integer;
firstedge:edge;
end;
var s:edge;
g=array [1..n] of vex;
begin
read(n,e); {n为顶点数,e为边数}
for i:=1 to n do
begin
read(g[i]. vertex); {读入顶点信息表}
g[i]. firstedge:=nil; {表头指针初始化}
end;
for k:=1 to e do {建立邻接表}
begin
read(i,j,w); {读入一条边的起点、终点及权值}
new(s);
s^. adjvex:=j; {新节点赋值}
s^.weight:=w;
s^.next:=g[i].firstedge;
g[i].firstedge:=s;
new(s);
s^. adjvex:=i; {新节点赋值}
s^.weight:=w;
s^.next:=g[j].firstedge;
g[j].firstedge:=s;
end;
end.
该算法的时间复杂度是O(n+e)。
注意:
①建立有向图的邻接表更简单,每当读入一个顶点对序号时,仅需生成一个邻接序号为j的边表结点,将其插入到vj 的出边表头部即可。
②建立网络的邻接表时,需在边表的每个结点中增加一个存储边上权的数据域。
图的两种存储结构比较
邻接矩阵和邻接表是图的两种最常用的存储结构,它们各有所长。下面从及执行某些常用操作的时间这两方面来作一比较。