图的存储结构



一、图的定义

在计算机科学中,一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。顶点用圆圈表示,边就是这些圆圈之间的连线。顶点之间通过边连接。

二、图的基本术语

无向图:每条边都是无方向的
有向图:每条边都是有方向的
完全图:任意两个点都有一条边相邻
稀疏图:有很少边或弧的图
稠密图:有较多边或弧的图
网:边、弧带权的图
邻接:有边、弧相邻的两个顶点之间的关系
关联:边、弧与顶点之间的关系
顶点的度:与该顶点相关联的边的数目
路径:接续的边构成的顶点序列
路径长度:路径上边或弧的数目、权值之和
回路:第一个顶点和最后一个顶点之间的路径
简单路径:除路径起点和终点可以相同外,其余顶点均不相同的路径
简单回路:除路径起点和终点相同外,其与定点均不相同的路径
连通图:在有(无)向图G中,若对任何两个顶点u、v都存在从v的路径,则称G为连通图
权与网:图中边与弧所具有的相关数称为权,表明从一个顶点到另一个顶点的距离或耗费
子图:设有两个图G=(V,{E})、G1(V1,{E1}),若V1属于V,E1属于E,则称G1是G的子图
连通分量:无向图G的极大连通子图称为G的连通分量

三、图的类型定义

代码如下:

ADT Graph{
	数据对象V:具有相同特性的数据元素的集合,则称为顶点集
	数据关系R:R={VR}
}

四、图的存储结构

1、数组(链接矩阵)表示法

(1)建立一个定点表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点之间的关系)
(2)设置A=(V,E)有n个结点
(3)图的邻接矩阵是一个二维数组
代码如下:

#define MVNum 100
typedef char VerTexType;
typedef int ArcType;
typedef struct{
	VerTexType vexs[MVNUM];
	ArctYPE ARCS[MVNum][MVnum];
	int vexnum,arcnum;
}AMGraph

缺点:(1)不便于增加和删除顶点
(2)浪费空间,稀疏图有大量无效元素
(3)浪费时间,统计稀疏图中有多少边
(4)不便于增加和删除顶点

2、链接表表示法

(1)输入总顶点数和总边数
(2)建立顶点表,一次输入点的信息存入顶点表中,使每个表头结点的指针域初始化为NULL
(3)创建邻接表,一次输入每条边依附的两个顶点,确定两个顶点的序号i和j,建立边结点,将此边结点分别插入到vi和vj对应的两个边链表的头部
代码如下:

typedef struct VNode{
	VerTexType data;
	ArcNode *firstarc;
}VNode,AdjList[MVNum];
Status CreatUDG(ALGraph &G){
	cin>>G.vexnum>>G.arcnum;
	for(i=0;i<G.vexnum;i++){
		cin>>G.vertices[i].data;
		G.vertices[i].firstarc=NULL;
	}
	for(k=0;k<G.arcnum;++k){
		cin>>v1>>v2;
		j=LocalVex(G,v1);
		j=LocateVex(G,v2);
	}
}

区别:(1)对于任何一个确定的无向图,邻接矩阵是唯一的,但邻接表不唯一。
(2)链接矩阵的空间复杂度是O(n^2),而邻接表是O(n+e)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值