链式前向星(超详细)

article/2025/10/16 12:11:22

前向星和链式前向星

链式前向星

添加边的操作

链式前向星,就是以链式结构来储存前向星,每条边就要用结构体,结构体中包含三个数据:

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[i].next) {printf("%d %d %d", i, Edge[i].to, Edge[i].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为起点的边都遍历完了。


http://chatgpt.dhexx.cn/article/QOEim8ax.shtml

相关文章

stm32串口中断的接收

利用串口使得led点亮 利用之前的串口函数加上NVIC的中断函数结构体 定义结构体 定义 配置抢占优先级的组别 配置NVIC串口中断的结构体&#xff1a;中断的通道&#xff0c;配置抢占优先级和子优先级 使能CMD 结构体初始化 还有需要配置中断串口的配置&#xff1a; 串口 接…

STM32串口下载

使用FlyMCU下载程序 1.上电前&#xff0c;设置BOOT01&#xff0c;BOOT10。或者是在上电后&#xff0c;设置BOOT01&#xff0c;BOOT10之后&#xff0c;然后按一下复位按键&#xff0c;从而通过串口下载程序。 2.&#xff0c;在MDK编译加载生成的hex文件&#xff0c;并勾选右边的…

STM32 串口发送乱码问题

STM32 串口发送乱码问题 一、问题状况&#xff1a; 显示为一堆乱码&#xff0c;&#x1f4a2;&#x1f620;&#x1f4a2;晕啊 。 二、解决方法 (通常问题是出在step3:调整外部振荡器默认值) step1:检查时钟树配置 设置晶振为开发板上外部晶振一致的8MHz。 step2:检查波…

STM32串口发送和接收

采用标准库 主控STM32F103C8T6 03代码&#xff1a; #include "main.h" #include "led/led.h" #include "exit/exit.h" #include "uart/uart.h"int main() {NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);InitLED();InitExit();I…

stm32串口控制LED灯

实验要求&#xff1a;电脑串口控制单片机的LED灯 led.c #include "led.h" #include "delay.h" /*初始化led所在口的时钟以及一些输入输出的相关设置*/void Led_Init() {GPIO_InitTypeDef GPIO_Initstructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIO…

stm32串口收发总结

stm32串口的使用过程&#xff1a; 1.使能串口时钟&#xff0c;同时使能串口对应的GPIO的时钟&#xff1b; 2.设置串口引脚的输入输出模式、速率&#xff0c;并初始化GPIO引脚&#xff1b; 3.对于需要接收数据的串口&#xff0c;配置其中断&#xff0c;并使能&#xff1b; 4.设置…

STM32串口发送中断踩坑

今天想测试下Modbus设备&#xff0c;手上暂时没有串口转485的模块&#xff0c;就打算用手上的stm32f042的开发板做个串口转485模块。如下所示 但是软件实际开发过程中&#xff0c;遇到了麻烦。 现象: 在打开串口接收中断时&#xff0c;串口会一直产生除接收中断外的其它中断…

STM32串口下载程序

STM32串口连接及下载程序 一、认识STM321、浅谈STM322、TTL串口与STM3连接 二、下载程序1、HEX文件生成2、烧录软件使用 三、总结四、参考文献 一、认识STM32 1、浅谈STM32 1、STM32型号的说明:以STM32F103RBT6这个型号的芯片为例&#xff0c;该型号的组成为7个部分&#xff…

STM32串口收发处理

STM32串口收发 STM32的串口接收和发送方式都有三种情况&#xff0c;即轮询、中断和DMA&#xff0c;俩俩组合便有9种可能的组合。 下面挑出其中三种收发方式进行研究&#xff0c;以及优缺点比较。 一、中断接收、轮询发送&#xff0c;无缓存模式 1.1 原理 当串口上有字节传送…

STM32 串口通讯及实现

目录 一、串口通讯概述1、广义的串口2、狭义的串口3、串口数据定义4、串口通讯应用 二、STM32串口工程标准库实现1、串口的初始化2、串口数据发送.3、串口的数据接收 一、串口通讯概述 1、广义的串口 广义的串口是针对并口来说的。串口是指设备之间通过一根数据信号线按数据位…

STM32串口配置

目录 串口设置的一般步骤&#xff1a; 1) 串口时钟使能&#xff0c;GPIO 时钟使能 2) 串口复位 3) GPIO 端口模式设置 4) 数据发送与接收 5) 串口状态 6) 使能串口 7) 开启串口响应中断 8.获取相应中断状态 串口设置的一般步骤&#xff1a; 1) 串口时钟使能&#xff0…

STM32串口详解

实验一&#xff1a;简单的利用串口接收中断回调函数实现数据的返回 关于串口调试助手&#xff0c;还应知道&#xff1a; 发送英文字符需要用一个字符即8位&#xff0c;发送汉字需要两个字符即16位&#xff0c;如上图&#xff0c;发送汉字“姜”实际是发送“BD AA”而发送英文字…

stm32串口实验

目录 &#xff08;一&#xff09;STM32 串口简介 (二)软件设计 &#xff08;三&#xff09;效果&#xff1a;​ 1.实现功能&#xff1a;STM32 通过串口和上位机的对话&#xff0c; STM32 在收到上位机发过来的字符串后&#xff0c;原原本本的返回给上位机。 &#xff08;一&…

STM32 串口乱码

问题描述 用正点原子STM32F4探索者开发板调试野火骄阳电机驱动程序&#xff0c;发现串口输出一直是乱码。问题排查&#xff1a; 串口调试助手编码方式&#xff1f;同一个串口调试助手&#xff0c;用正点原子、STM32CubeMX生成的程序发送数据正常。排除串口调试助手问题。串口…

STM32串口通信编程

重庆交通大学信息科学与工程学院 《嵌入式系统基础A》课程 实验报告&#xff08;2&#xff09; 班 级&#xff1a; 物联网工程2002 姓名-学号 &#xff1a; 徐权-632007060327 实验项目名称&#xff1a; STM32串口通信编程 实验项目性质&#xff1a; 设计性 实验所…

STM32串口驱动

首先了解串口通信的一些基本原理&#xff1a; ⚫ 串口通信&#xff1a; 串口通信是指数据通过一条数据线&#xff08;或者两条差分线&#xff09;一位接着一位的传输出去。串口通信的优点是占用硬件资源少&#xff0c;且传输距离较远&#xff0c;缺点是传输速度慢&#xff08;…

STM32串口

使用百问网的STM32F103MINI开发板完成下面实验。 1、通过STM32CubeMX配置串口。 串口1选择Asynchronous&#xff0c;异步通信。 115200bps&#xff0c;8N1&#xff0c;默认即可。 2、串口发送数据。 STM32Cube生成代码后&#xff0c;在main.c的while(1)前面加一句。 HAL_U…

STM32 串口详解

目录 01、USART的特点 02、USART简介 2.1、数据传输模型 2.2、帧结构 2.3、波特率 03、STM32的USART 04、代码配置 01、USART的特点 USART是通用异步收发传输器&#xff08;UniversalAsynchronousReceiver/Transmitter)&#xff0c;通常称作UART&#xff0c;是一种异步…

STM32入门教程——串口通讯

目录 1.认识串口 2.stm32串口介绍 2.1 查询方式 2.1 中断方式 2.2 DMA方式 3.使用stm32串口实现printf 串口作为嵌入式设备最常用的外设之一&#xff0c;被广泛的应用。本文介绍STM32串口的如何使用。从以下几个方面介绍&#xff1a; 1.认识串口 常用串口的引脚主要由TX…

STM32—串口

串口介绍 串行接口简称串口&#xff0c;也称串行通信接口或串行通讯接口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方式的扩展接口。串行接口&#xff08;Serial Interface&#xff09;是指数据一位一位地顺序传送。其特点是通信线路简单&#xff0c;只…