/** * 日期: 2026-04-01 * 作者: coffee * 描述: 侵入式双向链表实现 */ #include "HList.h" static void __HListAdd(HList *node, HList *prev, HList *next) { next->prev = node; node->next = next; node->prev = prev; prev->next = node; } static void __HListDel(HList *prev, HList *next) { next->prev = prev; prev->next = next; } void HListInit(HList *list) { if (list == NULL) { return; } list->next = list; list->prev = list; } uint8_t HListIsSelf(const HList *list) { if (list == NULL) { return 0; } return (list->next == list && list->prev == list) ? 1u : 0u; } uint8_t HListEmpty(const HList *head) { if (head == NULL) { return 1; } return (head->next == head) ? 1u : 0u; } size_t HListLen(const HList *head) { size_t len = 0; const HList *pos; if (head == NULL) { return 0; } for (pos = head->next; pos != head; pos = pos->next) { ++len; } return len; } void HListAdd(HList *node, HList *head) { if (node == NULL || head == NULL) { return; } __HListAdd(node, head, head->next); } void HListAddTail(HList *node, HList *head) { if (node == NULL || head == NULL) { return; } __HListAdd(node, head->prev, head); } void HListDel(HList *node) { if (node == NULL || node->next == NULL || node->prev == NULL) { return; } __HListDel(node->prev, node->next); HListInit(node); } void HListReplace(HList *oldNode, HList *newNode) { if (oldNode == NULL || newNode == NULL || oldNode->next == NULL || oldNode->prev == NULL) { return; } newNode->next = oldNode->next; newNode->next->prev = newNode; newNode->prev = oldNode->prev; newNode->prev->next = newNode; HListInit(oldNode); } void HListMove(HList *node, HList *head) { if (node == NULL || head == NULL) { return; } HListDel(node); HListAdd(node, head); } void HListMoveTail(HList *node, HList *head) { if (node == NULL || head == NULL) { return; } HListDel(node); HListAddTail(node, head); } HList *HListPop(HList *head) { HList *node; if (HListEmpty(head)) { return NULL; } node = head->next; HListDel(node); return node; }