swlist.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /************************************************************************
  2. * AUTHOR: NiuJiuRu
  3. * FILENAME: swlist.h
  4. * DESCRIPTION: 双向循环链表
  5. * NOTE:
  6. * HISTORY:
  7. * 1, [2013-05-23] created by NiuJiuRu
  8. * 2, [2014-01-17] 修复"xlist_delete()"函数中, reset被删除节点时, 造成链表
  9. 结构被破坏的问题
  10. ***********************************************************************/
  11. #ifndef __SWLIST_H__
  12. #define __SWLIST_H__
  13. // for "offsetof()"
  14. #include <stddef.h>
  15. // 定义链表节点结构
  16. struct xlist_node
  17. {
  18. struct xlist_node *prev;
  19. struct xlist_node *next;
  20. };
  21. // 初始化链表头节点
  22. #define xlist_init(head_node_ptr) ((head_node_ptr)->prev = (head_node_ptr)->next = (head_node_ptr))
  23. // 判断链表是否为空
  24. #define xlist_isempty(head_node_ptr) ((head_node_ptr)->prev == (head_node_ptr) && (head_node_ptr)->next == (head_node_ptr))
  25. // 在链表尾新增一个节点
  26. #define xlist_add(head_node_ptr, new_node_ptr) \
  27. do{ \
  28. (new_node_ptr)->prev = (head_node_ptr)->prev; \
  29. (new_node_ptr)->prev->next = (new_node_ptr); \
  30. (new_node_ptr)->next = (head_node_ptr); \
  31. (head_node_ptr)->prev = (new_node_ptr); \
  32. }while(0)
  33. // 在链表中的某个节点后插入一个新节点
  34. #define xlist_insert(one_node_ptr, new_node_ptr) \
  35. do{ \
  36. (new_node_ptr)->next = (one_node_ptr)->next; \
  37. (new_node_ptr)->next->prev = (new_node_ptr); \
  38. (new_node_ptr)->prev = (one_node_ptr); \
  39. (one_node_ptr)->next = (new_node_ptr); \
  40. }while(0)
  41. // 从链表中移除一个节点
  42. #define xlist_delete(one_node_ptr) \
  43. do{ \
  44. struct xlist_node *delete_node_ptr = one_node_ptr; \
  45. (one_node_ptr)->next->prev = (one_node_ptr)->prev; \
  46. (one_node_ptr)->prev->next = (one_node_ptr)->next; \
  47. (delete_node_ptr)->prev = (delete_node_ptr)->next = (delete_node_ptr); \
  48. }while(0)
  49. // 将链表中的某个节点与其后续节点进行位置交换
  50. #define xlist_swap(one_node_ptr) \
  51. do{ \
  52. struct xlist_node *next_node_ptr; \
  53. (next_node_ptr) = (one_node_ptr)->next; \
  54. (one_node_ptr)->next = (next_node_ptr)->next; \
  55. (one_node_ptr)->next->prev = (one_node_ptr); \
  56. (next_node_ptr)->prev = (one_node_ptr)->prev; \
  57. (next_node_ptr)->prev->next = (next_node_ptr); \
  58. (next_node_ptr)->next = (one_node_ptr); \
  59. (one_node_ptr)->prev = (next_node_ptr); \
  60. }while(0)
  61. // 替换链表中的一个节点
  62. #define xlist_replace(old_node_ptr, new_node_ptr) \
  63. do{ \
  64. (new_node_ptr)->next = (old_node_ptr)->next; \
  65. (new_node_ptr)->next->prev = (new_node_ptr); \
  66. (new_node_ptr)->prev = (old_node_ptr)->prev; \
  67. (new_node_ptr)->prev->next = (new_node_ptr); \
  68. (old_node_ptr)->prev = (old_node_ptr)->next = (old_node_ptr); \
  69. }while(0)
  70. // 根据链表中的某个节点地址, 获取该节点自身所在结构体对象的入口地址
  71. #define xlist_entry(one_node_ptr, struct_name, member_name) \
  72. (struct_name *)((char *)(one_node_ptr) - offsetof(struct_name, member_name))
  73. #endif /* __SWLIST_H__ */