图的存储结构相对于线性表和树来说更为复杂,因为图中的顶点具有相对概念,没有固定的位置。那我们怎么存储图的数据结构呢?我们知道,图是由(V, E)来表示的,对于无向图来说,其中 V= (v0, v1, ... , vn),E= { (vi,vj) (0 <= i, j <= n且i 不等于j)},对于有向图,E= { (0 <= i, j <= n且i 不等于j)}。V是顶点的集合,E是边的集合。所以我们只要把顶点和边的集合储存起来,那么该图的所有数据就能够存储起来了。
本文只介绍两种比较常见和重要的图的存储结构:邻接矩阵和邻接表。
邻接矩阵,顾名思义,是一个矩阵,一个存储着边的信息的矩阵,而顶点则用矩阵的下标表示。对于一个邻接矩阵M,如果M(i,j)=1,则说明顶点i和顶点j之间存在一条边,对于无向图来说,M (j ,i) = M (i, j),所以其邻接矩阵是一个对称矩阵;对于有向图来说,则未必是一个对称矩阵。邻接矩阵的对角线元素都为0。下图是一个无向图和对应的临街矩阵:
图1:无向图
图2:邻接矩阵
需要注意的是,当边上有权值的时候,称之为网图,则邻接矩阵中的元素不再仅是0和1了,邻接矩阵M中的元素定义为:
。
以下用C语言创建一个无向图的邻接矩阵:
头文件是:GraphStruct.h
1 /*GraphStruct.h
2 * 图的邻接矩阵存储方式,结构由顶点数量、边数量、顶点集合和边集合组成。3 * 其中顶点集合一维数组,根据顶点的数量动态分配数组大小。4 * 边集合是二维数组,根据顶点的数量来动态分配数组大小,对于无向图来说,该