![94810a2e1916bd1940914ac5299702a4.png](https://i-blog.csdnimg.cn/blog_migrate/c01a5b7a4412ad8845cf9267bb4eb727.jpeg)
因为图的结构特点,使得其在存储、遍历也相对复杂一些。
邻接矩阵存储图
最简单的方式就是将图的顶点用一维数组存储进来,然后将边信息存储在二维矩阵中,这两个数组合称为图的邻接矩阵(Adjacency Matrix)。
![2e1165ac32936164c553234380ebcdba.png](https://i-blog.csdnimg.cn/blog_migrate/e23c9b5afc0aaff4e261740b9be00560.png)
![60e0008db6efe1b11ffe9bf00629eea0.png](https://i-blog.csdnimg.cn/blog_migrate/00eadd7b980385a96f14e77517a1e449.jpeg)
邻接表存储图
看上图邻接矩阵的结构,可以得知邻接矩阵中的边数组中存在大量为零的空占位,浪费了大量空间,所以就自然而然想到利用链表来进行边的存储,这就是邻接表(Adjacency List)。
![b2295b9f861cf7fbafbbcff137054f84.png](https://i-blog.csdnimg.cn/blog_migrate/2bd4238c72469f36684a23a69cbf4094.jpeg)
![18c9d972e8c7c07f3674634c5b28591a.png](https://i-blog.csdnimg.cn/blog_migrate/22cd66a7b90853d2feba6813b2e23004.jpeg)
有向图邻接表的边表为以弧尾为链表表头进行存储的,这样对于顶点的出度统计较为方便,而有向图逆邻接表则正好与邻接表相反,边表是以弧尾作为链表表头的。
![f0fc3e77e5c25101a76fe5b409825c79.png](https://i-blog.csdnimg.cn/blog_migrate/a72d2087242cf6ca9d3610f9e3f68c75.png)
![78d7edef6cacb2a1df0a7c4e56e167a1.png](https://i-blog.csdnimg.cn/blog_migrate/0649ec9d56597162ac12095ab61ebe7e.jpeg)
邻接多重表存储无向图
假如对无向图的邻接表进行删除某边操作时需要对相关结点进行遍历找到相应边然后进行删除,比较麻烦,故邻接多重表对其进行改良。
边表结构:
![2f27ca53978ea0dd9ab3506d6e85796e.png](https://i-blog.csdnimg.cn/blog_migrate/2de1642cac5396bcc107d978cf26b9ed.png)
其中,ivex和jvex为某边依附的两顶点在顶点表中的下标,ilink指向依附顶点ivex的下一条边,同理jlink指向依附顶点jvex的下一条边。
![e37ead75159710294d7305c33cd1ef39.png](https://i-blog.csdnimg.cn/blog_migrate/e5b66e20dcb90ed4b41fc2f600aebb35.jpeg)
十字链表存储有向图
用邻接表存储有向图存在一个问题,对于某一顶点的弧统计还是很麻烦的,邻接表对于顶点作为弧头的弧统计很麻烦,逆邻接表对于顶点作为弧尾的弧统计很麻烦。所以为了对顶点更好的查询,便参考线索二叉树的设计思路,得到了十字链表(Orthogonal List)。
顶点表的结构为:
![ccd817412189bb9ba42ea6a2edf67e5a.png](https://i-blog.csdnimg.cn/blog_migrate/59a90a6c4c328263c3fe52f514aa1ecd.png)
边表结构为:
![06b91f7cb7be60d651f7e600324c5426.png](https://i-blog.csdnimg.cn/blog_migrate/87641cdefc1fb7b4aef9b32ea9da8055.png)
其中,tailvex
为弧尾在顶点表中的下标,headvex
为弧头在顶点表中的下标,headlink
指的是入边表指针域,指的是弧头相同的下一条边,taillink
指的是出边表指针域,指的是弧尾相同的下一边。
![7ce36c95356bc0b81c11da94810b1614.png](https://i-blog.csdnimg.cn/blog_migrate/9f0d642ed795c0281a008fd83aaf7551.jpeg)
图中实线为邻接表,虚线为逆邻接表。
边集数组存储图
![ee596e10b1ee7ee9485382c2d5519a2e.png](https://i-blog.csdnimg.cn/blog_migrate/df9c5cfbe9b7e4f1afd672436d8b523a.jpeg)
注意和邻接矩阵进行区别。