纯C语言实现仿C++STL泛型链表

2023-05-16

〇、声明

本代码完全开源,可以用于任意用途,但代码并未做完善的测试,性能也不能保障,主要用于初学者学习
源码链接:GitHub

一、原理

普通的单向链表的原理就是一个节点存储着数据和指向下一个节点的指针,然后一节指向下一节,形成一个非常形象的“链”。本文的链表是双向的链表,不光存储下一个节点的指针,还存储上一个节点的指针,也就是除了能找到当前节点的下一个节点,还能反向找到上一个节点。
泛型的基本原理就是利用“万能指针”void* 强制类型转换的通用性,基础节点数据类型就是一个void*指针,在这个指针上分配相应大小的内存来实现存储任意类型数据。读取数据的时候再通过强制类型转换还原。

二、功能对照

C++ std::ListC List说明
rbeginList_iterator_mov_head移动迭代器至首元素
rendList_iterator_mov_end移动迭代器至尾元素
emptyList_empty判断链表是否为空
size__List_size链表元素个数
front__List_read_front读取首节点
back__List_read_back读取尾节点
push_front__List_push_front添加元素到链表头
pop_frontList_pop_front移除首元素
push_back__List_push_back添加元素到链表尾
pop_backList_pop_back移除尾元素
insert__List_iterator_insert在迭代器位置后插入元素
resizeList_resize将长度改为只容纳n个元素
(析构函数)List_Delete删除链表
(构造函数)List_Creat初始化链表
remove_ifList_remove_if按条件删除元素
(拷贝函数)List_copy链表拷贝
iterator::operator++List_iterator_mov_front向前移动迭代器
iterator::operator–List_iterator_mov_back向后移动迭代器
iterator::operator*__List_iterator_read返回迭代器所指元素数据
eraseList_iterator_erase / List_iterator_erase_area移除迭代器所指元素/移除两迭代器范围内元素,包括两迭代器所指元素

三、特有功能

使链表操作类似于数组的功能

名称功能
List_iterator_mov_goto移动迭代器至指定元素
__List_iterator_mov_offset移动迭代器指定偏移量
__List_iterator_return_locat返回迭代器所在的位置

四、使用方法

  • List_HandleTypeDef是链表的控制结构体,存储链表寻址,大小等信息,是链表的核心。
  • List_HandleTypeDef定义后一定要使用List_Creat进行初始化。
  • 迭代器定义后一定要使用List_iterator_Init进行初始化。
  • List_copy的源链表必须非空,输出链表必须是未初始化的。
  • 读取链表内容的时候需要传入类型,类型必须和创建该链表时使用的类型相符。
  • 双下划线开头的函数均为宏函数。
  • 该链表一般情况下不会访问野指,如果误操作会有返回值检查。
  • 链表使用完一定要使用List_Delete释放,如果再栈空间内Handle被释放掉而位于堆空间的动态内存没有释放就会造成内存泄漏。
  • 具体的函数使用说明再List.h里有详细注释

五、基本数据结构

节点结构

上一节点
当前节点
下一节点
pData
Data

List_HandleTypeDef结构

List_HandleTypeDef
Head头节点指针
上一节点 == NULL
End尾节点指针
下一节点 == NULL
New备用空节点指针
pData
Data 已分配但未初始化的内存空间
Len链表长度
Size Data大小

List_iteratorTypeDef结构

List_iteratorTypeDef
Handle链表句柄
Using迭代器所指节点
Locat迭代器在链表中的位置
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

纯C语言实现仿C++STL泛型链表 的相关文章

随机推荐