数据结构 —— 图的存储结构
2019-06-24 11:48
731 查看
一、邻接矩阵
- 一个图的邻接矩阵表示是唯一的。
- 适合于稠密图的存储。
- 邻接矩阵的存储空间为O(n^2)
- 邻接矩阵是图的顺序存储结构
- 顶点数组 —— 用一维数组存储顶点(元素)
- 邻接矩阵 —— 用二维数组存储顶点(元素)之间的关系(边或弧)
实现
顶点类型:
typedef struct { int no; // 顶点编号 char info; // 顶点的其他信息 }VertexType; // 顶点类型
图的邻接矩阵类型:
typedef struct { int edges[maxSize][maxSize]; // 边 int n,e; // 顶点数、边数 VertexType vex[maxSize]; // 存放结点信息 }MGraph; // 图的邻接矩阵类型
(1)无向图
A[i][j]=1A[i][j]=1A[i][j]=1 表示顶点 i 与顶点 j 邻接,即 i 与 j 之间存在边或弧
A[i][j]=0A[i][j]=0A[i][j]=0 表示顶点 i 与顶点 j 不邻接
(2)有向图
A[i][j]=权值A[i][j]=权值A[i][j]=权值 表示顶点 i 与顶点 j 邻接,即 i 与 j 之间存在边或弧
A[i][j]=∞A[i][j]=∞A[i][j]=∞ 表示顶点 i 与顶点 j 不邻接,其中 i≠j
A[i][j]=0A[i][j]=0A[i][j]=0 表示对角线的顶点,其中 i=j
二、邻接表
- 邻接表表示不唯一
- 适合于稀疏图存储。
- 邻接表的存储空间为0(n+e)
- 邻接表是链式存储结构
实现
边结点(表结点):
// 边结点 typedef struct { int info; // 该边的相关信息,如权值 ArcNode *nextarc; // 指向下一条边的指针 int adjvex; // 该边所指向结点的位置 }ArcNode;
头结点:
// 头结点 typedef struct { char data; // 顶点信息 ArcNode *firstarc; // 指向第一条边的指针 }VNode;
邻接表(用于存储头结点):
// 邻接表(用于存储头结点) typedef struct { VNode adjlist[maxSize]; // 邻接表 int n,e; // 顶点数和边数(度) }AGraph;
(1)无向图
(2)有向图
(3)有向网(带权图)
三、逆邻接表
四、有向图的十字链表
若有向图 G 有 n 个顶点 e 条弧,则需 n 个表头结点和 e 个表结点。
有向图 G 的十字链表,单链表的长度 = 入度+出度。
求顶点 vi 的出度和入度都只需遍历 vi 对应的单链表,统计结点值为 i 的结点数。
实现
边结点(表结点)
typedef struct ArcBox{ int tailvex,headvex;/该弧的尾和头顶点的位置 struct ArcBox*hlink,*tlink;//分别为弧头(尾邻接表)相同和弧尾(邻接表)相同的弧的链域 }ArcBox;
头结点
typedef struct VexNode{ VertexType data; ArcBox*firstin,*firstout;//分别指向该顶点的第一条入弧和出弧 }VexNode;
十字链表
typedef struct{ VexNode xlist[MAX_VERTEXT_NUM];//表头向量int vexnum,arcnum;/有向图的当前顶点数和弧数 }OLGraph;
五、邻接多重表(无向图)
实现
边结点(表结点)
typedef enum{unvisited,visited}visitedIf;typedef struct EBox{ visitedIf mark;//访问标记 intivex,jvex;/该边依附的两个顶点的位置 struct EBox*ilink,*jlink;//分别指向依附于这两个顶点的下一条边 }EBox;
头结点
typedef struct VexBox{ VertexType data; EBox*firstedge;//指向第一条依附于该顶点边 }VexBox;
邻接多重表
typedef struct{ VexBox adjmullist[MAX_VERTEXT_NUM]; intvexnum,edgenum;//无向图的当前顶点数和边数 }AMLGraph;
相关文章推荐
- 数据结构课程设计之银行活期存储系统(设计报告)
- HBase介绍(2)---数据存储结构
- 数据结构——单向链表的顺序存储及实现
- 哈希表存储数据结构原理
- ElasticSearch 使用不同表结构存储时间序列数据的查询效率分析
- 数据结构1——线性表链式存储 java
- 几种数据存储结构详解
- 数据结构——简单线性表(顺序存储)
- 数据结构之图(存储结构、遍历)
- 数据结构之图(存储结构、遍历)
- oracle数据存储结构(基础)
- 标准功能模块组件 -- “文档管理组件,网络文档管理,网络存储”,B/S版本组件可独立运行,也可集成到其他项目里,数据结构清晰思路严谨
- 数据结构基础二-----之模块一《线性存储【数组】》
- 数据结构之---C语言实现串的块链存储表示
- 数据结构之线性表的几种主要存储
- 数据结构之线性表代码实现顺序存储,链式存储,静态链表(选自大话数据结构)
- HP-lefthand底层结构详解及存储灾难数据恢复
- 数据结构(8):二叉树的存储结构
- 一种理想的在关系数据库中存储树型结构数据的方法
- 数据的4种逻辑结构与4种存储结构