| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- /************************************************************************
- * AUTHOR: NiuJiuRu
- * FILENAME: swlist.h
- * DESCRIPTION: 双向循环链表
- * NOTE:
- * HISTORY:
- * 1, [2013-05-23] created by NiuJiuRu
- * 2, [2014-01-17] 修复"xlist_delete()"函数中, reset被删除节点时, 造成链表
- 结构被破坏的问题
- ***********************************************************************/
- #ifndef __SWLIST_H__
- #define __SWLIST_H__
- // for "offsetof()"
- #include <stddef.h>
- // 定义链表节点结构
- struct xlist_node
- {
- struct xlist_node *prev;
- struct xlist_node *next;
- };
- // 初始化链表头节点
- #define xlist_init(head_node_ptr) ((head_node_ptr)->prev = (head_node_ptr)->next = (head_node_ptr))
- // 判断链表是否为空
- #define xlist_isempty(head_node_ptr) ((head_node_ptr)->prev == (head_node_ptr) && (head_node_ptr)->next == (head_node_ptr))
- // 在链表尾新增一个节点
- #define xlist_add(head_node_ptr, new_node_ptr) \
- do{ \
- (new_node_ptr)->prev = (head_node_ptr)->prev; \
- (new_node_ptr)->prev->next = (new_node_ptr); \
- (new_node_ptr)->next = (head_node_ptr); \
- (head_node_ptr)->prev = (new_node_ptr); \
- }while(0)
- // 在链表中的某个节点后插入一个新节点
- #define xlist_insert(one_node_ptr, new_node_ptr) \
- do{ \
- (new_node_ptr)->next = (one_node_ptr)->next; \
- (new_node_ptr)->next->prev = (new_node_ptr); \
- (new_node_ptr)->prev = (one_node_ptr); \
- (one_node_ptr)->next = (new_node_ptr); \
- }while(0)
- // 从链表中移除一个节点
- #define xlist_delete(one_node_ptr) \
- do{ \
- struct xlist_node *delete_node_ptr = one_node_ptr; \
- (one_node_ptr)->next->prev = (one_node_ptr)->prev; \
- (one_node_ptr)->prev->next = (one_node_ptr)->next; \
- (delete_node_ptr)->prev = (delete_node_ptr)->next = (delete_node_ptr); \
- }while(0)
- // 将链表中的某个节点与其后续节点进行位置交换
- #define xlist_swap(one_node_ptr) \
- do{ \
- struct xlist_node *next_node_ptr; \
- (next_node_ptr) = (one_node_ptr)->next; \
- (one_node_ptr)->next = (next_node_ptr)->next; \
- (one_node_ptr)->next->prev = (one_node_ptr); \
- (next_node_ptr)->prev = (one_node_ptr)->prev; \
- (next_node_ptr)->prev->next = (next_node_ptr); \
- (next_node_ptr)->next = (one_node_ptr); \
- (one_node_ptr)->prev = (next_node_ptr); \
- }while(0)
- // 替换链表中的一个节点
- #define xlist_replace(old_node_ptr, new_node_ptr) \
- do{ \
- (new_node_ptr)->next = (old_node_ptr)->next; \
- (new_node_ptr)->next->prev = (new_node_ptr); \
- (new_node_ptr)->prev = (old_node_ptr)->prev; \
- (new_node_ptr)->prev->next = (new_node_ptr); \
- (old_node_ptr)->prev = (old_node_ptr)->next = (old_node_ptr); \
- }while(0)
- // 根据链表中的某个节点地址, 获取该节点自身所在结构体对象的入口地址
- #define xlist_entry(one_node_ptr, struct_name, member_name) \
- (struct_name *)((char *)(one_node_ptr) - offsetof(struct_name, member_name))
- #endif /* __SWLIST_H__ */
|