HCoreBase/src/HList.c
coffee 9cebbd2bc7 1. 重改定时器
2. 增加HList
2026-04-01 15:14:41 +08:00

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;
}