SeanLib系列函数库-MyList


查看其它库函数说明,请点击此处跳转到SeanLib主页

1. 本篇内容

本篇介绍链表库,这是一个轻量型的带头节点的双向循环链表结构,提供了完整的链表操作接口,包含新建链表(头节点)、增加节点、搜索节点、删除节点四种方法。每个节点都拥有一个万能指针可存储任意对象。

2. 使用说明

链表结构:

c 复制代码
typedef struct _MyList_t														//定义一个双向带头节点的循环链表类型
{
	struct _MyList_t 		*Previous;											//本节点的前一个节点
	
	struct _MyList_t 		*Next;												//本节点的后一个节点
	
	void 					*Object;											//本节点的存储对象,任意类型的指针
	
}MyList_t;

所谓链表,即是每个节点被一条链子串联起来,每个节点除了存储一个目标对象外,还分别记录了它所在位置的前一个和后一个节点,因此形成了链式存储结构,从任意一个节点着手,都可以遍历到该链表中的全部节点。

以下是本库提供的链表的操作方法:

c 复制代码
/*******************************************************************************
* 功  能: 创建一个新的链表,并返回其头节点
* 参  数: 无
* 返回值:创建成功返回链表指针,否则返回空指针NULL
*******************************************************************************/
MyList_t * NewMyList(void);

/*******************************************************************************
* 功  能: 创建一个新节点并链接接到链表的尾部
* 参  数: 
*       HeadNode :链表指针,指定一个链表的头节点
*       Object   :要创建的新节点,任意类型的对象
* 返回值:创建成功返回节点指针,否则返回空指针NULL
*******************************************************************************/
MyList_t * MyList_AddNode(MyList_t * HeadNode, void * Object);

/*******************************************************************************
* 功  能: 根据指定的对象,在链表中搜索节点
* 参  数: 
*       HeadNode :链表指针,指定一个链表的头节点
*       Object   :要搜索的对象,任意类型的指针
* 返回值:若搜索到返回节点指针,否则返回空指针NULL
*******************************************************************************/
MyList_t * MyList_Search(MyList_t * HeadNode, void * Object);

/*******************************************************************************
* 功  能: 删除并释放指定的节点
* 参  数: 
*       ListNode :节点指针,指定要删除的节点
* 返回值:无
*******************************************************************************/
void MyList_Remove(MyList_t * ListNode);

/*******************************************************************************
* 功  能: 删除并释放链表及其所有节点
* 参  数: 
*       HeadNode :指定要删除的链表头节点
* 返回值:无
*******************************************************************************/
void MyList_Dispose(MyList_t * HeadNode);

3. 示例代码

假如要创建一个存储学生信息的链表:

c 复制代码
// 定义数据结构
typedef struct
{
	int ID;
	char Name[32];
} Student_t;

// 创建链表
MyList_t * StudentList = NewMyList();
if (StudentList == NULL)
{
	printf("链表创建失败\r\n");
	return;
}

// 添加学生数据
Student_t Student1 = {1001, "张三"};
Student_t Student2 = {1002, "李四"};
Student_t Student3 = {1003, "王五"};

MyList_AddNode(StudentList, &Student1);
MyList_AddNode(StudentList, &Student2);
MyList_AddNode(StudentList, &Student3);

// 搜索学生
MyList_t * Node = MyList_Search(StudentList, &Student2);
if (Node != NULL)
{
	Student_t * pStu = (Student_t *)Node->Object;
	printf("找到学生:%d - %s\r\n", pStu->ID, pStu->Name);
}

// 删除学生
MyList_Remove(Node);

// 释放链表
MyList_Dispose(StudentList);
StudentList = NULL;

4. 注意事项

  1. 头节点不存储数据,Object成员始终为NULL
  2. 链表为循环结构,遍历时注意结束条件(cur != HeadNode)
  3. 存储的对象指针需要确保生命周期长于链表节点
  4. 不要在回调函数或中断中执行耗时的链表操作
  5. 多线程环境下使用需自行添加同步保护
相关推荐
全球通史5 小时前
Keil 配置 MSPM0G3507 开发环境避坑:SysConfig、msp.h 和 driverlib.a 报错完整解决记录
stm32·单片机·嵌入式硬件
某林21212 小时前
ROS2 机器人底盘调试避坑指南:从 `/odom` 丢失到彻底跑通的硬核排障实录
stm32·机器人·人机交互
zlinear数据采集卡12 小时前
定时器电路深度解析:从经典555到STM32定时器,从ZLinear采集卡的工程化设计实战
stm32·单片机·嵌入式硬件·fpga开发·自动化
m0_3771081413 小时前
stm32-USART
stm32·单片机·嵌入式硬件
不做无法实现的梦~16 小时前
常见工程分析软件
stm32·嵌入式硬件·算法
Sean_VIP17 小时前
FreeRTOS项目程序框架介绍(五)
笔记·stm32
嵌入式小站18 小时前
STM32 零基础可移植教程 15:ADC 多通道扫描,读取三路 PWM 的平均电压
stm32·单片机·嵌入式硬件
hai31524754319 小时前
# FiveOS V5.0 交付(终极合成器版 · 物理合规修正)
人工智能·stm32·单片机·嵌入式硬件·神经网络
嵌入式ZYXC19 小时前
第6章:通信接口的硬件特性——为什么你的UART乱码、I2C死锁、SPI干扰大?
stm32·单片机·嵌入式硬件·物联网·智能硬件
fffzd19 小时前
STM32:串口--轮询模式
stm32·单片机·嵌入式硬件·串口·hal库·轮询模式