第六章——图(2)图的存储及基本操作


前言:
图没有顺序存储结构,但可以借助二维数组来表示元素之间的关系。
———数组表示法(邻接矩阵)

链式存储结构:
邻接表
②邻接多重表
③十字链表

一、邻接矩阵法

1.邻接矩阵的表示法
1.1定义

临街矩阵存储是指,用一个一维数组存储图中顶点信息,二维数组存储图中边的信息(即各顶点之间的邻接关系),存储顶点之间邻接关系的二维数组称为邻接矩阵。

对于带权图而言,若两顶点之间有边相连,则邻接矩阵中应该存放该边对应的权值,若不相连,则用∞来表示两点之间不存在的边。

1.2无向图邻接矩阵表示法

①无向图的邻接矩阵一定是一个对称矩阵(并且唯一)。因此,在实际存储邻接矩阵时只需存储上(或下)三角矩阵的元素。对规模较大的可采用压缩存储。
②对于无向图,邻接矩阵的第i行(或第i列)非零元素(或非元素)的个数正好是第i个顶点的度TD(v)。

1.3有向图邻接矩阵表示法

①顶点的出度:第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);
【用途】
邻接矩阵多用于稠密图,而邻接表多用于稀疏图

三、十字链表

十字链表是有向图的一种链式存储结构。
在这里插入图片描述

四、邻接多重表

五、图的基本操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值