7.2.2 邻接表

相关定义

  • 邻接表
    是图的一种链式存储结构。
    在邻接表中,对每个顶点建立一个单链表第 i 个单链表中的结点 表示依附于 顶点 vi (对 有向图 而言则是以顶点 vi弧尾的弧)。
    每个单链表一个表头结点若干个表中结点组成。

  • 表头结点 (顶点)
    此类型结点设置有数据域链域。( data域firstarc域 )
    数据域 存储存储顶点 vi 的名或其它相关信息。
    链域 指向链表中的第一个表中结点,代表表头结点关联的第一条弧

  • 表结点 ( 弧 )
    此类型结点设置有邻接点域链域数据域。( adjvex域nextarc域info域 )
    邻接点域:指示与顶点 vi 邻接的点在图中的位置。
    链域:指示下一条边 / 弧的表中结点
    数据域:存储 边 / 弧 相关的信息,如权值等。
    在这里插入图片描述

  • 表头结点可以用链来连接,但通常以顺序结构来存储,以便随机访问任一顶点的链表.

邻接表存储结构

#define MAX_VERTEX_NUM 20

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;

性质

  • 对于一个有 n 个顶点,e 条边的无向图:
    它的邻接表需要 n 个头结点和 2e 个表结点,
    而它的邻接矩阵需要 n2 个单元,
    在边比较少 (即稀疏图) 的情况下,使用邻接表邻接矩阵节约存储空间

  • 对于无向图而言,顶点 vi 的度为 :邻接表中第 i 个链表中的结点个数 (不包括表头结点)
    对于有向图而言,第 i 个链表中的结点个数只是顶点 vi出度;若要求 vi 的入度,则需要遍历整个邻接表,所有链表中邻接点域的值为 i 的结点的个数是顶点 vi入度

  • 对于有向图而言,可以建立有向图的逆邻接表,以便于求顶点的入度。(就是对每个顶点 vi 建立一个 以 vi 为弧头的弧 的链表)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 时间复杂度
    对于一个有 n 个顶点,e 条弧的有向图,在建立邻接表或者逆邻接表时:
    输入的顶点信息 即为 顶点的编号,则 建立邻接表的时间复杂度 为 O( n+e )
    否则,需要通过查找才能得到顶点在图中位置,则时间复杂度为 O( n*e ),每一条弧求顶点在图中位置都需要遍历 n 个顶点。

  • 邻接表邻接矩阵相比较
    邻接表上容易找到任一顶点的第一个邻接点和下一个邻接点;
    判定任意两个顶点 vi 和 vj 之间是否有边或者有弧相连则需要分别搜索第 i 个或第 j 个链表,此时邻接表不如邻接矩阵来的方便。邻接矩阵之间看 A [ i ] [ j ] 和 A [ j ] [ i ] 是否为 1 即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值