经典数据结构:list

linux内核中有很多经典的数据结构, 比如list, hlist, rbtree等等,这些数据结构都是由c语言编写的,与平台无关,完全可以从内核中拿出来放到自己的代码中。

list
=======

移植自linux内核, windows平台可用

由于windows没有typeof, 故WIN32下:

#define list_for_each_entry(pos, head, member, type)           for (pos = list_entry((head)->next, type, member);       &pos->member != (head);        pos = list_entry(pos->member.next, type, member))

其余涉及到使用typeof关键字的函数或者宏并未移植

函数
=======

1. list_add 在 head 之后追加一个节点
2. list_add_tail 在 head 之前追加一个节点, 也就是在末尾追加一个节点
3. list_del 删除一个节点, 并将这个节点的next, prev 置为 NULL
4. list_del_init 删除一个节点并初始化删除的节点
5. list_replace 替换一个节点
6. list_replace_init 替换一个节点, 并初始化被替换的节点
7. list_move 移动节点到 head 之后
8. list_move_tail 移动节点到 head 之前
9. list_is_last 判断节点是否是链表中最后一个
10. list_empty 判断链表是否为空 (即, 是否只有 head 节点)
11. list_is_singular 判断链表中是否只有一个节点 (除了 head 之外)
12. list_cut_position 将1个链表截断为2个链表
13. list_splice 将2个链表合并为1个链表, @list中的所有节点(不包括list)加入到 head 之后
14. list_splice_tail 将2个链表合并为1个链表, @list中的所有节点(不包括list)加入到 head 之前
15. list_splice_init 同 list_splice, 最后会初始化 @list
16. list_splice_tail_init 同 list_splice_tail, 最后会初始化 @list


=======

1. list_entry 获取包含此节点的 struct
2. list_first_entry 获取包含此节点的 首个 struct
3. list_for_each 从 head节点之后一个节点开始向后循环
4. list_for_each_prev 从 head节点之前一个节点开始向前循环
5. list_for_each_safe list_for_each 的安全版本, 即, 循环时即使有其它线程删除节点也可正常运行
6. list_for_each_prev_safe list_for_each_prev 的安全版本
7. list_for_each_entry 同 list_for_each, 只是参数不同
8. list_for_each_entry_reverse 同 list_for_each_prev, 只是参数不同
9. list_for_each_entry_continue 同 list_for_each_entry, 但不是从头(head)开始循环的
10. list_for_each_entry_continue_reverse 同 list_for_each_entry_reverse, 但不是从头(head)开始循环的
11. list_for_each_entry_from 从指定位置开始向后循环
12. list_for_each_entry_safe list_for_each_entry 的安全版本
13. list_for_each_entry_safe_continue list_for_each_entry_continue 的安全版本
14. list_for_each_entry_safe_from list_for_each_entry_from 的安全版本
15. list_for_each_entry_safe_reverse list_for_each

代码下载: https://github.com/xieweihua/Data-structure-and-algorithm/tree/master/list

时间: 2024-10-29 01:26:10

经典数据结构:list的相关文章

大公司面试经典数据结构与算法题C#解答

几个大公司(IBM.MicroSoft and so on)面试经典数据结构与算法题C#解答 1.链表反转 我想到了两种比较简单的方法 第一种是需要开一个新的链表,将原链表的元素从后到前的插入到新链表中(也就是原链表第一个元素被插入成新链表的最后一个元素). 第二种是不需要开新的链表,而是逐步反转原链表中元素的指向,例如: 原链表是 1->2->3->4->null  被  逐步修改为 ①2->1->null.3->4->null ②3->2->

经典数据结构实现与分析:顺序表,单链表,

本博客在在这里重新总结了一下,当前常用的经典数据结构:这里只针对链表,顺序表,简单树和图进行总结:具体实现请参考:https://github.com/yaowenxu/codes/tree/master/数据结构; 本文章,主要讨论数据结构的性质:以及对这些数据结构的性质:主要是用来知识整理与复习: 顺序表:顺序表是指,将元素顺序地存放在一块连续的内存中:元素间的顺序关系由他们的存储顺序自然表示:c++声明一个数组:int a[10]; 即构建了10个int内存大小(40bytes)的顺序表:

【经典数据结构】B树与B+树

本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据.对其进行排序并允许以O(log n)的时间复杂度运行进行查找.顺序读取.插入和删除的数据结构.B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树.与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作.B-tree算法减少定位记录时

【经典数据结构】并查集

等价关系与等价类 若对于每一对元素(a,b),a,b∈S,a R b或者为true或者为false,则称在集合S上定义关系R.如果a R b为true,那么我们说a与b有关系. 等价关系(equivalence relation)是满足下列三个性质的关系R: (1) 自反性:对于所有a∈S,a R a (2) 对称性:若a R b当且仅当b R a (3) 传递性:若a R b且b R c 则a R c 关系“≤”不是等价关系.虽然它是自反的(即a≤a).可传递的(即由a≤b和b≤c得出a≤c)

【经典数据结构】哈希表

哈希表的基本概念 哈希表,也叫散列表,它是基于快速存取的角度设计的,是一种典型的“空间换时间”的做法.哈希表是普通数组的一种推广,因为数组可以直接寻址,故可在O(1)时间内访问数组的任意元素. 哈希表是根据关键字(Key Value)而直接进行访问的数据结构.也就是说,它将关键字通过某种规则映射到数组中的某个位置,以加快查找的速度.这个映射规则称为哈希函数(散列函数),存放记录的数组称为哈希表.哈希表建立了关键字和存储地址之间的一种直接映射关系. 若多个不同的关键字通过哈希函数计算得到相同的数组

【经典数据结构】后缀数组

转自:http://www.acmerblog.com/suffix-array-6150.html 在字符串处理当中,后缀树和后缀数组都是非常有力的工具,其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料.其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也不太逊色,并且,它比后缀树所占用的空间小很多. 后缀树组是一个字符串的所有后缀的排序数组.后缀是指从某个位置 i 开始到整个串末尾结束的一个子串.字符串 r 的从 第 i 个字

【经典数据结构】B树与B+树(转)

本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对B树的定义为"在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据.对其进行排序并允许以O(log n)的时间复杂度运行进行查找.顺序读取.插入和删除的数据结构.B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树.与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作.B-tree算法减少定位记录时

【经典数据结构】Trie

在计算机科学中,trie,又称前缀树或字典树,是一种有种树,用于保存关联数组,其中的键通常是字符串.与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定.一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串.一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值. 以下几个博客的讲解很详细: 1. http://blog.csdn.net/hackbuteer1/article/details/7964147 2. 

常用数据结构和算法操作效率的对比总结

前面介绍了经典的数据结构和算法,这一节我们对这些数据结构和算法做一个总结,具体细节,请参见各个章节的详细介绍,这里我们用表格来呈现它们的效率. 1. 数据结构部分 数据结构中常用的操作的效率表 通用数据结构 查找 插入 删除 遍历 数组 O(N) O(1) O(N) - 有序数组 O(logN) O(N) O(N) O(N) 链表 O(N) O(1) O(N) - 有序链表 O(N) O(N) O(N) O(N) 二叉树 O(logN) O(logN) O(logN) O(N) 二叉树(最坏)