图的存储邻接矩阵邻接表十字链表以及邻接多重表相关方法(C语言)
Posted bfhonor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图的存储邻接矩阵邻接表十字链表以及邻接多重表相关方法(C语言)相关的知识,希望对你有一定的参考价值。
一、图的存储
(一)邻接矩阵(数组实现的顺序存储,空间复杂度高,不适合存储稀疏图)
#define MaxVertexNum 100 //顶点数目的最大值
typedef struct{
char Vex[MaxVertexNum]; //顶点表,顶点中可以存更复杂的信息。
int Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵,边表;可以用bool型或枚举型变量表示边。
int vexnum,arcnum; //图的当前顶点数和边数/弧数
}MGraph;
- 第i个结点的度 = 第i行(或第i列)的非零元素个数。
- 第i个结点的出度 = 第i行的非零元素个数
- 第i个结点的入度 = 第i列的非零元素个数
- 第i个结点的度 = 第i行、第i列的非零元素个数之和
- 邻接矩阵法求顶点的度/出度/入度的时间复杂度为
O(|V|)
1. 邻接矩阵法存储带权图(网)
#define MaxVertexNum 100 //顶点数目的最大值
#define INFINITY 最大的int值 //宏定义常量“无穷”,❗❗❗用int的上限值表示无穷。❗❗❗
typedef char VertexType; //顶点的数据类型
typedef int EdgeType; //带权图中边上权值的数据类型
typedef struct{
VertexType Vex[MaxVertexNum]; //顶点
EdgeType Edge[MaxVertexNum][MaxVertexNum];//边的权
int vexnum,arcnum; //图的当前顶点数和弧数
}MGraph;
2. 邻接矩阵法的性能分析
空间复杂度:O(|V|2) ——只和顶点数相关,和实际的边数无关
- 适合用于
存储稠密图
- 无向图的邻接矩阵是对称矩阵,可以压缩存储(只存储上三角区/下三角区)
3. 邻接矩阵法的性质
(二)邻接表(顺序+链式存储)
//边/弧
typedef struct ArcNode{
int adjvex; //边/弧指向拿个结点
struct ArcNode *next; //指向下一条弧的指针
//InfoType info; //边权值
}ArcNode;
//顶点
typdef struct VNode{
VertexType data; //顶点信息
ArcNode *first; //第一条边/弧
}VNode,AdjList[MaxVertexNum];
//用邻接表存储的图
typedef struct{
AdjKist vertices;
int vexnum,arcnum;
}ALGraph;
- 无向图:边结点的数量是
2|E|
,整体空间复杂度为O(|V| + 2|E|)
- 有向图:边结点的数量是
|E|
,整体空间复杂度为O(|V| + |E|)
(三)十字链表
1. 邻接矩阵、邻接表存储有向图
2. 十字链表存储有向图
3. 十字链表法性能分析
空间复杂度:O(|V|+|E|)
- 如何找到指定顶点的所有出边?——顺着绿色线路找
- 如何找到指定顶点的所有入边?——顺着橙色线路找
- 注意:十字链表只用于存储有向图
(四)邻接多重表
1. 邻接矩阵、邻接表存储无向图
2. 邻接多重表存储无向图
空间复杂度:O(|V|+|E|)
- 删除边、删除节点等操作很方便
- 注意:邻接多重表只适用于存储无向图
二、图的基本操作
-
Adjacent(G,x,y)
:判断图G是否存在边<x, y>或(x, y)。
-
Neighbors(G,x)
:列出图G中与结点x邻接的边。
-
InsertVertex(G,x)
:在图G中插入顶点x。【有向图也类似】
-
DeleteVertex(G,x)
:从图G中删除顶点x。
-
AddEdge(G,x,y)
:若无向边(x, y)或有向边<x, y>不存在,则向图G中添加该边。【有向图也类似】
-
RemoveEdge(G,x,y)
:若无向边(x, y)或有向边<x, y>存在,则从图G中删除该边。【有向图也类似】
①、邻接矩阵O(1)。②、邻接表O(1)~O(|V|) -
FirstNeighbor(G,x)
:求图G中顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1。
NextNeighbor(G,x,y)
:假设图G中顶点y是顶点x的一个邻接点,返回除y之外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1。
①、邻接矩阵O(1)~O(|V|)。②、邻接表O(1)Get_edge_value(G,x,y)
:获取图G中边(x, y)或<x, y>对应的权值。Set_edge_value(G,x,y,v)
:设置图G中边(x, y)或<x, y>对应的权值为v。
以上是关于图的存储邻接矩阵邻接表十字链表以及邻接多重表相关方法(C语言)的主要内容,如果未能解决你的问题,请参考以下文章