链式前向星的原理图解

笔者写下这篇文章的契机是,前两天在上机课用纯链式存储写题,累的够呛。于是痛定思痛,在此梳理一遍链式前向星,也希望能给有同样困扰的同学们提供一点帮助。

在进入正题之前,我们先用邻接矩阵和邻接表引入。

  1. 邻接矩阵表示图
    在这里插入图片描述
    邻接矩阵的存储原则为:
    第i个结点指向第j个结点。则将矩阵中matrix[i][j]=w,w为边的权值
    可以很好的将链式存储结构转化为一个矩阵来存储。缺点是浪费空间。

  2. 邻接表表示图
    在这里插入图片描述
    邻接表常用vector,但是vector的隐藏常数太大,空间复杂度高。
    由此我们在邻接表的基础上引入了链式前向星

  3. 链式前向星
    在这里插入图片描述

存储结构

#define MaxSize 100
typedef struct Edge {
	int to, w, next;
} Edge;
int tot;
int head[MaxSize];
Edge edge[MaxSize];

to为被指向的当前结点编号。w为权值,next被定义为,与上一元素父节点相同的兄弟结点。(比如图中,1->2 1->4 1->3;则结点2的next=4;结点4的next=3)
head[i]为父结点i指向的第一个子结点。(head[i]只要求互不相同即可。)
遍历函数

for (int i = 1; i <= MaxSize; i++) { //从1开始
	for (int j = head[i]; j != -1; j = edge[j].next;) {
		printf("结点%d->结点%d的权值为%d", i, edge[j].to; edge[j].w);
	}
}

拿i=1的遍历举例
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

加边函数
特别的是,与普遍链表不同,在链式前向星中,是在头部插入新结点,而非NULL处

void add_edge(int u, int v, int w) { //u为起点,v为终点,w为权值
	edge[tot].to = v; //tot为空结点指针
	edge[tot].w = w;
	edge[tot].next = head[u];
	head[u] = tot++;//tot为任一个未被使用的空节点指针。
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:此时tot不一定为其指向结点的to值。

前向星和链式前向星的区别在于实现方式和数据结构的不同。 前向星是一种存储图的边的数据结构,它使用两个数组来存储边的信息。一个数组存储每个顶点的第一条边的索引,另一个数组存储每条边的下一条边的索引。这种方式可以方便地遍历每个顶点的所有边。 链式前向星是一种基于链表的存储方式,它使用链表来存储每个顶点的边。每个顶点都有一个指向第一条边的指针,每条边都有一个指向下一条边的指针。这种方式可以动态地添加和删除边。 总结来说,前向星使用数组存储边的信息,链式前向星使用链表存储边的信息。链式前向星相比前向星更加灵活,可以方便地进行边的入和删除操作。但是链式前向星的空间复杂度较高,因为需要额外的指针来存储链表的连接关系。 引用\[1\]中提到,链式前向星的整体结构很像邻接表,但是实现方式不同。链式前向星的思想和邻接表一致,只是在实现上有所区别。因此,链式前向星的使用和邻接表相一致,可以用于存储和遍历图的边的信息。 #### 引用[.reference_title] - *1* *2* *3* [链式前向星](https://blog.csdn.net/MuShan_bit/article/details/123882339)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快苏排序OAO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值