原文链接:http://andy100861.blog.163.com/blog/static/98551191200992202558438/
图的存储结构
图的存储结构除了要存储图中各个顶点的本身的信息外,同时还要存储顶点与顶点之间的所有关系(边的信息),因此,图的结构比较复杂,很难以数据元素在存储区中的物理位置来表示元素之间的关系,但也正是由于其任意的特性,故物理表示方法很多。常用的图的存储结构有邻接矩阵、邻接表、十字链表和邻接多重表。
8.2.1邻接矩阵表示法
对于一个具有n个顶点的图,可以使用n*n的矩阵(二维数组)来表示它们间的邻接关系。图8.10和图8.11中,矩阵A(i,j)=1表示图中存在一条边(Vi,Vj),而A(i,j)=0表示图中不存在边(Vi,Vj)。实际编程时,当图为不带权图时,可以在二维数组中存放bool值,A(i,j)=true表示存在边(Vi,Vj),A(i,j)=false表示不存在边(Vi,Vj);当图带权值时,则可以直接在二维数组中存放权值,A(i,j)=null表示不存在边(Vi,Vj)。
图8.10所示的是无向图的邻接矩阵表示法,可以观察到,矩阵延对角线对称,即A(i,j)= A(j,i)。无向图邻接矩阵的第i行或第i列非零元素的个数其实就是第i个顶点的度。这表示无向图邻接矩阵存在一定的数据冗余。
图8.11所示的是有向图邻接矩阵表示法,矩阵并不延对角线对称,A(i,j)=1表示顶点Vi邻接到顶点Vj;A(j,i)=1则表示顶点Vi邻接自顶点Vj。两者并不象无向图邻接矩阵那样表示相同的意思。有向图邻接矩阵的第i行非零元素的个数其实就是第i个顶点的出度,而第i列非零元素的个数是第i个顶点的入度,即第i个顶点的度是第i行和第i列非零元素个数之和。
由于存在n个顶点的图需要n2个数组元素进行存储,当图为稀疏图时,使用邻接矩阵存储方法将出现大量零元素,照成极大地空间浪费,这时应该使用邻接表表示法存储图中的数据。
8.2.2 邻接表表示法
图的邻接矩阵存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构。邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点。如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中。如图8.12所示,表结点存放的是邻接顶点在数组中的索引。对于无向图来说,使用邻接表进行存储也会出现数据冗余,表头结点A所指链表中存在一个指向C的表结点的同时,表头结点C所指链表也会存在一个指向A的表结点。
有向图的邻接表有出边表和入边表(又称逆邻接表)之分。出边表的表结点存放的是从表头结点出发的有向边所指的尾顶点;入边表的表结点存放的则是指向表头结点的某个头顶点。如图8.13所示,图(b)和(c)分别为有向图(a)的出边表和入边表。
以上所讨论的邻接表所表示的都是不带权的图,如果要表示带权图,可以在表结点中增加一个存放权的字段,其效果如图8.14所示。
【注意】:观察图8.14可以发现,当删除存储表头结点的数组中的某一元素,有可能使部分表头结点索引号的改变,从而导致大面积修改表结点的情况发生。可以在表结点中直接存放指向表头结点的指针以解决这个问题(在链表中存放类实例即是存放指针,但必须要保证表头结点是类而不是结构体)。在实际创建邻接表时,甚至可以使用链表代替数组存放表头结点或使用顺序表存代替链表存放表结点。对所学的数据结构知识应当根据实际情况及所使用语言的特点灵活应用,切不可生搬硬套。
相关推荐
数据结构串的存储结构程序 数据结构是计算机科学中的一门重要课程,本程序是数据结构中串的存储结构的一个实现。串是由零个或多个字符组成的有限序列,串的存储结构是指如何将串存储在计算机中,以便于后续的操作。...
在数据结构实验报告中,线性表的存储结构被分为两大类:顺序存储结构和链式存储结构。 顺序存储结构(Sequential Storage Structure)是将线性表中的元素按顺序存储在一个连续的内存空间中。线性表的顺序存储结构...
图的存储结构和遍历 一、图的存储结构 图的存储结构是指将图结构存储在计算机中的方法。常见的图存储结构有两种:邻接矩阵存储法和邻接表存储法。 1. 邻接矩阵存储法 邻接矩阵存储法是将图的节点之间的关系存储...
在本主题中,我们将深入探讨线性表的两种主要存储结构:顺序存储结构和链式存储结构,以及在这两种结构上实现的基本操作。同时,我们还会涉及栈这种特殊类型的线性表及其顺序和链式存储结构。 一、线性表的顺序存储...
数据结构实验报告2线性表的链式存储结构 本实验报告的主要内容是介绍线性表的链式存储结构,并通过编程实验来掌握线性表的逻辑结构和链式存储结构,以及单链表的基本算法。 一、线性表的概念 线性表是最基本的...
1.基于顺序存储结构的图书信息表的创建和输出 问题描述定义一个包含图书信息 (书号、书名、价格)的顺序表,读入相应的图书数据来完成图书信息表的创建。然后,统计图书表中的图书个数,同时逐行输出每本图书的信息。...
### 数据结构中常用的逻辑结构和存储结构 #### 一、概念概述 数据结构是指在计算机科学中用于组织和管理数据的方式。它不仅涉及到数据本身的组成,还包括这些数据之间的关系、如何存储这些数据以及如何对数据进行...
数据结构课程设计之二叉树采用二叉链表作为存储结构 本课程设计的主要任务是设计并实现一个二叉树的存储结构,使用二叉链表作为存储结构,并实现按层次顺序遍历二叉树的算法。下面是本设计的详细解释和实现过程: ...
比较顺序存储和链接存储两种存储结构的有缺点 顺序存储和链接存储是两种常见的存储结构,在实现线性表时都有其优缺点。下面我们将详细比较这两种存储结构的优缺点,并说明其适用场合。 顺序存储 顺序存储是一种...
### 头歌数据结构图的邻接矩阵存储及遍历操作 #### 一、邻接矩阵存储 在数据结构中,图是一种常见的非线性结构,用于表示对象间的关系。根据边是否有方向,图可以分为有向图和无向图。而根据边是否具有权重值,又...
"二叉树的逻辑结构和存储结构" 本节主要讨论二叉树的逻辑结构和存储结构,并对其进行遍历操作。二叉树是一种常见的数据结构,它广泛应用于计算机科学和信息技术领域。 二叉树的逻辑结构 二叉树是指每个结点最多有...
### 二、头歌数据结构图的邻接表存储 #### 1. 数据类型定义 - **顶点类型**:`VertexType` 定义为一个字符数组,用于存储顶点的名称。 - **图的种类**:`GraphKind` 定义了四种类型的图:有向图 (DG)、有向网 (DN)...
数据结构 - 图的存储结构 - 邻接表的创建 - 无向图。 在数据结构中,图是一种非常重要的数据结构,它广泛应用于计算机科学和信息技术领域中。在本节中,我们将讨论图的存储结构,并使用 C 语言实现图的邻接表的创建...
要求选用顺序存储结构和二叉链表存储结构实现抽象数据类型二叉树的基本操作。有个亮点是利用字符在dos界面显示二叉树的结构形态。 里面包含了完整的源程序和实验报告文档。 实验报告包含了完整的步骤包括: 一.抽象...
在本节《数据结构》5.3树的存储结构中,首先介绍了树的数据存储结构的相关概念。树作为一种非线性数据结构,其数据存储方式有别于一般的线性结构,主要通过以下几种方法实现: 1. 顺序存储结构:顺序存储结构通常是...
本PPT讲解了Oracle数据库的逻辑存储结构、物理存储结构,以及在界面操作下的数据库创建
线性表的链式存储结构是一种在计算机科学中常见的数据结构实现方式,它与顺序存储结构有所不同。在链式存储结构中,线性表的数据元素并不必须存储在连续的内存位置,而是通过链接指针来建立逻辑上的顺序关系。每个...
本文将对数据结构的逻辑结构和存储结构进行讨论,并对数学知识点进行总述。 一、数据结构的逻辑结构与存储结构 在计算机科学中,数据结构的逻辑结构和存储结构是两种不同的概念。逻辑结构指的是数据结构的组织方式...
链式存储结构是数据结构中的一个重要概念,它与数组存储结构相对,提供了更加灵活的数据存储方式。本篇将深入探讨链式存储结构的基本算法及其在“DATASTRU.H”和“第3章-链式存储结构”中的应用。 链式存储结构的...