学习完“树”的数据结构,接下来就是“图”了,越复杂的数据结构,其实用性往往是最强的,图是需要掌握的。
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). 顶点之间的关系通过矩阵来表示边。 存储结构:
1int maxVertices; //最大顶点数
2int curVertices; //当前顶点数
3int curEdges; //当前边数
4 //用的是C++的继承
5Type *vertexList; //存放顶点的数组
6int **edge; //存放顶点关系的矩阵用边表示
存储模型如下:
3、图的实现方法 均用C++实现;并且父类给了接口,子类继承实现即可;方便对不同的存储结构的编写。
核心方法,删除顶点: (1)、第一种方法实现
1bool removeVertex(const Type &v){
2 int i = getVertexIndex(v);
3 if(i == -1){
4 return false;
5 }
6 for(int k = i; k -1; ++k){
7 vertexList[k] = vertexList[k+1];
8 }
9
10 int edgeCount = 0;
11 for(int j = 0; j 12 if(edge[i][j] != 0)
13 edgeCount++;
14 }
15 //删除行
16 for(int k = i; k -1; ++k)
17 {
18 for(int j = 0; j 19 {
20 edge[k][j] = edge[k+1][j];
21 }
22 }
23 //删除列
24 for(int k = i; k -1; ++k)
25 {
26 for(int j = 0; j 27 {
28 edge[j][k] = edge[j][k+1];
29 }
30 }
31
32 curVertices--;
33 curEdges -= edgeCount;
34
35 return true;
36}
以上存在数组的大量