通常,图更多的是采用链表存储,具体的存储方法有 3 种,分别是邻接表、邻接多重表和十字链表。

本节先讲解图的邻接表存储法。邻接表既适用于存储无向图,也适用于存储有向图。

在具体讲解邻接表存储图的实现方法之前,先普及一个"邻接点"的概念。在图中,如果两个点相互连通,即通过其中一个顶点,可直接找到另一个顶点,则称它们互为邻接点。

邻接指的是图中顶点之间有边或者弧的存在。

邻接表存储图的实现方式是,给图中的各个顶点独自建立一个链表,用节点存储该顶点,用链表中其他节点存储各自的临界点。

与此同时,为了便于管理这些链表,通常会将所有链表的头节点存储到数组中(也可以用链表存储)。也正因为各个链表的头节点存储的是各个顶点,因此各链表在存储临界点数据时,仅需存储该邻接顶点位于数组中的位置下标即可。

例如,存储图 1a) 所示的有向图,其对应的邻接表如图 1b) 所示:

图 1 邻接表存储有向图

拿顶点 V1 来说,与其相关的邻接点分别为 V2 和 V3,因此存储 V1 的链表中存储的是 V2 和 V3 在数组中的位置下标 1 和 2。

从图 1 中可以看出,存储各顶点的节点结构分为两部分,数据域和指针域。数据域用于存储顶点数据信息,指针域用于链接下一个节点,如图 2 所示:

图 2 邻接表节点结构

在实际应用中,除了图 2 这种节点结构外,对于用链接表存储网(边或弧存在权)结构,还需要节点存储权的值,因此需使用图 3 中的节点结构:

图 3 邻接表存储网结构使用的节点

图 1 中的链接表结构转化为对应 C 语言代码如下:

#define MAX_VERTEX_NUM 20//最大顶点个数

#define VertexType int//顶点数据的类型

#define InfoType int//图中弧或者边包含的信息的类型

typedef struct ArcNode{

int adjvex;//邻接点在数组中的位置下标

struct ArcNode * nextarc;//指向下一个邻接点的指针

InfoType * info;//信息域

}ArcNode;

typedef struct VNode{

VertexType data;//顶点的数据域

ArcNode * firstarc;//指向邻接点的指针

}VNode,AdjList[MAX_VERTEX_NUM];//存储各链表头结点的数组

typedef struct {

AdjList vertices;//图中顶点的数组

int vexnum,arcnum;//记录图中顶点数和边或弧数

int kind;//记录图的种类

}ALGraph;

邻接表计算顶点的出度和入度

使用邻接表计算无向图中顶点的入度和出度会非常简单,只需从数组中找到该顶点然后统计此链表中节点的数量即可。

而使用邻接表存储有向图时,通常各个顶点的链表中存储的都是以该顶点为弧尾的邻接点,因此通过统计各顶点链表中的节点数量,只能计算出该顶点的出度,而无法计算该顶点的入度。

对于利用邻接表求某顶点的入度,有两种方式:

遍历整个邻接表中的节点,统计数据域与该顶点所在数组位置下标相同的节点数量,即为该顶点的入度;

建立一个逆邻接表,该表中的各顶点链表专门用于存储以此顶点为弧头的所有顶点在数组中的位置下标。比如说,建立一张图 1a) 对应的逆邻接表,如图 4 所示:

图 4 逆邻接表示意图

对于具有 n 个顶点和 e 条边的无向图,邻接表中需要存储 n 个头结点和 2e 个表结点。在图中边或者弧稀疏的时候,使用邻接表要比前一节介绍的邻接矩阵更加节省空间。

