邻接表、十字链表、邻接多重表—图的存储结构

文章目录

      • 邻接表
        • 1、邻接表表示法
        • 2、无向图的邻接表
        • 3、有向图的邻接表
        • 4、练习
        • 5、邻接表的结构类型定义
        • 6、采用邻接表表示法创建无向网
        • 7、邻接表特点
        • 8、邻接矩阵与邻接表表示法的关系
      • 十字链表
      • 邻接多重表

邻接表

1、邻接表表示法

邻接表是一种图的链式存储结构。在邻接表中,对图中每个顶点 vi 建立一个单链表,把与 vi 相邻接的顶点放在这个链表中。

邻接表中每个单链表的第一个结点存放有关顶点的信息,把这一结点看成链表的表头,其余结点存放有关边的信息,这样邻接表便由两部分组成:表头结点和边表
邻接表、十字链表、邻接多重表—图的存储结构_第1张图片
顶点:
按编号顺序将顶点数据存储在一维数组
关联同一顶点的边(以顶点为尾的弧):
用线性链表存储

2、无向图的邻接表

邻接表、十字链表、邻接多重表—图的存储结构_第2张图片
特点:

  • 邻接表不唯一
  • 无向图中有 n 个顶点、e 条边,则其邻接表需 n 个头结点2e 个表结点。适宜存储稀疏图
  • 无向图中顶点 vi 的度为第 i 个单链表中的结点数

3、有向图的邻接表

邻接表、十字链表、邻接多重表—图的存储结构_第3张图片
邻接表特点:

  • 顶点 vi 的出度为第 i 个单链表中的结点个数
  • 顶点 vi 的入度为整个单链表中邻接点域值为 i-1 的结点个数

逆邻接表特点:

  • 顶点 vi 的入度为第 i 个单链表中的结点个数
  • 顶点 vi 的出度为整个单链表中邻接点域值为 i-1 的结点的个数

4、练习

已知某网的邻接(出边)表,请画出该网络
邻接表、十字链表、邻接多重表—图的存储结构_第4张图片
当邻接表的存储结构形成后,图便唯一确定!
邻接表、十字链表、邻接多重表—图的存储结构_第5张图片

5、邻接表的结构类型定义

顶点的结点结构:
在这里插入图片描述
顶点结点的类型定义:

typedef struct VNode
{
	VerTexType data;   //顶点信息 
	ArcNode *firstarc; //指向第一条依附该顶点的指针 
}VNode,AdjList[MVNum]; //AdjList表示邻接表类型

说明:例如,AdjList v; 相当于 VNode v[MVNum];

弧(边)的结点结构:

在这里插入图片描述
边结点的类型定义:

#define MVNum 100      //最大顶点数 
typedef struct ArcNode //边结点 
{
	int adjvex;        //该边所指向的顶点的位置 
	struct ArcNode *nextarc;  //指向下一条边的指针 
	OtherInfo info;    //和边相关的信息 
}ArcNode;   

图的类型定义:

typedef struct
{	  
    AdList vertics;    //vertics--vertex的负数 
    int vexnum,arcnum; //图的当前顶点数和弧数 
}ALGraph;       

6、采用邻接表表示法创建无向网

邻接表操作举例说明:
邻接表、十字链表、邻接多重表—图的存储结构_第6张图片
【算法思想】
①输入总结点数和总边数
②建立顶点表

  • 依次输入点的信息存入顶点表中
  • 使每个表头结点的指针域初始化为NULL

③创建邻接表

  • 依次输入每条边依附的两个顶点
  • 确定两个顶点的序号 i 和 j ,建立边结点
  • 将此边结点分别插入到 vi 和 vj 对应的两个边链表的头部

【算法描述】
邻接表、十字链表、邻接多重表—图的存储结构_第7张图片
邻接表、十字链表、邻接多重表—图的存储结构_第8张图片

7、邻接表特点

①方便找任一顶点的所有“邻接点”
②节约稀疏图的空间

  • 需要 N 个头指针+2E 个结点(每个结点至少两个域)

③方便计算任一顶点的度???

  • 对无向图:是的
  • 对有向图:只能计算“出度”;需要构造逆邻接表来方便计算“入度”

④不方便检查任一一对顶点间是否存在边

8、邻接矩阵与邻接表表示法的关系

邻接表、十字链表、邻接多重表—图的存储结构_第9张图片

1、联系:邻接表中每个链表对应于邻接矩阵中的一行,链表中结点个数等于一行中的非零元素的个数
2、区别:
①对于任一确定的无向图,邻接矩阵是唯一的,但邻接表不唯一
②邻接矩阵的空间复杂度为O(n^2),邻接表的空间复杂度为O(n+e)
3、用途:邻接矩阵多用于稠密图,邻接表多用于稀疏图

十字链表

为了解决有向图和无向图的缺点,我们又有了十字链表和邻接多重表
邻接表、十字链表、邻接多重表—图的存储结构_第10张图片
十字链表是有向图的另一种链式存储结构。我们也可以把它看成是有向图的邻接表和逆邻接表结合起来形成的一种链表。
有向图中的每一条弧对应十字链表的一个弧结点,同时有向图中的每个顶点在十字链表中对应有一个结点,叫做顶点结点
邻接表、十字链表、邻接多重表—图的存储结构_第11张图片
邻接表、十字链表、邻接多重表—图的存储结构_第12张图片

邻接多重表

邻接表虽然方便求得顶点和边的信息,但某些操作不方便(如:删除一条边需找表示此边两个顶点)
邻接表、十字链表、邻接多重表—图的存储结构_第13张图片
在这里插入图片描述
邻接表、十字链表、邻接多重表—图的存储结构_第14张图片
邻接表、十字链表、邻接多重表—图的存储结构_第15张图片

你可能感兴趣的:(数据结构,数据结构,图论)