RyanMqttList.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include "RyanMqttList.h"
  2. /**
  3. * @brief 内部函数:在prev和next节点之间插入新节点
  4. *
  5. * @param node 要插入的新节点指针
  6. * @param prev 前驱节点指针
  7. * @param next 后继节点指针
  8. * @note 这是一个静态内部函数,不对外暴露
  9. */
  10. static void RyanMqttListInsertBetween(RyanMqttList_t *node, RyanMqttList_t *prev, RyanMqttList_t *next)
  11. {
  12. next->prev = node; // 后继节点的前驱指向新节点
  13. node->next = next; // 新节点的后继指向原后继节点
  14. node->prev = prev; // 新节点的前驱指向原前驱节点
  15. prev->next = node; // 前驱节点的后继指向新节点
  16. }
  17. /**
  18. * @brief 内部函数:删除prev和next之间的节点
  19. *
  20. * @param prev 要删除区间的前驱节点
  21. * @param next 要删除区间的后继节点
  22. * @note 这是一个静态内部函数,不对外暴露
  23. */
  24. static void RyanMqttListRemoveBetween(RyanMqttList_t *prev, RyanMqttList_t *next)
  25. {
  26. prev->next = next; // 前驱节点直接指向后继节点
  27. next->prev = prev; // 后继节点直接指向前驱节点
  28. }
  29. /**
  30. * @brief 内部函数:删除指定节点自身
  31. *
  32. * @param entry 要删除的节点指针
  33. * @note 通过修改前后节点的指针关系实现自我删除
  34. */
  35. static void RyanMqttListRemoveNode(RyanMqttList_t *entry)
  36. {
  37. RyanMqttListRemoveBetween(entry->prev, entry->next); // 调用区间删除函数
  38. }
  39. /**
  40. * @brief 初始化链表头节点
  41. *
  42. * @param list 链表头节点指针
  43. * @note 将头节点的前后指针都指向自己,形成空链表
  44. */
  45. void RyanMqttListInit(RyanMqttList_t *list)
  46. {
  47. list->next = list; // 后继指向自己
  48. list->prev = list; // 前驱指向自己
  49. }
  50. /**
  51. * @brief 在链表头部插入节点
  52. *
  53. * @param node 要插入的新节点
  54. * @param list 链表头节点
  55. * @note 新节点将插入到头节点之后,成为第一个有效节点
  56. */
  57. void RyanMqttListAdd(RyanMqttList_t *node, RyanMqttList_t *list)
  58. {
  59. RyanMqttListInsertBetween(node, list, list->next); // 在头节点和第一个节点间插入
  60. }
  61. /**
  62. * @brief 在链表尾部插入节点
  63. *
  64. * @param node 要插入的新节点
  65. * @param list 链表头节点
  66. * @note 新节点将插入到头节点之前,成为最后一个有效节点
  67. */
  68. void RyanMqttListAddTail(RyanMqttList_t *node, RyanMqttList_t *list)
  69. {
  70. RyanMqttListInsertBetween(node, list->prev, list); // 在尾节点和头节点间插入
  71. }
  72. /**
  73. * @brief 从链表中删除指定节点
  74. *
  75. * @param entry 要删除的节点
  76. * @note 只删除节点,不重新初始化该节点
  77. */
  78. void RyanMqttListDel(RyanMqttList_t *entry)
  79. {
  80. RyanMqttListRemoveNode(entry); // 调用内部删除函数
  81. }
  82. /**
  83. * @brief 从链表中删除并重新初始化指定节点
  84. *
  85. * @param entry 要删除的节点
  86. * @note 删除后会将该节点初始化为独立节点
  87. */
  88. void RyanMqttListDelInit(RyanMqttList_t *entry)
  89. {
  90. RyanMqttListRemoveNode(entry); // 先删除节点
  91. RyanMqttListInit(entry); // 再重新初始化该节点
  92. }
  93. /**
  94. * @brief 将节点移动到链表头部
  95. *
  96. * @param node 要移动的节点
  97. * @param list 链表头节点
  98. * @note 先删除节点,再插入到头部
  99. */
  100. void RyanMqttListMove(RyanMqttList_t *node, RyanMqttList_t *list)
  101. {
  102. RyanMqttListRemoveNode(node); // 先从原位置删除
  103. RyanMqttListAdd(node, list); // 再插入到头部
  104. }
  105. /**
  106. * @brief 将节点移动到链表尾部
  107. *
  108. * @param node 要移动的节点
  109. * @param list 链表头节点
  110. * @note 先删除节点,再插入到尾部
  111. */
  112. void RyanMqttListMoveTail(RyanMqttList_t *node, RyanMqttList_t *list)
  113. {
  114. RyanMqttListRemoveNode(node); // 先从原位置删除
  115. RyanMqttListAddTail(node, list); // 再插入到尾部
  116. }
  117. /**
  118. * @brief 检查链表是否为空
  119. *
  120. * @param list 链表头节点
  121. * @return int 返回1表示空链表,0表示非空
  122. * @note 通过判断头节点是否指向自己来确定是否为空
  123. */
  124. int RyanMqttListIsEmpty(RyanMqttList_t *list)
  125. {
  126. return list->next == list; // 头节点的next指向自己说明为空
  127. }