携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情
图的数据存储结构
由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在内存中的物理位置来表示元素之间的关系,也就是说,图不可能用简单的顺序存储结构来表示。
考虑到图是由顶点和边或弧两部分组成。合在一起比较困难,那就很自然地考虑到分两个结构来分别存储。顶点不分大小,主次,所以用一个一维数组来储存是很不错的选择。而边或弧由于是顶点与顶点之间的关系,一维搞不定,那就考虑用一个二维数组来储存。于是邻接矩阵的方案就诞生了。
邻接矩阵
图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或者弧的信息
邻接矩阵->无向图
设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为
无向图的例子
邻接矩阵->有向图
有向图的例子
邻接矩阵->带权有向图
邻接表
当一个图为稀疏图时,使用邻接矩阵表示显然要浪费大量的存储空间,而图的邻接表法结合了顺序存储和链式存储方法,大大减少了这种不必要的浪费。
邻接表,是指对图G中的每一个顶点vi建立一个单链表,第i个单链表中的结点表示依附于顶点 vi的边(对于有向图则是以顶点vi为尾的弧),这个单链表就称为顶点vi的边表(对于有向图则称为出边表)。边表的头指针和顶点的数据信息采用顺序存储(成为顶点表),所以在邻接表中存在两种:顶点表结点和边表结点。
顶点表结点由顶点域(data)和指向第一条邻接边的指针(firstarc)构成,边表(邻接表)结点由邻接点域(adjvex)和指向下一条邻接边的指针域(nextarc)构成。
邻接表->无向图
邻接表->有向图
邻接表->带权
邻接矩阵 VS 邻接表 的对比