图的存储--邻接表

图的存储--邻接表

邻接表表示法

顶点:

按编号顺序将顶点数据储存在一维数组中;

关联同一顶点的边:

用线性链表储存.

头节点分为数据域和指针域.

表节点:

邻接点域:存放与vi邻接的顶点在表头数组中的位置.

链域:指向下一条边或弧.

还可以增加带权值的数据域info

image-20230629213240489

image-20230629213258375

image-20230629213311002

无向图的邻接表

  1. 邻接表不唯一
  2. 若无向图中有n个顶点,e条边,则其邻接表需n个头节点和2e个表节点.适宜存储稀疏图.
  3. 无向图中顶点vi的度为地i个单链表中的结点个数

image-20230629220112636

有向图的邻接表

image-20230630105333762

邻接表:

找出度容易,找入度难.

顶点vi的出度为第i个单链表的节点个数.

顶点vi的入度为整个单链表中邻接点域值是i-1的节点个数.

逆邻接表:

找入度易,找出度难.

顶点vi的入度为第i个单链表的节点个数.

顶点vi的出度为整个单链表中邻接点域值是i-1的节点个数.

练习

当邻接表的存储结构形成后,图便唯一确定了

image-20230630110021899

建立邻接表的算法

顶点的节点结构

image-20230704210817774

#include <bits/stdc++.h>

using namespace std;

typedef struct VNode {
	int data;//顶点信息
	int *firstarc;//指向后面每一条边的指针
} VNode, AdjList[10];
int main () {
	AdjList v;



	return 0;
}

弧(边)的节点结构

image-20230704211347854

typedef struct ArcNode { //定义边节点的类型
	int adjvex;//储存下一个点的下标
	struct ArcNode* nextarc;//指向下一个顶点
	int info;//储存权值
} ArcNode;

图的结构定义

image-20230704212009782

typedef struct{
	AdjList vertices;
	int vexnum,arcnum;
	//图的当前顶点数和弧数
}ALGraph;//图的类型定义

邻接表操作说明

image-20230704212537364


采用邻接表创建无向网.

image-20230704212941750

算法实现--采用邻接表创建无向网.

image-20230704213648014

image-20230704214953133

邻接表和矩阵的优缺点

邻接表的特点

方便找任一顶点的所有"邻接点".

节约稀疏图的空间.

方便计算每一个顶点的度?

无向图容易计算

有向图不容易计算

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

image-20230705092456170

邻接矩阵和邻接表之间的关系

  1. 联系:邻接表中每个链表对应于邻接矩阵中的一行,链表中节点个数等于一行中非零元素的个数.

image-20230705092743738

  1. 区别:对于任一确定的无向图,邻接矩阵是唯一的(行列号与顶点编号一致),但邻接表不唯一(链接次序与顶点的编号无关).
  2. 邻接表的空间复杂度为O(n^2),而邻接表的空间复杂度为O(n+e).
  3. 用途:邻接矩阵多用于稠密图,而邻接表多用于稀疏图.

image-20230705093400525

posted @ 2023-06-29 22:02  harper886  阅读(178)  评论(0编辑  收藏  举报