129 lines
2.3 KiB
C
129 lines
2.3 KiB
C
/**
|
|
* 日期: 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;
|
|
}
|