图的存储

图的存储

  1. 邻接矩阵
  2. 邻接表
  3. 十字链表
  4. 邻接多重表

邻接矩阵法

#define MaxVertexNum 100 //顶点数目的最大值
typedef struct{
char Vex[MaxVertexNum]; //顶点表
int Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表
int vexnum,arcnum;//图的当前顶点数和边数/弧数
}MGraph;

顶点中可以存更加复杂的信息

可以用bool型或枚举型变量表示边。

int——4B or 8B

bool——1B

邻接矩阵法存储带权图(网)

#define MaxVertexNum 100 //顶点数目的最大值
#define INFINITY //宏定义常量“无穷”
typedef char VertexType; //顶点的数据类型
typedef int EdgeType;
typedef struct{
VertexType Vex[MaxVertexNum];
EdgeType Edge[MaxVertexNum][MaxVertexNum];
int vexnum,arcnum;
}

如何定义“无穷”

邻接矩阵的性能分析

空间复杂度:

O(|v|2)

只和顶点数相关,和实际的边数无关

只适用于存储稠密图

无向图的邻接矩阵是对称矩阵,可以压缩存储

邻接矩阵法的性质

从1(A)-4(D)长度为2的路径有几条。

知识回顾

数据实现的顺序存储,空间复杂度高,不适合存储稀疏图。

邻接表法(顺序表+链式存储)

无向图:

//“顶点”
typedef struct VNode{
VertexType data; //顶点信息
ArcNode *first; //第一条边/弧
}VNode,AdjList[MaxVertexNum];
//用邻接表存储的图
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
//“边/弧”
typedef struct ArcNode{
int adjvex; //边/弧指向哪个节点
struct ArcNode *next; //指向下一条弧的指针
//InfoType info; //边权值
}ArcNode;

表示方法不唯一

有向图:

十字链表法(存储有向图)

空间复杂度:O(|V|+|E|)

出边:顺着绿色线找

入边:顺着橙色线找

十字链表发只能存储用向图

邻接多重表(存储无向图)

删除结点

本文作者:Jev_0987

本文链接:https://www.cnblogs.com/jev-0987/p/13210240.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Jev_0987  阅读(162)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起