链式前向星

概念

首先,要知道链式前向星,就要先知道前向星。
前向星是一种数据结构,一种通过储存边来储存图的方式,它有三个元素,用结构体的形式可以表示为:

Edge[i].to :第i条边的终点
Edge[i].next :与第i条边同一个起点的下一条边
Edge[i].w:第i条边的边权

最后还要把边按照起点顺序排序,才算构造完毕。
为了更方便对构造的图进行一些操作,就要用链式的结构来储存前向星,即用一个head数组。
它用来储存第一个以i为起点的边的位置,同时head初始化为-1。

添加边的操作

我们先看代码:

void add_edge(int u, int v, int w) // 这里面初始化cnt = 1
{
    edge[cnt].to = v;
    edge[cnt].w = w;
    edge[cnt].next = head[u];
    head[u] = cnt++;
}

举个例子,我们要构造这样一个图,每一行的数据中,第一个是起点,第二个是终点,第三个是边权:

1 3 9
5 1 3
1 4 4
2 3 5
4 5 7
1 2 8
5 3 2

先通过用表格来看添加每一条边的变化:

起点终点边权Edge[i].toEdge[i].nexthead[i]
139Edge[1].to = 3Edge[1].next = -1head[1] = 1
513Edge[2].to = 1Edge[2].next = -1head[5] = 2
144Edge[3].to = 4Edge[3].next = 1head[1] = 3
235Edge[4].to = 3Edge[4].next = -1head[4] = 4
457Edge[5].to = 5Edge[5].next = 4head[4] = 5
128Edge[6].to = 2Edge[6].next = 3head[6] = 6
532Edge[7].to = 3Edge[6].next = 2head[7] = 7

最后图长这样:
在这里插入图片描述
如果表格不太理解可以一步步看图来理解:
在这里插入图片描述

第一次 起点 :1 终点:3 边权:9

Edge[1].to = 3
Edge[1].next = -1
Edge[1].w = 9
head[1] = 1

head[1]head[2]head[3]head[4]head[5]
1-1-1-1-1

在这里插入图片描述
第二次 起点 :5 终点:1 边权:3

Edge[2].to = 1
Edge[2].next = -1
Edge[2].w = 3
head[5] = 2

head[1]head[2]head[3]head[4]head[5]
1-1-1-12

在这里插入图片描述

第三次 起点 :1 终点:4 边权:4

Edge[3].to = 4
Edge[3].next = head[1] = 1
Edge[3].w = 4
head[1] = 3

head[1]head[2]head[3]head[4]head[5]
3-1-1-12

在这里插入图片描述

第四次 起点 :2 终点:3 边权:5

Edge[4].to = 3
Edge[4].next = -1
Edge[4].w = 5
head[2] = 4

head[1]head[2]head[3]head[4]head[5]
34-1-12

在这里插入图片描述

第五次 起点 :4 终点:5 边权:7

Edge[5].to = 5
Edge[5].next = -1
Edge[5].w = 7
head[4] = 5

head[1]head[2]head[3]head[4]head[5]
34-152

在这里插入图片描述

第六次 起点 :1 终点:2 边权:8

Edge[6].to = 3
Edge[6].next = head[1] = 3
Edge[6].w = 8
head[1] = 6

head[1]head[2]head[3]head[4]head[5]
64-152

在这里插入图片描述

第七次 起点 :5 终点:3 边权:2

Edge[7].to = 3
Edge[7].next = head[5] = 2
Edge[7].w = 2
head[5] = 7

head[1]head[2]head[3]head[4]head[5]
64-157

通过上面的例子,我们可以发现head[i]数组最终储存的值是最后一个输入以i为起点的边的位置,而next就是将原来的head储存起来。

遍历操作

遍历代码是这样的:

for (int i = 1; i <= n; i++) // n是节点的个数
{
    for (int j = head[i]; j != -1; j = Edge[j].next) 
    {
        printf("%d %d %d", j, Edge[j].to, Edge[j].w);
   }
}

其中第二个循环中,我们是从最后一个输入的以i为起点的边开始,由它的next再找到倒数第二条边……

比如下面一个例子,一共四条边,都是以1为起点的。

1 2 9
1 3 4
1 4 5
1 5 7
在这里插入图片描述

终点Edge[i].next
2Edge[1].next = -1
3Edge[2].next = 2
4Edge[3].next = 3
5Edge[4].next = 4

所以我们从第四条边开始,通过第四条的next找到第三条,由第三条的next找到第二条……直到等于-1,也就是没有下一条边了,也就说明以1为起点的边都遍历完了。

以上就是链式前向星的全部内容,如果发现有错误,欢迎在评论区中指正。

  • 27
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
前向星和链式前向星的区别在于实现方式和数据结构的不同。 前向星是一种存储图的边的数据结构,它使用两个数组来存储边的信息。一个数组存储每个顶点的第一条边的索引,另一个数组存储每条边的下一条边的索引。这种方式可以方便地遍历每个顶点的所有边。 链式前向星是一种基于链表的存储方式,它使用链表来存储每个顶点的边。每个顶点都有一个指向第一条边的指针,每条边都有一个指向下一条边的指针。这种方式可以动态地添加和删除边。 总结来说,前向星使用数组存储边的信息,链式前向星使用链表存储边的信息。链式前向星相比前向星更加灵活,可以方便地进行边的插入和删除操作。但是链式前向星的空间复杂度较高,因为需要额外的指针来存储链表的连接关系。 引用\[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 ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值