文章目录
图的存储结构:比线性表和树更复杂,完全不能用顺序结构
终于弄明白为啥要先学线性表,再学树,再学图了。因为他们各方面的复杂性都是递增的,比如存储方式即存储结构的设计上,基本操作上。线性表要么顺序存储要么链式存储,而树基本都是采用链式存储,二叉链表的形式,用孩子兄弟表示法,但是也比现行表复杂很多了;图则更复杂。
复杂在哪里呢?图的任意一个顶点都可以作为第一个顶点,且一个点的邻接点之间也没有次序关系。比如下图,实际上四个图都是同一个图,但是看起来却有点不一样:

点在内存中的位置完全没办法说明点之间的逻辑关系,所以完全不能用顺序结构来存储图。
那么多重链表呢?即结点有多个指针域的链表。每个顶点有一个数据域,多个指针域。但是就像之前在树中讨论的那样,指针域的个数很难确定,每个顶点的度数不一样,要么让每个顶点的指针域个数都等于图的最大顶点度数,这样很浪费空间;要么让每个点的指针域个数等于自己的度,但是需要每个结点单独拿一个数据说明指针域个数,这样会使得整个多重链表混乱不统一,不便于处理。
所以图的物理存储是个难题,但是前辈们已经给出了五种不同的解决方案:邻接矩阵,邻接表,十字链表,邻接多重表,边集数组。
邻接矩阵,邻接表,十字链表都用了一个一维数组存储顶点,即都用了顺序存储结构,但是数组元素结点的结构体的设计不一样。
邻接矩阵只用了两个数组,一个一维一个二维,完全不涉及动态分配内存,是静态的存储方式。但不能说是顺序存储哦,因为顺序存储只适合一维数组(一对一,前驱后继,用物理的顺序存储逻辑关系),二维数组并不是顺序存储。
邻接矩阵(不涉及动态存储):用两个数组表示图,一个一维数组存顶点,一个二维数组(即邻接矩阵)存边
即一个顶点数组,一个边数组,这个二维的边数组就是邻接矩阵adjacent matrix
无向图:邻接矩阵是对称矩阵,行和是顶点的度
无向图的边数组是一个对称矩阵


求点 v i v_i vi的邻接点,就遍历第i行,所有 a r c [ i ] [ j ] arc[i][j] arc[i][j]为1的 v j v_j vj就是邻接点。
有向图:邻接矩阵不对称,行和是出度,列和是入度

只要 a c r [ i ] [ j ] = 1 acr[i][j]=1 acr[i][j]=1则 v i v_i vi和 v j v_j vj之间有有向边。
要找 v i v_i vi的邻接点,就遍历第i行,满足 a c r [ i ] [ j ] = 1 acr[i][j]=1 acr[i][j]=1的点就是邻接点。
网:用一个不可能的值表示不存在的边的权

下面是一个有向网

代码
表示图的结构体的代码
typedef

最低0.47元/天 解锁文章
919

被折叠的 条评论
为什么被折叠?



