图的邻接表表示法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 的出边表头部即可。

②建立网络的邻接表时,需在边表的每个结点中增加一个存储边上权的数据域。

图的两种存储结构比较

邻接矩阵和邻接表是图的两种最常用的存储结构,它们各有所长。下面从及执行某些常用操作的时间这两方面来作一比较。

相关文档
最新文档