图的存储结构主要分两种:邻接矩阵,邻接表
1.邻接矩阵
邻接矩阵的存储方式是用两个数组来表示:一个一维数组储存图中顶点信息,一个二维数组储存图中的边或弧的信息。
无向图
把顶点作为矩阵内行和列用矩阵表示出来。如果在两个顶点有联系,那么为1,不然为 0。
从上面可以看出,无向图的边数组是一个对称矩阵。
所谓对称矩阵就是n阶矩阵的元满足a[i][j] = a[j][i]。即从矩阵的左上角到右下角的主对角线为轴,为对称结构。
从矩阵中可得:
1)判断顶点之间是否有边很容易;
2)要知道顶点的度,其实就是这个顶点在第i行(或第i列)的元素之和;
3)求顶点vi的所有邻接点就是将矩阵中第i行元素扫描一遍,a[i][j]为1就是邻接点
有向图
上图图右是一个有向图。有向图是看入度和出度的(顶点的入边数和出边数),例如V2,就有2个出边。列代表着顶点的入边,列的元素相加代表顶点的入度,而行则代表该顶点所有的出边,元素相加则为顶点的出度。假如V2->V1的这个关系要写到邻接矩阵,首先先找到V1的列,然后在对应V2行的位置写上一个1,就可以了。
2.邻接表
邻接矩阵是不错的一种图存储结构,但是,对于边数相对顶点较少的图,这种结构存在对存储空间的极大浪费。因此,对于边数较少的图,我们可以找到一种数组与链表相结合的存储方法。
邻接表的处理方法:
1)图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过,数组读取顶点的信息较容易。
2)图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以,用单链表存储,无向图称为顶点vi的边表,有向图则称为顶点vi作为弧尾的出边表(只管顶点的出边不管入边)。
从图中可以看出,顶点表的各个结点由data和firstedge两个域表示,data是数据域,存储顶点的信息,firstedge是指针域,指向边表的第一个结点,即此顶点的第一个邻接点。边表结点由adjvex和next两个域组成。adjvex是邻接点域,存储某顶点的邻接点在顶点表中的下标,next则存储指向边表中下一个结点的指针。