图的存储结构

邻接矩阵(Adjacency Matrix):
  图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。
设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:
arc[n][n]
   
arc[i][j] = 1 若(Vi,Vj)∈E 或 <Vi,Vj>∈E;
arc[i][j] = 0 反之

无向图的边数组是一个对称矩阵。
图中的每条边上带有权的图叫做网
设图有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:
arc[i][j]
arc[i][j] = Wij 若(Vi,Vj)∈E 或 <Vi,Vj>∈E
arc[i][j] = 0   若i=j
arc[i][j] = ∞   反之(∞表示一个计算机允许的、大于所有边上的权值的值,也就是一个不可能的极限值)  

图中如果边数相对顶点较少,邻接矩阵就会对空间造成极大的浪费



邻接表(Adjacency List):
  数组与链表相结合的存储方式称为邻接表。
  1、图中顶点用一个一维数组存储,方便容易读取顶点信息。(也可以用链表)
  2、图中每个顶点Vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点Vi的边表有向图则称为顶点Vi作为弧尾的出边表
顶点表的各个结点由data和firstedge两个域表示,data是数据域,存储顶点信息,firstedge是指针域,指向边表的第一个结点,即此顶点的第一个邻接点。边表结点由adjvex和next两个域组成。adjvex是邻接点域,存储某顶点的邻接点在顶点表中的下标,next则存储指向边表中下一个结点的指针。
  //方便找顶点出度   //方便找顶点入度
带权值的网图,边表结点可以增加一个 weight 



十字链表(Orthogonal List):
顶点表结点结构
data firstin firstout
边表结点结构
tailvex(弧尾) headvex(弧头) headlink taillink
firstin 表示入边表头指针,指向该结点的第一个入边表结点
firstout 表示出边表头指针,指向该结点的第一个出边表结点
tailvex 顶点表结点的一个出边表结点 headvex是指出边表结点的弧头结点在顶点表中的下标。
headlink 指入边表指针域,指向终点相同(headvex)的下一条边,taillink 指向起点相同(tailvex)的下一条边
实线相当于邻接表,虚线相当于逆邻接表
这样就可以找出结点的入度和出度了

V0出边指向结点V3,<V0,V3>, 所以firstout指向边表结点(0,3,ptr,ptr)
V0入边有<V1,V0>,<V2,V0>, 所以firstlink指向边表结点(1,0,ptr,ptr)->(2,0,ptr,ptr)



邻接多重表:
  邻接表中删除一条边要遍历两次,针对这个,出现了 邻接多重表。
边表结点
ivex ilink jvex jlink
ivex和jvex是与某条边依附的两个顶点在顶点表中的下标,顶点表和邻接表相同。
ilink是指依附顶点ivex的下一条边,jlink指向依附顶点jvex的下一条边

右图,删除一条边只要把指向这条边的指针改为null即可



边集数组:
  边集数组是由两个一维数组构成。一个是存储顶点的信息;另一个是存储边的信息,这个边数组每个数据元素由一条边的起点下标(begin)、终点下标(end)和权(weight)组成。

猜你喜欢

转载自www.cnblogs.com/meihao1203/p/9232892.html
今日推荐