学习完“树”的数据结构,接下来就是“图”了,越复杂的数据结构,其实用性往往是最强的,图是需要掌握的。
1、图
(1).图是一种非线性结构;主要由顶点和边构成;
(2).<> 代表有向图,( )代表无向图;
(3).无向图有N个顶点时,最多有N*(N-1)/2条边;有向图最多有N*(N-1)条边;
(4).权:边上具有相关的数,带权图叫做网络;
(5).邻接顶点: 与其接触边上的顶点;
(6).度:与顶点V关联的边数;有向图中度 = 出度 + 入度;
(7).简单路径:路径上各顶点互不重复;
(8).回路/环:路径上第一个顶点与最后一个顶点重合;
(9).连通图/强连通图:各顶点之间有边联系,有向图,双路径存在叫做强连通图;
(10).生成树:是无向连通图的极小连通子图,若有N个顶点,则生成树由N-1条边构成!
2、图的邻接矩阵
邻接矩阵模型
就是将图的多对多的非线性结构用矩阵的方式表示;
我们必须知道:
(1).会由矩阵来恢复图;
(2).第一个邻接顶点:从列开始处,第一个边
(3).下一个邻接顶点:给2个参数,第一个参数表示是谁的下一个邻接顶点,第二个表示从当前顶点开始其后的第一条边;
(4).
其顶点存放在数组空间中;
(5).
顶点之间的关系通过矩阵来表示边。
存储结构:
3、图的实现方法
均用C++实现;并且父类给了接口,子类继承实现即可;方便对不同的存储结构的编写。
核心方法,删除顶点:
(1)、第一种方法实现
4、图的方法实现完整代码、测试代码、测试结果
(1)、完整代码(用的是继承,方便写其它的存储结构代码):
推荐阅读:
从零开始学习数据结构-->入门篇
从零开始学习数据结构-->链表
从零开始学习数据结构-->线性表
从零开始学习数据结构-->栈
从零开始学习数据结构-->队列
从零开始学习数据结构-->矩阵+串
从零开始学习数据结构-->哈希表
从零开始学习数据结构-->散列桶
从零开始学习数据结构-->二叉树
![777c91a690dd8e39b180fe9da56f6eea.png](https://i-blog.csdnimg.cn/blog_migrate/7a842994b0c2016f14ff2771d5422264.png)
1
存储模型如下:
![fab20b5cf3431708a2748b2c099bd357.png](https://i-blog.csdnimg.cn/blog_migrate/62dd903158f17dd84d61aee6895c4f36.png)
1
以上存在数组的大量移动,效率太低;
(2)、第二种方法实现
1
第二种方法甚好,将要删除的顶点(连边一起删除),用最后一个元素(行/列)去覆盖删除的那个即可,之间的关系不变,但是就避免了大量移动,一次覆盖就好,效率极大!!!
模型如下:
![60b242b927dffb0334610a0ff34ab909.png](https://i-blog.csdnimg.cn/blog_migrate/da205c52a4999162e4c92ec3ed5713b0.png)
1
(2)、测试代码:
1
(3)测试结果:
![2de907efbef08bc2b30d91ffd40f47b1.png](https://i-blog.csdnimg.cn/blog_migrate/1fabcf1520275f96a33078407835b040.png)
![82c12890294edf273bef2cdf3a91883c.png](https://i-blog.csdnimg.cn/blog_migrate/6b1da18e175753c8ff6cc8afd11dbb1f.png)
从零开始学习数据结构-->二叉树方法实现
从零开始学习数据结构-->线索二叉树从零开始学习数据结构-->树、森林与二叉树的转换
从零开始学习数据结构-->大堆+小堆
从零开始学习数据结构-->AVL树之旋转算法从零开始学习数据结构-->AVL树之插入算法
从零开始学习数据结构-->AVL树之删除算法 从零开始学习数据结构-->红黑树 认真的人 自带光芒