| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- #include "RyanMqttList.h"
- /**
- * @brief 内部函数:在prev和next节点之间插入新节点
- *
- * @param node 要插入的新节点指针
- * @param prev 前驱节点指针
- * @param next 后继节点指针
- * @note 这是一个静态内部函数,不对外暴露
- */
- static void RyanMqttListInsertBetween(RyanMqttList_t *node, RyanMqttList_t *prev, RyanMqttList_t *next)
- {
- next->prev = node; // 后继节点的前驱指向新节点
- node->next = next; // 新节点的后继指向原后继节点
- node->prev = prev; // 新节点的前驱指向原前驱节点
- prev->next = node; // 前驱节点的后继指向新节点
- }
- /**
- * @brief 内部函数:删除prev和next之间的节点
- *
- * @param prev 要删除区间的前驱节点
- * @param next 要删除区间的后继节点
- * @note 这是一个静态内部函数,不对外暴露
- */
- static void RyanMqttListRemoveBetween(RyanMqttList_t *prev, RyanMqttList_t *next)
- {
- prev->next = next; // 前驱节点直接指向后继节点
- next->prev = prev; // 后继节点直接指向前驱节点
- }
- /**
- * @brief 内部函数:删除指定节点自身
- *
- * @param entry 要删除的节点指针
- * @note 通过修改前后节点的指针关系实现自我删除
- */
- static void RyanMqttListRemoveNode(RyanMqttList_t *entry)
- {
- RyanMqttListRemoveBetween(entry->prev, entry->next); // 调用区间删除函数
- }
- /**
- * @brief 初始化链表头节点
- *
- * @param list 链表头节点指针
- * @note 将头节点的前后指针都指向自己,形成空链表
- */
- void RyanMqttListInit(RyanMqttList_t *list)
- {
- list->next = list; // 后继指向自己
- list->prev = list; // 前驱指向自己
- }
- /**
- * @brief 在链表头部插入节点
- *
- * @param node 要插入的新节点
- * @param list 链表头节点
- * @note 新节点将插入到头节点之后,成为第一个有效节点
- */
- void RyanMqttListAdd(RyanMqttList_t *node, RyanMqttList_t *list)
- {
- RyanMqttListInsertBetween(node, list, list->next); // 在头节点和第一个节点间插入
- }
- /**
- * @brief 在链表尾部插入节点
- *
- * @param node 要插入的新节点
- * @param list 链表头节点
- * @note 新节点将插入到头节点之前,成为最后一个有效节点
- */
- void RyanMqttListAddTail(RyanMqttList_t *node, RyanMqttList_t *list)
- {
- RyanMqttListInsertBetween(node, list->prev, list); // 在尾节点和头节点间插入
- }
- /**
- * @brief 从链表中删除指定节点
- *
- * @param entry 要删除的节点
- * @note 只删除节点,不重新初始化该节点
- */
- void RyanMqttListDel(RyanMqttList_t *entry)
- {
- RyanMqttListRemoveNode(entry); // 调用内部删除函数
- }
- /**
- * @brief 从链表中删除并重新初始化指定节点
- *
- * @param entry 要删除的节点
- * @note 删除后会将该节点初始化为独立节点
- */
- void RyanMqttListDelInit(RyanMqttList_t *entry)
- {
- RyanMqttListRemoveNode(entry); // 先删除节点
- RyanMqttListInit(entry); // 再重新初始化该节点
- }
- /**
- * @brief 将节点移动到链表头部
- *
- * @param node 要移动的节点
- * @param list 链表头节点
- * @note 先删除节点,再插入到头部
- */
- void RyanMqttListMove(RyanMqttList_t *node, RyanMqttList_t *list)
- {
- RyanMqttListRemoveNode(node); // 先从原位置删除
- RyanMqttListAdd(node, list); // 再插入到头部
- }
- /**
- * @brief 将节点移动到链表尾部
- *
- * @param node 要移动的节点
- * @param list 链表头节点
- * @note 先删除节点,再插入到尾部
- */
- void RyanMqttListMoveTail(RyanMqttList_t *node, RyanMqttList_t *list)
- {
- RyanMqttListRemoveNode(node); // 先从原位置删除
- RyanMqttListAddTail(node, list); // 再插入到尾部
- }
- /**
- * @brief 检查链表是否为空
- *
- * @param list 链表头节点
- * @return int 返回1表示空链表,0表示非空
- * @note 通过判断头节点是否指向自己来确定是否为空
- */
- int RyanMqttListIsEmpty(RyanMqttList_t *list)
- {
- return list->next == list; // 头节点的next指向自己说明为空
- }
|