Linux散列表(二)——宏

原创 2013年12月04日 20:47:27

散列表宏承接了双向链表宏的风范,好使好用!务必区分“结点”和“元素”!双链表宏博文中已经提及,这里不赘述!

1、获取元素(结构体)基址

#define hlist_entry(ptr, type, member) container_of(ptr,type,member)
#define hlist_entry_safe(ptr, type, member) \
	({ typeof(ptr) ____ptr = (ptr); \
	   ____ptr ? hlist_entry(____ptr, type, member) : NULL; \
	})
第一个不带安全机制,第二个带安全机制,即ptr为NULL时,返回NULL,否则,返回基址!原理点击这里查看container_of

2、操作散列表结点

2.1、遍历散列表结点

#define hlist_for_each(pos, head) \
	for (pos = (head)->first; pos ; pos = pos->next)

2.2、删除散列表结点

#define hlist_for_each_safe(pos, n, head) \
	for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
	     pos = n)

3、操作散列表元素

3.1、从head的first开始遍历

/**
 * hlist_for_each_entry	- iterate over list of given type
 * @pos:	the type * to use as a loop cursor.
 * @head:	the head for your list.
 * @member:	the name of the hlist_node within the struct.
 */
#define hlist_for_each_entry(pos, head, member)				\
	for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\
	     pos;							\
	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))

3.2、从pos的next开始遍历

/**
 * hlist_for_each_entry_continue - iterate over a hlist continuing after current point
 * @pos:	the type * to use as a loop cursor.
 * @member:	the name of the hlist_node within the struct.
 */
#define hlist_for_each_entry_continue(pos, member)			\
	for (pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member);\
	     pos;							\
	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))

3.3、从pos开始遍历

/**
 * hlist_for_each_entry_from - iterate over a hlist continuing from current point
 * @pos:	the type * to use as a loop cursor.
 * @member:	the name of the hlist_node within the struct.
 */
#define hlist_for_each_entry_from(pos, member)				\
	for (; pos;							\
	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))

3.4、从head的first开始删除

/**
 * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry
 * @pos:	the type * to use as a loop cursor.
 * @n:		another &struct hlist_node to use as temporary storage
 * @head:	the head for your list.
 * @member:	the name of the hlist_node within the struct.
 */
#define hlist_for_each_entry_safe(pos, n, head, member) 		\
	for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);\
	     pos && ({ n = pos->member.next; 1; });			\
	     pos = hlist_entry_safe(n, typeof(*pos), member))

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>声明<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

>>     知识要传播,劳动要尊重! 受益于开源,回馈于社会! 大家共参与,服务全人类!     

>>     本博文由my_live_123原创(http://blog.csdn.net/cwcmcw),转载请注明出处!   

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>^_^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<



相关文章推荐

Redis源代码分析之二:散列表——Dict(上)

先介绍Redis散列表实现的几个重要数据结构: 字典项DictEntry: typedef struct dictEntry { void *key; void *val;...

STL源码剖析——散列表hashtable

与前面介绍的底层机制基于红黑树RB-Tree容器不同,本文介绍的是哈希表hash table,在SGI STL中,给出了底层机制基于哈希表的相关容器的介绍,这里介绍hash table的源码剖析,有利...

散列表——分离链接法

散列表由一个二级指针构成,二级指针的每一个节点指向一个单链表。
  • XXNoel
  • XXNoel
  • 2017年05月05日 13:24
  • 134

数据结构学习——散列表ADT(程序化)

不知道大家在刚开始看《数据结构与算法分析——C语言描述》散列一章的时候,能不能理解书上的内容,小ZZ看的时候就没怎么看明白。于是就去问度娘,度娘给了我这样一篇文章。里面介绍了散列的基本定义以及常用的实...

学习JavaScript数据结构与算法(七)——散列表(一)

散列表

STL关联式容器之散列表——hashtable

以散列表为基础的关联式容器深受人们的喜欢,虽然它们目前还不是STL的标准,但是SGI的STL已经包含了这些内容。 前面学习的关联式容器都是基于红黑树这样一种二叉搜索树,也正因为这样,如果要求搜索时间具...

数据结构——哈希表(散列表)

导言: 数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希...

Linux内核中的PID散列表实例

开发平台:基于虚拟机的Ubuntu 11.04     内核源码:linux-2.6.38.8.tar.bz2     目标平台:ARM体系结构     参考文献:《深入Linux内...

Linux内核中的PID散列表实例

开发平台:基于虚拟机的Ubuntu 11.04     内核源码:linux-2.6.38.8.tar.bz2     目标平台:ARM体系结构     参考文献:《深入Linux内核架构》 ...
  • npy_lp
  • npy_lp
  • 2012年03月27日 12:25
  • 6264
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux散列表(二)——宏
举报原因:
原因补充:

(最多只允许输入30个字)