SeanLib系列函数库-MyList

张开发
2026/4/21 14:32:08 15 分钟阅读

分享文章

SeanLib系列函数库-MyList
查看其它库函数说明请点击此处跳转到SeanLib主页1. 本篇内容本篇介绍链表库这是一个轻量型的带头节点的双向循环链表结构提供了完整的链表操作接口包含新建链表头节点、增加节点、搜索节点、删除节点四种方法。每个节点都拥有一个万能指针可存储任意对象。2. 使用说明链表结构typedefstruct_MyList_t//定义一个双向带头节点的循环链表类型{struct_MyList_t*Previous;//本节点的前一个节点struct_MyList_t*Next;//本节点的后一个节点void*Object;//本节点的存储对象任意类型的指针}MyList_t;所谓链表即是每个节点被一条链子串联起来每个节点除了存储一个目标对象外还分别记录了它所在位置的前一个和后一个节点因此形成了链式存储结构从任意一个节点着手都可以遍历到该链表中的全部节点。以下是本库提供的链表的操作方法/******************************************************************************* * 功 能: 创建一个新的链表并返回其头节点 * 参 数: 无 * 返回值创建成功返回链表指针否则返回空指针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 节点指针指定要删除的节点 * 返回值无 *******************************************************************************/voidMyList_Remove(MyList_t*ListNode);/******************************************************************************* * 功 能: 删除并释放链表及其所有节点 * 参 数: * HeadNode 指定要删除的链表头节点 * 返回值无 *******************************************************************************/voidMyList_Dispose(MyList_t*HeadNode);3. 示例代码假如要创建一个存储学生信息的链表// 定义数据结构typedefstruct{intID;charName[32];}Student_t;// 创建链表MyList_t*StudentListNewMyList();if(StudentListNULL){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*NodeMyList_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);StudentListNULL;4. 注意事项头节点不存储数据Object成员始终为NULL链表为循环结构遍历时注意结束条件cur ! HeadNode存储的对象指针需要确保生命周期长于链表节点不要在回调函数或中断中执行耗时的链表操作多线程环境下使用需自行添加同步保护

更多文章