mysql 邻接表_图的邻接表存储结构详解相关推荐

  1. 数据结构图,图存储结构详解

    1. 数据结构的图存储结构 我们知道,数据之间的关系有 3 种,分别是 "一对一"."一对多" 和 "多对多",前两种关系的数据可分别用线性 ...

  2. mysql数据库存储引擎和索引的描述_Mysql InnoDB引擎的索引与存储结构详解

    前言 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的. 而MySql数据库提供了多种存储引擎.用户可以根据不同的需求为数据表选择不同的存储引擎,用户也 ...

  3. sql 取两个表_图撕SQL表联结

    从SQL调数据的时候,往往我们需要的字段并不在一个表里面,很多时候它们分布在不同的表里面,这时候就需要用到多表查询. 常见的几种表联结的方法,比如内联结(inner join).左联结也叫左外联结(l ...

  4. 图的十字链表存储法详解

    前面介绍了图的邻接表存储法,本节继续讲解图的另一种链式存储结构--十字链表法. 与邻接表不同,十字链表法仅适用于存储有向图和有向网.不仅如此,十字链表法还改善了邻接表计算图中顶点入度的问题. 十字链表 ...

  5. mysql innodb 并行_关于MySQL8.0 InnoDB并行执行的详解

    概述 MySQL经过多年的发展已然成为最流行的数据库,广泛用于互联网行业,并逐步向各个传统行业渗透.之所以流行,一方面是其优秀的高并发事务处理的能力,另一方面也得益于MySQL丰富的生态.MySQL在 ...

  6. 大商创MySQL不支持_大商创配置文件config.php详解

    大商创配置文件config.php在data目录下,config.php配置文件主要用于配置数据库.//database host $db_host = "localhost:3306&qu ...

  7. mysql分区并行执行_关于MySQL8.0 InnoDB并行执行的详解

    概述 MySQL经过多年的发展已然成为最流行的数据库,广泛用于互联网行业,并逐步向各个传统行业渗透.之所以流行,一方面是其优秀的高并发事务处理的能力,另一方面也得益于MySQL丰富的生态.MySQL在 ...

  8. 单片机断电后静态存储区里面还有数据吗_单片机启动流程和存储架构详解

    最近在给公司的ADAS DCU做内存分配(Memory Allocation),在这儿记录一下相关知识点,也算是给中文社区做贡献了. 目录: 1. ECU启动流程 2. 存储空间解析 3. TC397 ...

  9. 永磁同步电机三相等效电路图_永磁同步电动机的原理与结构详解

    近些年永磁同步电动机得到较快发展,其特点是功率因数高.效率高,在许多场合开始逐步取代最常用的交流异步电机,其中异步起动永磁同步电动机的性能优越,是一种很有前途的节能电机. 永磁同步电动机 永磁同步电动 ...

最新文章

  1. mysql if语句 oracle,Oracleifelse语句的写法实例
  2. 面向接口编程详解(一)—— 思想基础
  3. 海史密斯适应型领导力
  4. eureka源码:EurekaTransport类用于client与server进行交互
  5. 【转】文件读写NDK(或Linux)
  6. 代码质量在「内卷时代」的重要性
  7. Spring Boot 与 Java 对应版本,以下表格由官方网站总结。
  8. 长沙计算机中级职称分数公布,大家所期待的2020年湖南省长沙中级职称评审公示...
  9. 仓库盘点作业流程仓库盘点步骤使用汉码盘点机进行盘点方法
  10. 计算机专业毕业顶岗实习周记,计算机专业毕业顶岗实习周记10篇参考).doc
  11. 技术管理进阶——什么是影响力
  12. minitools在win10上安装失败
  13. 我是一个没有感情的杀手
  14. 数据挖掘考前30分钟必看(2.0版本)
  15. 【软考】【系统架构设计师】最小生成树知识点
  16. 日历控件兼容IE,firefox,google等多种浏览器
  17. eclipse refreshing external folders解决方案
  18. 米斯特web安全培训第一期课程目录
  19. c语言学习之转义字符
  20. 新冠肺炎数据:美国霍普金斯大学

热门文章

  1. maven工程找不到jar包(依赖)的解决方法
  2. 在使用Navicat for MySQL 出现 异常“You have an error in your SQL syntax......“
  3. 电脑打开任务管理器的方法有哪几种
  4. python pip升级报错
  5. SharedPreferences的使用,android
  6. 利用旧服务器制作存储资源池,想将存储系统整合,又想实现存储资源池化?
  7. 对象tostring后怎么转成对象_和女生相亲后怎么联系对方?和相亲对象该如何聊天...
  8. dataframe切片_Kaggle:识别淋巴结病理切片有无癌细胞(logistic+svm+rf+CNN)
  9. android 面向对象,android 面向对象六大原则
  10. 移动机器人场景应用对比分析