vlib列表 - C语言通用链表模块

vlib - list列表

list源代码仓库链接

基本概念

链表是一种非连续存储的空间的容器,通过指针将数据连接成一条线性的链。一般链表有两个组成部分,其一是结点部分,用于存储数据以及链接周围的结点,其二是链表,用于维护所有的结点。通常,链表单向链表和双向链表,单向链表指的是只能从一个方向进行操作,而双向链表可以从两个方向进行操作。链表动态存储分配,不会造成空间浪费,同时插入和删除操作也有着高效率,不需要进行内存移位,只需修改结点指向即可。同时,链表也有着明显的缺点,访问的平均时间复杂度高,需要额外的空间来放结点指针。
vlib对链表进行了封装,成为列表(list),list隐藏了底层存储需要的链式结点,使用时不需要关注结点,只需要关注list和其操作方法即可。list封装了常用的增删改查的方法,同时也提供了专有的迭代器,使用迭代器来对list进行遍历有着很高的效率。

例子

int main()
{
	list_t lchar = list(char); // 定义并构造char型列表
	list_t lint = list(int); // 定义并构造int型列表
	list_it_t it = list_it(lint); // 定义并构造链接lint列表的迭代器
	char* s = "Hello";
	int i = 0;
	int int_data = 0;

	// 将"Hello"逐一添加到列表
	for (i = 0; i < strlen(s); i++)
	{
		list_push_back(lchar, s + i);
		int_data = *(s + i);
		list_push_back(lint, &int_data);
	}

	// 随机访问方式遍历列表
	for (i = 0; i < list_size(lchar); i++)
	{
		printf("lchar[%d] = %c\r\n", i, list_at(lchar, char, i)); // 此随机访问非直接内存访问,而是链式一步步指向指定位置
	}

	// 在索引3的位置插入1024
	i = 1024; list_insert(lint, 3, &i);

	printf("it to: %d\r\n", list_it_to(it, int, 0)); // 迭代器定位到索引0,并打印此数据
	while (!list_it_pause(it)) // 迭代器遍历,效率比使用随机访问的遍历要高很多
	{
		printf("lint it: %d\r\n", list_it_next(it, int));
	}

	// 使用完进行删除
	_list(lchar);
	_list(lint);
	_list_it(it);

	system("pause");
	return 0;
}

结果:

lchar[0] = H
lchar[1] = e
lchar[2] = l
lchar[3] = l
lchar[4] = o
it to: 72
lint it: 72
lint it: 101
lint it: 108
lint it: 1024
lint it: 108
lint it: 111

特点

  • list定义为list_t类型
  • list构造需确定类型,支持各种类型
  • list可以很方便高效地在两端方向进行插入和移除元素
  • list具备随机访问的操作,此随机访问链式一步步指向到指定位置,效率随越远离两端而越低
  • list隐藏了链表的结点
  • list提供了许多内置的操作方法,如增删改查、交换、翻转、合并、排序等
  • list提供了专有的迭代器,方便高效的进行遍历及其他操作

常用方法

#define list(type) // 构造
#define _list(list) // 删除
#define list_at(list, type, i) // 随机访问
list_t list_copy(list_t list, int begin, int end); // 复制
int list_insert(list_t list, int index, void* data); // 插入
int list_insert_sort(list_t list, void* data, list_sort_rule_t sort_rule); // 有序插入
int list_push_front(list_t list, void* data); // 头插
int list_push_back(list_t list, void* data); // 尾插
int list_erase(list_t list, int begin, int end); // 擦除
int list_pop_front(list_t list); // 头删
int list_pop_back(list_t list); // 尾删
void list_clear(list_t list); // 清空
void* list_find(list_t list, void* data, int direction, int which_one, int *out_index); // 查找
int list_remove(list_t list, void* data); // 移除
int list_switch(list_t list, int index0, int index1); // 交换两个位置数据
void list_swap(list_t list, list_t list_swap); // 交换两个列表
int list_reverse(list_t list, int begin, int end); // 翻转区间的元素
int list_splice(list_t list, int index, list_t list_s, int begin, int end); // 合拼插入
int list_sort(list_t list, int begin, int end, list_sort_rule_t sort_rule); // 排序
int list_size(list_t list); // 获取大小
void list_traverse(list_t list, int direction, list_traverse_t traverse); // 遍历

#define list_it(list) // 迭代器构造
#define _list_it(it) // 迭代器删除
#define list_it_to(it, type, i) // 迭代器定位
#define list_it_next(it, type) // 迭代器后移
#define list_it_prev(it, type) // 迭代器前移
#define list_it_get(it, type, bias) // 迭代器获取
#define list_it_pause(it) // 迭代器停止标志

方法的使用具体看仓库介绍和源代码

最后

此模块为笔者本人编写,如果喜欢希望点赞给星支持,有漏洞或者修改建议欢迎留言交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值