图的存储结构
图的存储结构
邻接矩阵
邻接矩阵(Adjacency Matrix)是表示顶点之间相邻关系的矩阵。
用邻接矩阵表示法表示图,除了一个用千存储邻接矩阵的二维数组外, 还需要用一个一维数 组来存储顶点信息。 其形式说明如下:
//-----图的邻接矩阵存储表示-----
#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;
采用邻接矩阵表示法创建无向网
【算法步骤】
- 输入总顶点数和总边数。
- 依次输入点的信息存入顶点表中。
- 初始化邻接矩阵,使每个权值初始化为极大值。
- 构造邻接矩阵。依次输入每条边依附的顶点和其权值,确定两个顶点在图中的位置之后, 使相应边赋予相应的权值,同时使其对称边赋予相同的权值。
【算法描述】
Status CreateUDN(AMGraph &G)
{//采用邻接矩阵表示法,创建无向网G
cin>>G.vexnum>>G.arcnum;
for(i=O;i<G.vexnum;++i)
cin>>G.vexs[i);
for(i=O;i<G.vexnum;++习
for (j =0; j <G. vexnum; ++j)
G.arcs[i) [j)=Maxint;
for(k=O;k<G.arcnum;++k)
{
cin>>vl>>v2>>w;
i=LocateVex(G,vl);j=LocateVex(G,v2); //确定vl和v2在G中的位置,即顶点数组的下标
G.arcs[i][j]=w; //边<vl, v2>的权值置为w
G.arcs[j] [i]=G.arcs[i][j];
}
return OK;
}
邻接矩阵表示法的优缺点
(1)优点 :便于判断两个顶点之间是否有边, 即根据A[i] [j]= 0或1来判断; 便于计算各个顶点的度。
(2) 缺点:不便于增加和删除顶点;不便于统计边的数目,需要扫描邻接矩阵所有元素才能统计完毕;空间复杂度高。
邻接表
邻接表(Adjacency List) 是图的一种链式存储结构。在邻接表中,对图中每个顶点Vi建立一个单链表,把与 Vi相邻接的顶点放在这个链表中。邻接表中每个单链表的第一个结点存放有关顶点的信息, 把这一结点看成链表的表头, 其余结点存放有关边的信息, 这样邻接表便由两部分组成:表头结点表和边表。
(1) 表头结点表:由所有表头结点以顺序结构的形式存储, 以便可以随机访问任一顶点的边链表。表头结点包括数据域 (data) 和链域 (firstarc) 两部分
(2)边表:由表示图中顶点间关系的 2n个边链表组成。 边链表中边结点包括邻接点域 (adjvex)、数据域 (info) 和链域 (nextarc) 三部分
邻接表存储结构说明如下:
//- - - - -图的邻接表存储表示- ----
#define MVNum 100 //最大顶点数
typedef struct ArcNode //边结点
{
int adjvex; //该边所指向的顶点的位置
struct ArcNode * nextarc; //指向下一条边的指针
Otherinfo info; //和边相关的信息
}ArcNode;
typedef struct VNode //顶点信息
{
VerTexType data; //指向第一条依附该顶点的边的指针
ArcNode *firstarc;
}VNode,AdjList[MVNum];
typedef struct
{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
邻接表表示法的优缺点
(1) 优点:
便于增加和删除顶点;
便于统计边的数目, 按顶点表顺序扫描 所有边表可得到边的数目,时间复杂度为 O(n + e) ;
空间效率高。对于一个具有n个顶点e条边的图 G, 若 G 是无向图,则在其邻接表表示 中有 n 个顶点表结点和 2e 个边表结点;若 G 是有向图,则在它的邻接表表示或逆邻接表表示中均有 n 个顶点表结点和e个边表结点。
(2)缺点 :
不便于判断顶点之间是否有边,要判定 Vi和vj之间是否有边,就需扫描第i个边表,最坏情况下要耗费 O(n)时间;
不便于计算有向图各个顶点的度。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程使用 AI 从 0 到 1 写了个小工具
· 快收藏!一个技巧从此不再搞混缓存穿透和缓存击穿
· AI 插件第二弹,更强更好用
· Blazor Hybrid适配到HarmonyOS系统
· 支付宝 IoT 设备入门宝典(下)设备经营篇