数据结构学习:图的存储
图的存储:
邻接矩阵法:
#define MaxVertexNum 100 //顶点数的最大值
typedef struct
{
char Vex[MaxVertexNum]; //顶点表
int Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵,边表
int vexnum,arcnum; //图的当前顶点数和边数
}MGraph;
第i个结点的度 = (邻接矩阵中)第i行(或第i列)的非零元素个数
有向图中
第i个结点的出度 = 第i行的非零元素个数
第i个结点的入度 = 第i列的非零元素个数
第i个结点的度 = 第i行、第i列的非零元素个数之和
空间复杂度:O(|V|^2 ) ——只和顶点数相关,和实际的边数无关
适合用于存储稠密图
无向图的邻接矩阵是对称矩阵,可以压缩存储(只存储上三角区/下三角区)
设图G的邻接矩阵为A(矩阵元素为0/1),则A^n 的元素A^n [i][j]等于由顶点i到顶点j的长度为n的路径的数目
Eg:
矩阵相乘
结果为:路径长度为2的数目
路径长度为3的数目
邻接表法:
// 用邻接表存储图
//边
typedef struct ArcNode
{
int adjvex; //边指向哪个结点
struct ArcNode *next;//指向下一条弧的指针
}ArcNode;
// 顶点
typedef struct VNode
{
VertexType data; //顶点信息
ArcNode *first; //第一条边
}VNode,AdjList[MaxVertexNum];
// 用邻接表存储图
typedef struct
{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
十字邻接表(有向图)
空间复杂度:O(|V|+|E|)
弧的结构体
顶点结构体
Eg:
绿色为指向,橙色为被指向
如何找到指定顶点的所有出边?——顺着绿色线路找
如何找到指定顶点的所有入边?——顺着橙色线路找
注意:十字链表只用于存储有向图
邻接多重表存储无向图
Eg:
空间复杂度:O(|V|+|E|)
删除边、删除节点等操作很方便
注意:邻接多重表只适用于存储无向图