文章目录
前言:
图没有顺序存储结构,但可以借助二维数组来表示元素之间的关系。
———数组表示法(邻接矩阵)
链式存储结构:
①邻接表
②邻接多重表
③十字链表
一、邻接矩阵法
1.邻接矩阵的表示法
![](https://img-blog.csdnimg.cn/20201202113947939.png)
1.1定义
临街矩阵存储是指,用一个一维数组存储图中顶点信息,二维数组存储图中边的信息(即各顶点之间的邻接关系),存储顶点之间邻接关系的二维数组称为邻接矩阵。
对于带权图而言,若两顶点之间有边相连,则邻接矩阵中应该存放该边对应的权值,若不相连,则用∞来表示两点之间不存在的边。
1.2无向图邻接矩阵表示法
![](https://img-blog.csdnimg.cn/20201202114100708.png)
①无向图的邻接矩阵一定是一个对称矩阵(并且唯一)。因此,在实际存储邻接矩阵时只需存储上(或下)三角矩阵的元素。对规模较大的可采用压缩存储。
②对于无向图,邻接矩阵的第i行(或第i列)非零元素(或非元素)的个数正好是第i个顶点的度TD(v)。
1.3有向图邻接矩阵表示法
![](https://img-blog.csdnimg.cn/20201202114100708.png)
①顶点的出度:第i行元素之和
②顶点的入度:第i列元素之和
③顶点的度:第i行元素之和+第i列元素之和
1.4网及其邻接矩阵表示法
1.5注意点总结
④用邻接矩阵法存储图,很容易确定图中任意两个顶点之间是否有边相连。但是,要确定图中有多少条边,则必须按行、按列对每个元素进行检测,所花费的时间代价很大。
⑤稠密图适合使用邻接矩阵的存储表示。
⑥设图G的邻接矩阵为A,A"的元素A"[i][j]等于由顶点i到顶点j的长度为n的路径的数目。
2.邻接矩阵的建立
2.1邻接矩阵的存储表示
用两个数组分别存储顶点表和邻接矩阵
#define MaxInt 32767 //表示极大值∞
#define MVNum 100 //最大顶点数
typedef char VerTexType; //假设顶点的类型为字符型
typedef int ArcType;//假设边的权值类型为整形
typedef struct
{
VerTexType vexs[MVNum];//顶点表
ArcType arcs[MVNum][MVNum];//邻接矩阵
int vexnum,arcnum;//图当前的点数和边数
}AMGraph;
2.2邻接矩阵的优缺点
优点:
① 便于判断两个顶点之间是否有边,即根据A[i][j]=0或1来判断。
② 便于计算各个顶点的度。
缺点:
① 不便于增加和删除顶点。
② 不便于统计边的数目,需要扫描邻接矩阵所有元素才能统计完毕,时间复杂度为O(n^2)。
③ 空间复杂度高。邻接矩阵表示法的空间复杂度均为O(n^2),这对于稀疏图而言尤其浪费空间。
二、邻接表法
1.1邻接表的引入
当一个图为稀疏图时,使用邻接矩阵法显然要浪费大量的存储空间,而图的邻接表法结合了顺序存储和链式存储方法,大大减少了这种不必要的浪费。
1.2图的邻接表存储结构定义
//图的邻接表存储结构定义
#define MaxVertexNum 100; //图中顶点数目的最大值
typedef struct ArcNode{ //边结点
int adjvex; //改变所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条边的指针
//OtherInfo info; //其他信息
}
typedef struct VNode{
VerTexType data;//顶点信息
ArcNode *firstarc; //指向第一条依附该顶点的指针
}VNode,AdjList[MVNum]; //AdjList表示邻接表类型
typedef struct{
AdjList vertices; //图的当前顶点数和边数
int vexnum,arcnum;
}ALGraph;
1.3图的邻接表存储特点
①若G为无向图,则所需的存储空间为O(|V|+ 2|E|);若G为有向图,则所需的存储空间为O(|V|+|E|)。前者的倍数2是由于无向图中,每条边在邻接表中出现了两次。
②节约稀疏图存储空间;
③不方便检查任意一对顶点是否存在边;
④方便找任一顶点的所有邻接点;’
⑤方便计算任一顶点的“度”?
对无向图:是的
对于有向图:只能计算出度,需要构造“逆邻接表”来计算入度。
1.4邻接表和邻接矩阵之间的关系
【联系】
邻接表中每个链表对应于邻接矩阵的一行,链表中结点的个数等于一行中非零元素的个数。
【区别】
①对于任一确定的无向图,邻接矩阵是唯一的,但其邻接表表示不唯一;(链接次序与定点编号无关)
②邻接矩阵的空间复杂度O(n^2),而邻接表的空间复杂度是O(n+e);
【用途】
邻接矩阵多用于稠密图,而邻接表多用于稀疏图
三、十字链表
十字链表是有向图的一种链式存储结构。