首页 > 其他 > 详细

图的存储

时间:2020-06-29 21:05:10      阅读:120      评论:0      收藏:0      [点我收藏+]

图的存储

  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|)

出边:顺着绿色线找

入边:顺着橙色线找

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

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

技术分享图片

技术分享图片

删除结点

技术分享图片

技术分享图片

技术分享图片

图的存储

原文:https://www.cnblogs.com/jev-0987/p/13210240.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!