——本节内容为Bilibili王道考研《数据结构》P57视频内容笔记。
目录
一、十字链表法
1.缘起
存储有向图时,邻接表计算入度不方便、邻接矩阵空间复杂度高,采用十字链表法来一举解决这两个问题;
2.图解
(1)这种方法需要定义两个结构体,一个是顶点结构体(上图左半部分),一个是弧的结构体(上图右半部分);
(2)顶点结点包括:数据域、该顶点作为弧头的第一条弧、作为结尾的第一条弧;
(3)弧结点包括:弧尾顶点编号、弧头顶点编号、权值、弧头相同的下一条弧、弧尾相同的下一条弧;
(4)这里的十字链表读者可以自行动手画一遍易理解,以上图为例,画的顺序为:
①四个顶点结点;
②七个弧结点;
③按照说明、从上往下开始依次连接顶点结点的firstin、firstout;
④按照说明、从上往下、从左往右依次连接弧结点的hlink、tlink;
3.出度、入度
(1)从顶点结点的firstout开始往后找所有相连的tlink,就会找到该顶点所有发散的弧,即出度;
(2)从顶点结点的firstin开始往后找所有相连的hlink,就会找到该顶点所有收敛的弧,即入度;
4.性能分析
(1)空间复杂度为:O(|V|+|E|);
(2)十字链表法只能用于存储有向图;
二、邻接多重表
1.缘起
存储无向图时,邻接矩阵空间复杂度高;邻接表每条边对应两份冗余信息,删除顶点和边等操作时间复杂度高,采用邻接多重表来解决;
2.图解
(1)这种方法需要定义两个结构体,一个是顶点结构体(上图左半部分),一个是边的结构体(上图右半部分);
(2)顶点结点包括:数据域、与该顶点相连的第一条边;
(3)边结点包括:边的两个顶点编号i,j、权值、依附于顶点 i 的下一条边、依附于顶点 j 的下一条边;
(4)和十字链表法类似,按顺序画顶点结点、边结点、firstedge连线、iLink和jLink连线;
3.度
(1)沿着顶点结点的firstedge往后找对应边结点的iLink或jLink,直到找到NULL,即可找到该顶点结点所有的度;
4.删除操作
(1)删除边
上述例子中,如要删除A和B相连的边,先修改A和B的firstedge连线到顺延相应iLink或jLink的下一个边结点,再删除AB相连的边结点即可,如下图所示:
(2)删除顶点
上述例子中,如要删除顶点E,先修改因删除E的所有边结点所导致指向出现偏差的指针,这里出现偏差的指针为:
①i=2,j=1边结点中jLink的指向改为顺延原本所指的下一个jLink的所指也就是NULL;
②i=2,j=3边结点中iLink的指向改为顺延原本所指的下一个iLink的所指也就是NULL;
再删除E结点的所有边结点,如下图所示:
5.性能分析
(1)空间复杂度:O(|V|+|E|);
(2)删除边、删除结点等操作很方便;
(3)邻接多重表只适用于存储无向图;
三、邻接矩阵、邻接表、十字链表、邻接多重表对比