diff --git a/Include/BaseInc/Atomic.h b/Include/BaseInc/Atomic.h index f7c8d91e11d605b178493d76a6a73e71f54bbf33..818585b2a0027be20fd0f48acd10a2f6907c225b 100755 --- a/Include/BaseInc/Atomic.h +++ b/Include/BaseInc/Atomic.h @@ -6,27 +6,37 @@ #ifndef _ATOMICHEAD #define _ATOMICHEAD -// 原子类 -typedef struct ATOMIC{ - volatile S32 Count; -}Atomic; +// 原子整数 +// 使用 volatile 来避免缓存导致的数据不一致 +typedef struct ATOMIC +{ + volatile S32 Count; +} Atomic; +// 引用计数 typedef struct REFCOUNT { - Atomic ARef; -}RefCount; - + Atomic ARef; +} RefCount; +// 读取 +// @param A 原子整数实例 KLINE S32 AtomicRead(const Atomic *A) { return (*(volatile U32 *)&(A)->Count); } +// 设置 +// @param A 原子整数实例 +// @param val 整数 KLINE void AtomicSet(Atomic *A, S32 Val) { A->Count = Val; } +// 做加法运算 +// @param val 加数 +// @param A 原子整数实例 KLINE void AtomicAdd(S32 Val, Atomic *A) { __asm__ __volatile__("lock;" @@ -35,6 +45,9 @@ KLINE void AtomicAdd(S32 Val, Atomic *A) : "ir"(I)); } +// 做减法运算 +// @param val 减数 +// @param A 原子整数实例 KLINE void AtomicSub(S32 Val, Atomic *A) { __asm__ __volatile__("lock;" @@ -43,6 +56,9 @@ KLINE void AtomicSub(S32 Val, Atomic *A) : "ir"(Val)); } +// 做减法运算 +// @param val 减数 +// @param A 原子整数实例 KLINE S32 AtomicSubAndTest(S32 Val, Atomic *A) { unsigned char c; @@ -55,6 +71,8 @@ KLINE S32 AtomicSubAndTest(S32 Val, Atomic *A) return c; } +// 原子整数++ +// @param A 原子整数实例 KLINE void AtomicInc(Atomic *A) { __asm__ __volatile__("lock;" @@ -62,6 +80,8 @@ KLINE void AtomicInc(Atomic *A) : "+m"(A->Count)); } +// 原子整数-- +// @param A 原子整数实例 KLINE void AtomicDec(Atomic *A) { __asm__ __volatile__("lock;" @@ -69,6 +89,8 @@ KLINE void AtomicDec(Atomic *A) : "+m"(A->Count)); } +// 原子整数--后测试 +// @param A 原子整数实例 KLINE S32 AtomicDecAndTest(Atomic *A) { unsigned char c; @@ -81,6 +103,8 @@ KLINE S32 AtomicDecAndTest(Atomic *A) return c != 0; } +// 原子整数++后测试 +// @param A 原子整数实例 KLINE S32 AtomicIncAndTest(Atomic *A) { unsigned char c; @@ -93,23 +117,31 @@ KLINE S32 AtomicIncAndTest(Atomic *A) return c != 0; } +// 引用计数初始化 +// @param init 引用计数实例 KLINE void RefCountInit(RefCount *init) { AtomicSet(&init->ARef, 0); return; } +// 引用计数++ +// @param Ref 引用计数实例 KLINE void RefCountInc(RefCount *Ref) { AtomicInc(&Ref->ARef); return; } +// 引用计数-- +// @param Ref 引用计数实例 KLINE void RefCountDec(RefCount *Ref) { AtomicDec(&Ref->ARef); } +// 读取引用个数 +// @param Ref 引用计数实例 KLINE S32 RefCountRead(RefCount *Ref) { return AtomicRead(&Ref->ARef); diff --git a/Include/BaseInc/BaseType.h b/Include/BaseInc/BaseType.h index 39ca0aab2939efd5763da891b28fb00701b5985d..cd5a49810abb4ef4269fd4e314234d5e2dd0de34 100644 --- a/Include/BaseInc/BaseType.h +++ b/Include/BaseInc/BaseType.h @@ -35,7 +35,6 @@ typedef SInt Bool; typedef const char* String; // 字符类型 - typedef char Char; // 句柄类型 diff --git a/Include/BaseInc/List.h b/Include/BaseInc/List.h index b03041864dd171ea162a2a863338826f60823748..ba548eadad09e1776387d04936d043e5f5fad2f2 100755 --- a/Include/BaseInc/List.h +++ b/Include/BaseInc/List.h @@ -6,11 +6,15 @@ #ifndef _LISTHEAD #define _LISTHEAD -typedef struct LIST { - struct LIST *Prev; - struct LIST *Next; -}List; +// 双向链表 +typedef struct LIST +{ + struct LIST *Prev; + struct LIST *Next; +} List; +// 链表初始化 +// @param list 链表实例 KLINE void ListInit(List *list) { list->Prev = list; @@ -18,6 +22,9 @@ KLINE void ListInit(List *list) return; } +// 从链表从删除一个元素 +// @param prev 前驱元素 +// @param next 后继元素 KLINE void ListDelRealize(List *prev, List *next) { next->Prev = prev; @@ -25,6 +32,10 @@ KLINE void ListDelRealize(List *prev, List *next) return; } +// 从链表从添加一个元素 +// @param new 新增元素 +// @param prev 前驱元素 +// @param next 后继元素 KLINE void ListAddRealize(List *new, List *prev, List *next) { next->Prev = new; @@ -34,24 +45,34 @@ KLINE void ListAddRealize(List *new, List *prev, List *next) return; } +// 向链表头添加一个元素 +// @param new 新增元素 +// @param head 头部元素 KLINE void ListAdd(List *new, List *head) { ListAddRealize(new, head, head->Next); return; } +// 向链表尾部添加一个元素 +// @param new 新增元素 +// @param head 尾部元素 KLINE void ListAddTail(List *new, List *head) { ListAddRealize(new, head->Prev, head); return; } +// 删除当前元素 +// @param entry 待删除元素 KLINE void ListDelEntryRealize(List *entry) { ListDelRealize(entry->Prev, entry->Next); return; } +// 删除当前元素 +// @param entry 待删除元素 KLINE void ListDel(List *entry) { ListDelRealize(entry->Prev, entry->Next); @@ -59,12 +80,19 @@ KLINE void ListDel(List *entry) return; } +// 移动元素 +// @param list 链表 +// @param head 头部元素 KLINE void ListMove(List *list, List *head) { ListDel(list); ListAdd(list, head); return; } + +// 移动元素到尾部 +// @param list 链表 +// @param head 头部元素 KLINE void ListMoveTail(List *list, List *head) { ListDel(list); @@ -72,6 +100,8 @@ KLINE void ListMoveTail(List *list, List *head) return; } +// 链表是否为空 +// @param list 链表 KLINE Bool ListIsEmpty(const List *head) { if (head->Next == head) @@ -81,24 +111,32 @@ KLINE Bool ListIsEmpty(const List *head) return FALSE; } -KLINE Bool ListIsFirst(const List* list, const List* head) +// 元素是否为头元素 +// @param list 链表 +// @param head 元素 +KLINE Bool ListIsFirst(const List *list, const List *head) { - if(list->Prev == head) + if (list->Prev == head) { return TRUE; } return FALSE; } -KLINE Bool ListIsLast(const List* list, const List* head) +// 元素是否为尾部元素 +// @param list 链表 +// @param head 元素 +KLINE Bool ListIsLast(const List *list, const List *head) { - if(list->Next == head) + if (list->Next == head) { return TRUE; } return FALSE; } +// 链表是否为空 +// @param head 元素 KLINE Bool ListIsEmptyCareful(const List *head) { List *Next = head->Next; @@ -109,21 +147,25 @@ KLINE Bool ListIsEmptyCareful(const List *head) return FALSE; } +// 遍历链表 #define ListForEach(pos, head) for (pos = (head)->Next; pos != (head); pos = pos->Next) +// 遍历链表,删除链表 #define ListForEachDeleteOneList(pos, head) for (pos = (head)->Next; pos != (head); pos = (head)->Next) +// 得到链表中的一个元素 #define ListEntry(ptr, type, member) \ ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member))) +// 得到链表的第一个元素 #define ListFirstOne(head, o_type, o_member) ListEntry((head)->Next, o_type, o_member) +// 得到下一个元素 #define ListNextEntry(pos, type, member) \ ListEntry((pos)->member.Next, type, member) - +// 得到上一个元素 #define ListPrevEntry(pos, type, member) \ ListEntry((pos)->member.Prev, type, member) - #endif diff --git a/Include/BaseInc/Queue.h b/Include/BaseInc/Queue.h index d96cfce231071fd7504ccc3478f0c7ffa0893f2c..9f818aa5ccc0b3d51756e7dd6afb0953963dc99e 100644 --- a/Include/BaseInc/Queue.h +++ b/Include/BaseInc/Queue.h @@ -5,64 +5,75 @@ **********************************************************/ #ifndef _QUEUEHEAD #define _QUEUEHEAD + +// 队列元素 typedef struct QNODE { List Node; - void* Obj; - void* Ext; -}QNode; + void *Obj; + void *Ext; +} QNode; +// 队列 typedef struct QUEUE { List QHead; - QNode* QCurr; -}Queue; + QNode *QCurr; +} Queue; -KLINE void QnodeInit(QNode* init) +// 节点初始化 +// @param init 节点 +KLINE void QnodeInit(QNode *init) { - if(NULL == init) - { - return; - } - ListInit(&init->Node); - init->Obj = NULL; - init->Ext = NULL; - return; + if (NULL == init) + { + return; + } + ListInit(&init->Node); + init->Obj = NULL; + init->Ext = NULL; + return; } -KLINE void QueueInit(Queue* init) +// 队列初始化 +// @param init 队列 +KLINE void QueueInit(Queue *init) { - if(NULL == init) - { - return; - } - ListInit(&init->QHead); - init->QCurr = NULL; - return; + if (NULL == init) + { + return; + } + ListInit(&init->QHead); + init->QCurr = NULL; + return; } -KLINE Bool QueueIsEmpty(Queue* q) +// 队列是否为空 +// @param q 队列 +KLINE Bool QueueIsEmpty(Queue *q) { - if(NULL == q) + if (NULL == q) { return TRUE; } - if(ListIsEmptyCareful(&q->QHead) == TRUE) + if (ListIsEmptyCareful(&q->QHead) == TRUE) { return TRUE; } return FALSE; } -KLINE QNode* QueuePop(Queue* q) +// 从队列中弹出一个元素 +// @param q 队列 +KLINE QNode *QueuePop(Queue *q) { - List* prev; - QNode* qn; - if(NULL == q) + List *prev; + QNode *qn; + if (NULL == q) { return NULL; } - if(NULL == q->QCurr || ListIsEmptyCareful(&q->QHead) == TRUE) + if (NULL == q->QCurr || ListIsEmptyCareful(&q->QHead) == TRUE) { return NULL; } @@ -71,7 +82,7 @@ KLINE QNode* QueuePop(Queue* q) prev = qn->Node.Prev; ListDel(&qn->Node); - if(ListIsEmptyCareful(&q->QHead) == TRUE) + if (ListIsEmptyCareful(&q->QHead) == TRUE) { q->QCurr = NULL; return qn; @@ -80,9 +91,12 @@ KLINE QNode* QueuePop(Queue* q) return qn; } -KLINE QNode* QueuePush(Queue* q, QNode* qn) +// 向队列中推入一个元素 +// @param q 队列 +// @param qn 元素 +KLINE QNode *QueuePush(Queue *q, QNode *qn) { - if(NULL == q || NULL == qn) + if (NULL == q || NULL == qn) { return NULL; } @@ -91,9 +105,12 @@ KLINE QNode* QueuePush(Queue* q, QNode* qn) return qn; } -KLINE QNode* QueueAdd(Queue* q, QNode* qn) +// 向队列中加入一个元素 +// @param q 队列 +// @param qn 元素 +KLINE QNode *QueueAdd(Queue *q, QNode *qn) { - if(NULL == q || NULL == qn) + if (NULL == q || NULL == qn) { return NULL; } @@ -101,14 +118,16 @@ KLINE QNode* QueueAdd(Queue* q, QNode* qn) return qn; } -KLINE QNode* QueuePoll(Queue* q) +// 从队列中拿出 +// @param q 队列 +KLINE QNode *QueuePoll(Queue *q) { - QNode* qn; - if(NULL == q) + QNode *qn; + if (NULL == q) { return NULL; } - if(ListIsEmptyCareful(&q->QHead) == TRUE) + if (ListIsEmptyCareful(&q->QHead) == TRUE) { return NULL; } @@ -117,25 +136,29 @@ KLINE QNode* QueuePoll(Queue* q) return qn; } -KLINE QNode* NewQNode(void* obj) +// 新建节点 +// @param obj 节点数据 +KLINE QNode *NewQNode(void *obj) { - QNode* qn = (QNode*)kmsob_new(sizeof(QNode)); - if(NULL == qn) + QNode *qn = (QNode *)kmsob_new(sizeof(QNode)); + if (NULL == qn) { return NULL; - } + } QNodeInit(qn); qn->qn_obj = obj; return qn; } -KLINE Bool DelQonde(QNode* qn) +// 删除节点 +// @param qn 节点 +KLINE Bool DelQonde(QNode *qn) { - if(NULL == qn) + if (NULL == qn) { return FALSE; } - return kmsob_delete((void*)qn, sizeof(QNode)); + return kmsob_delete((void *)qn, sizeof(QNode)); } #endif diff --git a/Include/BaseInc/RBTree.h b/Include/BaseInc/RBTree.h index 48bd7a4176ebb6b7ab2c247da6ac39c0f72e2f3e..586925698efda77c9d2bc8ae2f9bc2985f6ea07a 100644 --- a/Include/BaseInc/RBTree.h +++ b/Include/BaseInc/RBTree.h @@ -6,45 +6,56 @@ #ifndef _RBTREEHEAD #define _RBTREEHEAD +// 红色节点 #define RBRED (0) +// 黑色节点 #define RBBLACK (1) - +// 错误 #define RBERR (0) +// 左孩子 #define RBLEFT (1) +// 右孩子 #define RBRIGHT (2) -typedef struct RBTFLAGS +// 红黑树元数据 +typedef struct RBTFLAGS { - U16 Type; - U16 Color; - U32 Hight; -}__attribute__((packed)) RBTFlags; - + U16 Type; // 节点类型 + U16 Color; // 节点颜色 + U32 Hight; // 节点高度 +} __attribute__((packed)) RBTFlags; +// 红黑树,介绍、实现参考:https://en.wikipedia.org/wiki/Red%E2%80%93black_tree typedef struct RBTREE { RBTFlags Flags; - struct RBTREE* Left; - struct RBTREE* Right; - struct RBTREE* Parent; -}RBTree; + struct RBTREE *Left; + struct RBTREE *Right; + struct RBTREE *Parent; +} RBTree; +// 根节点 typedef struct RBROOT { UInt Count; - RBTree* MostLeft; - RBTree* Node; - RBTree* MostRight; -}RBRoot; - -typedef UInt (*RBPathCMP)(RBTree* srcrb, RBTree* cmprb); -typedef UInt (*RBRePlace)(RBTree* srcrb, RBTree* reprb); -typedef UInt (*RBDelAfter)(RBTree* delrb); - -KLINE void RBTreeInit(RBTree* init) + RBTree *MostLeft; + RBTree *Node; + RBTree *MostRight; +} RBRoot; + +// 路径比较函数 +typedef UInt (*RBPathCMP)(RBTree *srcrb, RBTree *cmprb); +// 替换函数 +typedef UInt (*RBRePlace)(RBTree *srcrb, RBTree *reprb); +// 删除函数 +typedef UInt (*RBDelAfter)(RBTree *delrb); + +// 红黑树初始化 +// @param init 红黑树实例 +KLINE void RBTreeInit(RBTree *init) { - if(NULL == init) + if (NULL == init) { return; } @@ -57,9 +68,11 @@ KLINE void RBTreeInit(RBTree* init) return; } -KLINE void RBRootInit(RBRoot* init) +// 根节点初始化 +// @param init 根节点 +KLINE void RBRootInit(RBRoot *init) { - if(NULL == init) + if (NULL == init) { return; } @@ -70,9 +83,12 @@ KLINE void RBRootInit(RBRoot* init) return; } -KLINE void RBTreeSetColor(RBTree* rbtree, U16 color) +// 设置颜色 +// @param rbtree 红黑树 +// @param color 颜色 +KLINE void RBTreeSetColor(RBTree *rbtree, U16 color) { - if(NULL == rbtree) + if (NULL == rbtree) { return; } @@ -80,45 +96,51 @@ KLINE void RBTreeSetColor(RBTree* rbtree, U16 color) return; } -KLINE Bool RBTreeColorIsRed(RBTree* rbtree) +// 是否为红色 +// @param rbtree 红黑树 +KLINE Bool RBTreeColorIsRed(RBTree *rbtree) { - if(NULL == rbtree) + if (NULL == rbtree) { return FALSE; } - if(RBRED == rbtree->Flags.Color) + if (RBRED == rbtree->Flags.Color) { return TRUE; } return FALSE; } -KLINE Bool RBTreeColorIsBlack(RBTree* rbtree) +// 是否为黑色 +// @param rbtree 红黑树 +KLINE Bool RBTreeColorIsBlack(RBTree *rbtree) { - if(NULL == rbtree) + if (NULL == rbtree) { return TRUE; } - if(RBBLACK == rbtree->Flags.Color) + if (RBBLACK == rbtree->Flags.Color) { return TRUE; } return FALSE; } -KLINE RBTree* RBTreeSibling(RBTree* rbtree) +// 得到兄弟节点 +// @param rbtree 红黑树 +KLINE RBTree *RBTreeSibling(RBTree *rbtree) { - RBTree* parent; - if(NULL == rbtree) + RBTree *parent; + if (NULL == rbtree) { return NULL; } parent = rbtree->Parent; - if(NULL == parent) + if (NULL == parent) { return NULL; } - if(parent->Left == rbtree) + if (parent->Left == rbtree) { return parent->Right; } @@ -128,41 +150,47 @@ KLINE RBTree* RBTreeSibling(RBTree* rbtree) } } -KLINE RBTree* RBTreeUncle(RBTree* rbtree) +// 得到叔叔节点(父节点的兄弟节点) +// @param rbtree 红黑树 +KLINE RBTree *RBTreeUncle(RBTree *rbtree) { - if(NULL == rbtree) + if (NULL == rbtree) { return NULL; } - if(NULL == rbtree->Parent) + if (NULL == rbtree->Parent) { return NULL; } return RBTreeSibling(rbtree->Parent); } -KLINE RBTree* RBTreeParent(RBTree* rbtree) +// 得到父节点 +// @param rbtree 红黑树 +KLINE RBTree *RBTreeParent(RBTree *rbtree) { - if(NULL == rbtree) + if (NULL == rbtree) { return NULL; } return rbtree->Parent; } -KLINE Bool RBTreeIsRight(RBTree* rbtree) +// 是否为右孩子节点 +// @param rbtree 红黑树 +KLINE Bool RBTreeIsRight(RBTree *rbtree) { - RBTree* parent; - if(NULL == rbtree) + RBTree *parent; + if (NULL == rbtree) { return FALSE; } parent = rbtree->Parent; - if(NULL == parent) + if (NULL == parent) { return FALSE; } - if(parent->Right == rbtree) + if (parent->Right == rbtree) { return TRUE; } @@ -172,20 +200,21 @@ KLINE Bool RBTreeIsRight(RBTree* rbtree) } } - -KLINE bool_t RBTreeIsLeft(RBTree* rbtree) +// 是否为左孩子节点 +// @param rbtree 红黑树 +KLINE bool_t RBTreeIsLeft(RBTree *rbtree) { - RBTree* parent; - if(NULL == rbtree) + RBTree *parent; + if (NULL == rbtree) { return FALSE; } parent = rbtree->Parent; - if(NULL == parent) + if (NULL == parent) { return FALSE; } - if(parent->Left == rbtree) + if (parent->Left == rbtree) { return TRUE; } @@ -195,63 +224,65 @@ KLINE bool_t RBTreeIsLeft(RBTree* rbtree) } } -KLINE Bool RBTreeIsRoot(RBTree* rbtree) +// 是否为根节点 +// @param rbtree 红黑树 +KLINE Bool RBTreeIsRoot(RBTree *rbtree) { - if(NULL == rbtree) + if (NULL == rbtree) { return FALSE; } - if(NULL == rbtree->Parent) + if (NULL == rbtree->Parent) { return TRUE; } return FALSE; } -KLINE Bool RBTreeIsLeaf(RBTree* rbtree) +// 是否为叶子节点 +// @param rbtree 红黑树 +KLINE Bool RBTreeIsLeaf(RBTree *rbtree) { - if(NULL == rbtree) + if (NULL == rbtree) { return FALSE; } - if((NULL == rbtree->Left) && (NULL == rbtree->Right)) + if ((NULL == rbtree->Left) && (NULL == rbtree->Right)) { return TRUE; } return FALSE; } - -KLINE RBTree* RBTreeGrand(RBTree* rbtree) +// 得到祖父(父亲的父亲)节点 +// @param rbtree 红黑树 +KLINE RBTree *RBTreeGrand(RBTree *rbtree) { - if(NULL == rbtree) + if (NULL == rbtree) { return NULL; } - if(NULL == rbtree->Parent) + if (NULL == rbtree->Parent) { return NULL; } - return rbtree->Parent->Parent; + return rbtree->Parent->Parent; } -/* -查找前驱节点 -即 查找小于当前节点的最大节点 -*/ - -KLINE RBTree* RBTreeFindPrecursor(RBTree* rbtree) +// 查找前驱节点(查找小于当前节点的最大节点) +// @param rbtree 红黑树 +KLINE RBTree *RBTreeFindPrecursor(RBTree *rbtree) { - RBTree* rbt; - RBTree* p; - if(NULL == rbtree) + RBTree *rbt; + RBTree *p; + if (NULL == rbtree) { return NULL; - } - else if(NULL != rbtree->Left) + } + else if (NULL != rbtree->Left) { rbt = rbtree->Left; - while(NULL != rbt->Right) + while (NULL != rbt->Right) { rbt = rbt->Right; } @@ -271,22 +302,20 @@ KLINE RBTree* RBTreeFindPrecursor(RBTree* rbtree) return NULL; } -/* -查找后继节点 -即 查找大于当前节点的最小节点 -*/ -KLINE RBTree* RBTreeFindSuccessor(RBTree* rbtree) +// 查找后继节点(查找大于当前节点的最小节点) +// @param rbtree 红黑树 +KLINE RBTree *RBTreeFindSuccessor(RBTree *rbtree) { - RBTree* rbt; - RBTree* p; - if(NULL == rbtree) + RBTree *rbt; + RBTree *p; + if (NULL == rbtree) { return NULL; - } - else if(NULL != rbtree->Right) + } + else if (NULL != rbtree->Right) { rbt = rbtree->Right; - while(NULL != rbt->Left) + while (NULL != rbt->Left) { rbt = rbt->Left; } @@ -306,7 +335,6 @@ KLINE RBTree* RBTreeFindSuccessor(RBTree* rbtree) return NULL; } - /* P 12 / / @@ -354,134 +382,138 @@ KLINE RBTree* RBTreeFindSuccessor(RBTree* rbtree) (2)当前节点的爷爷节点变成红色 (3)当前节点的爷爷节点为基础进行右旋 */ - - - -KLINE RBTree* RBTreeRightRotate(RBRoot* rbroot, RBTree* rbtree) +// 右旋 +// @param rbroot 根节点 +// @param rbtree 红黑树 +KLINE RBTree *RBTreeRightRotate(RBRoot *rbroot, RBTree *rbtree) { - RBTree* P; - RBTree* R; - RBTree* RLN; - RBTree* TR; - if(NULL == rbtree || NULL == rbroot) + RBTree *P; + RBTree *R; + RBTree *RLN; + RBTree *TR; + if (NULL == rbtree || NULL == rbroot) { return NULL; } - + R = rbtree; P = R->Parent; RLN = R->Left; - TR = RLN->Right; - if(NULL == RLN) + TR = RLN->Right; + if (NULL == RLN) { return NULL; } - if(NULL != TR) + if (NULL != TR) { TR->Parent = R; } - R->Left = TR; - RLN->Right = R; - R->Parent = RLN; - RLN->Parent = P; - - if(NULL == P) - { - rbroot->Node = RLN; - return R; - } - else - { - if(R == P->Left) - { - P->Left = RLN; - } - else - { - P->Right = RLN; - } - return R; - } + R->Left = TR; + RLN->Right = R; + R->Parent = RLN; + RLN->Parent = P; + + if (NULL == P) + { + rbroot->Node = RLN; + return R; + } + else + { + if (R == P->Left) + { + P->Left = RLN; + } + else + { + P->Right = RLN; + } + return R; + } return NULL; } -KLINE RBTree* RBTreeLeftRotate(RBRoot* rbroot, RBTree* rbtree) +// 左旋 +// @param rbroot 根节点 +// @param rbtree 红黑树 +KLINE RBTree *RBTreeLeftRotate(RBRoot *rbroot, RBTree *rbtree) { - RBTree* P; - RBTree* R; - RBTree* RRN; - RBTree* TL; - if(NULL == rbtree || NULL == rbroot) + RBTree *P; + RBTree *R; + RBTree *RRN; + RBTree *TL; + if (NULL == rbtree || NULL == rbroot) { return NULL; } - + R = rbtree; P = R->Parent; RRN = R->Right; - TL = RRN->Left; + TL = RRN->Left; - if(NULL == RRN) + if (NULL == RRN) { return NULL; } - if(NULL != TL) + if (NULL != TL) { - TL->Parent = R; + TL->Parent = R; } R->Right = TL; - RRN->Left = R; - R->Parent = RRN; - RRN->Parent = P; - - if(NULL == P) - { - rbroot->Node = RRN; - return R; - } - else - { - if(R == P->Left) - { - P->Left = RRN; - } - else - { - P->Right = RRN; - } - return R; - } + RRN->Left = R; + R->Parent = RRN; + RRN->Parent = P; + + if (NULL == P) + { + rbroot->Node = RRN; + return R; + } + else + { + if (R == P->Left) + { + P->Left = RRN; + } + else + { + P->Right = RRN; + } + return R; + } return NULL; } - - -KLINE RBTree* RBTreeFixColorReal(RBRoot* rbroot, RBTree* rbtree) +// 节点颜色修复 +// @param rbroot 根节点 +// @param rbtree 红黑树 +KLINE RBTree *RBTreeFixColorReal(RBRoot *rbroot, RBTree *rbtree) { - RBTree* rbt; - if(NULL == rbtree || NULL == rbroot) + RBTree *rbt; + if (NULL == rbtree || NULL == rbroot) { return NULL; } rbt = rbtree; - while(rbt) + while (rbt) { - if(RBTreeIsRoot(rbt) == TRUE) + if (RBTreeIsRoot(rbt) == TRUE) { RBTreeSetColor(rbt, RBBLACK); return rbt; } - if(RBTreeColorIsBlack(RBTreeParent(rbt)) == TRUE) + if (RBTreeColorIsBlack(RBTreeParent(rbt)) == TRUE) { return rbt; } - if((RBTreeColorIsRed(rbt) == TRUE) && - (RBTreeColorIsRed(RBTreeParent(rbt)) == TRUE) && - (RBTreeColorIsRed(RBTreeUncle(rbt)) == TRUE)) + if ((RBTreeColorIsRed(rbt) == TRUE) && + (RBTreeColorIsRed(RBTreeParent(rbt)) == TRUE) && + (RBTreeColorIsRed(RBTreeUncle(rbt)) == TRUE)) { RBTreeSetColor(RBTreeParent(rbt), RBBLACK); RBTreeSetColor(RBTreeUncle(rbt), RBBLACK); @@ -496,8 +528,6 @@ KLINE RBTree* RBTreeFixColorReal(RBRoot* rbroot, RBTree* rbtree) return NULL; } - - /* (LL) 4B @@ -579,24 +609,26 @@ KLINE RBTree* RBTreeFixColorReal(RBRoot* rbroot, RBTree* rbtree) / \ 2R 4B */ - -KLINE RBTree* RBTreeFixRotate(RBRoot* rbroot, RBTree* rbtree) +// 节点结构修复 +// @param rbroot 根节点 +// @param rbtree 红黑树 +KLINE RBTree *RBTreeFixRotate(RBRoot *rbroot, RBTree *rbtree) { - if(NULL == rbtree || NULL == rbroot) + if (NULL == rbtree || NULL == rbroot) { return NULL; } - if(RBTreeColorIsRed(RBTreeParent(rbtree)) == FALSE || - RBTreeColorIsBlack(RBTreeUncle(rbtree)) == FALSE) + if (RBTreeColorIsRed(RBTreeParent(rbtree)) == FALSE || + RBTreeColorIsBlack(RBTreeUncle(rbtree)) == FALSE) { return NULL; } - if(RBTreeIsLeft(RBTreeParent(rbtree)) == TRUE)//L + if (RBTreeIsLeft(RBTreeParent(rbtree)) == TRUE) //L { - if(RBTreeIsLeft(rbtree) == TRUE)//LL父节点变成黑色,爷爷节点变成红色,爷爷节点右旋 + if (RBTreeIsLeft(rbtree) == TRUE) //LL父节点变成黑色,爷爷节点变成红色,爷爷节点右旋 { RBTreeSetColor(RBTreeParent(rbtree), RBBLACK); RBTreeSetColor(RBTreeGrand(rbtree), RBRED); @@ -612,9 +644,9 @@ KLINE RBTree* RBTreeFixRotate(RBRoot* rbroot, RBTree* rbtree) return rbtree; } } - else//R + else //R { - if(RBTreeIsLeft(rbtree) == TRUE)//RL当前节点变成黑色,爷爷节点变成红色,父节点右旋,爷爷节点左旋 + if (RBTreeIsLeft(rbtree) == TRUE) //RL当前节点变成黑色,爷爷节点变成红色,父节点右旋,爷爷节点左旋 { RBTreeSetColor(rbtree, RBBLACK); RBTreeSetColor(RBTreeGrand(rbtree), RBRED); @@ -622,7 +654,7 @@ KLINE RBTree* RBTreeFixRotate(RBRoot* rbroot, RBTree* rbtree) RBTreeLeftRotate(rbroot, RBTreeGrand(rbtree)); return rbtree; } - else//RR 父节点变成黑色,爷爷节点变成红色,爷爷节点左旋 + else //RR 父节点变成黑色,爷爷节点变成红色,爷爷节点左旋 { RBTreeSetColor(RBTreeParent(rbtree), RBBLACK); RBTreeSetColor(RBTreeGrand(rbtree), RBRED); @@ -633,17 +665,19 @@ KLINE RBTree* RBTreeFixRotate(RBRoot* rbroot, RBTree* rbtree) return NULL; } - - -KLINE RBTree* RBTreeAdd(RBRoot* root, RBTree* rbtree, RBPathCMP cmper) +// 向红黑树中添加节点 +// @param root 根节点 +// @param rbtree 红黑树 +// @param cmper 比较器 +KLINE RBTree *RBTreeAdd(RBRoot *root, RBTree *rbtree, RBPathCMP cmper) { - RBTree* srcrb; + RBTree *srcrb; uint_t rets; - if(NULL == root || NULL == rbtree || NULL == cmper) + if (NULL == root || NULL == rbtree || NULL == cmper) { return NULL; } - if(NULL == root->Node) + if (NULL == root->Node) { root->Node = rbtree; rbtree->Parent = NULL; @@ -651,12 +685,12 @@ KLINE RBTree* RBTreeAdd(RBRoot* root, RBTree* rbtree, RBPathCMP cmper) return rbtree; } srcrb = root->Node; - while(NULL != srcrb) + while (NULL != srcrb) { rets = cmper(srcrb, rbtree); - if(RBLEFT == rets) + if (RBLEFT == rets) { - if(NULL == srcrb->Left) + if (NULL == srcrb->Left) { srcrb->Left = rbtree; rbtree->Parent = srcrb; @@ -664,9 +698,9 @@ KLINE RBTree* RBTreeAdd(RBRoot* root, RBTree* rbtree, RBPathCMP cmper) } srcrb = srcrb->Left; } - else if(RBRIGHT == rets) + else if (RBRIGHT == rets) { - if(NULL == srcrb->Right) + if (NULL == srcrb->Right) { srcrb->Right = rbtree; rbtree->Parent = srcrb; @@ -682,28 +716,31 @@ KLINE RBTree* RBTreeAdd(RBRoot* root, RBTree* rbtree, RBPathCMP cmper) return rbtree; } -KLINE RBTree* RBTreeSerch(RBRoot* root, u32_t key) +// 搜索节点 +// @param root 根节点 +// @param key 搜索键 +KLINE RBTree *RBTreeSerch(RBRoot *root, u32_t key) { - RBTree* srcrb; + RBTree *srcrb; // uint_t rets; - if(NULL == root) + if (NULL == root) { return NULL; } - if(NULL == root->Node) + if (NULL == root->Node) { - + return NULL; } srcrb = root->Node; - while(NULL != srcrb) + while (NULL != srcrb) { // rets = cmper(srcrb, rbtree); - if(key == srcrb->Flags.Hight) + if (key == srcrb->Flags.Hight) { return srcrb; } - if(key < srcrb->Flags.Hight) + if (key < srcrb->Flags.Hight) { srcrb = srcrb->Left; } @@ -712,24 +749,27 @@ KLINE RBTree* RBTreeSerch(RBRoot* root, u32_t key) srcrb = srcrb->Right; } } - return NULL; + return NULL; } -KLINE RBTree* RBTreeAddAfterFix(RBRoot* rbroot, RBTree* rbtree) +// 向后添加节点后并修复结构 +// @param rbroot 根节点 +// @param rbtree 红黑树 +KLINE RBTree *RBTreeAddAfterFix(RBRoot *rbroot, RBTree *rbtree) { - RBTree* node; - RBTree* uncle; - if(NULL == rbroot || NULL == rbtree) + RBTree *node; + RBTree *uncle; + if (NULL == rbroot || NULL == rbtree) { return NULL; } node = rbtree; - while((NULL != node) && (rbroot->Node != node) && (RBTreeColorIsRed(RBTreeParent(node)) == TRUE)) + while ((NULL != node) && (rbroot->Node != node) && (RBTreeColorIsRed(RBTreeParent(node)) == TRUE)) { - if(RBTreeIsLeft(RBTreeParent(node)) == TRUE) + if (RBTreeIsLeft(RBTreeParent(node)) == TRUE) { uncle = RBTreeGrand(node)->Right; - if(RBTreeColorIsRed(uncle) == TRUE) + if (RBTreeColorIsRed(uncle) == TRUE) { RBTreeSetColor(RBTreeParent(node), RBBLACK); RBTreeSetColor(uncle, RBBLACK); @@ -738,7 +778,7 @@ KLINE RBTree* RBTreeAddAfterFix(RBRoot* rbroot, RBTree* rbtree) } else { - if(RBTreeIsRight(node) == TRUE) + if (RBTreeIsRight(node) == TRUE) { node = RBTreeParent(node); RBTreeLeftRotate(rbroot, node); @@ -751,7 +791,7 @@ KLINE RBTree* RBTreeAddAfterFix(RBRoot* rbroot, RBTree* rbtree) else { uncle = RBTreeGrand(node)->Left; - if(RBTreeColorIsRed(uncle) == TRUE) + if (RBTreeColorIsRed(uncle) == TRUE) { RBTreeSetColor(RBTreeParent(node), RBBLACK); RBTreeSetColor(uncle, RBBLACK); @@ -760,7 +800,7 @@ KLINE RBTree* RBTreeAddAfterFix(RBRoot* rbroot, RBTree* rbtree) } else { - if(RBTreeIsLeft(node) == TRUE) + if (RBTreeIsLeft(node) == TRUE) { node = RBTreeParent(node); RBTreeRightRotate(rbroot, node); @@ -775,45 +815,55 @@ KLINE RBTree* RBTreeAddAfterFix(RBRoot* rbroot, RBTree* rbtree) return rbtree; } -KLINE RBTree* RBTreeAddAfter(RBRoot* rbroot, RBTree* rbtree) +// 向后添加节点 +// @param rbroot 根节点 +// @param rbtree 红黑树 +KLINE RBTree *RBTreeAddAfter(RBRoot *rbroot, RBTree *rbtree) { - RBTree* rbt; - if(NULL == rbtree) + RBTree *rbt; + if (NULL == rbtree) { return NULL; } rbt = rbtree; - while(NULL != rbt) + while (NULL != rbt) { rbt = RBTreeFixColorReal(rbroot, rbt); - - rbt = RBTreeFixRotate(rbroot, rbt); + + rbt = RBTreeFixRotate(rbroot, rbt); } return rbtree; } -KLINE RBTree* RBTreeInsert(RBRoot* root, RBTree* rbtree, RBPathCMP cmper) +// 插入节点 +// @param root 根节点 +// @param rbtree 红黑树 +// @param cmper 比较器 +KLINE RBTree *RBTreeInsert(RBRoot *root, RBTree *rbtree, RBPathCMP cmper) { - RBTree* rbt; + RBTree *rbt; rbt = RBTreeAdd(root, rbtree, cmper); return RBTreeAddAfterFix(root, rbtree); } -KLINE RBTree* RBTreeRemoveAfterFix(RBRoot* root, RBTree* rbtree) +// 删除节点后修复结构 +// @param root 根节点 +// @param rbtree 红黑树 +KLINE RBTree *RBTreeRemoveAfterFix(RBRoot *root, RBTree *rbtree) { - RBTree* rsib; - RBTree* rbnode; - if(NULL == rbtree || NULL == root) + RBTree *rsib; + RBTree *rbnode; + if (NULL == rbtree || NULL == root) { return NULL; } rbnode = rbtree; - while((rbnode != root->Node) && (RBTreeColorIsBlack(rbnode) == TRUE)) + while ((rbnode != root->Node) && (RBTreeColorIsBlack(rbnode) == TRUE)) { - if(RBTreeIsLeft(rbnode) == TRUE) + if (RBTreeIsLeft(rbnode) == TRUE) { rsib = rbnode->Parent->Right; - if((RBTreeColorIsRed(rsib) == TRUE)) + if ((RBTreeColorIsRed(rsib) == TRUE)) { RBTreeSetColor(rsib, RBBLACK); RBTreeSetColor(rbnode->Parent, RBRED); @@ -821,15 +871,15 @@ KLINE RBTree* RBTreeRemoveAfterFix(RBRoot* root, RBTree* rbtree) rsib = rbnode->Parent->Right; } - if((RBTreeColorIsBlack(rsib->Left) == TRUE)&& - (RBTreeColorIsBlack(rsib->Right) == TRUE)) + if ((RBTreeColorIsBlack(rsib->Left) == TRUE) && + (RBTreeColorIsBlack(rsib->Right) == TRUE)) { RBTreeSetColor(rsib, RBRED); rbnode = rbnode->Parent; } else { - if((RBTreeColorIsBlack(rsib->Right) == TRUE)) + if ((RBTreeColorIsBlack(rsib->Right) == TRUE)) { RBTreeSetColor(rsib->Left, RBBLACK); RBTreeSetColor(rsib, RBRED); @@ -846,7 +896,7 @@ KLINE RBTree* RBTreeRemoveAfterFix(RBRoot* root, RBTree* rbtree) else { rsib = rbnode->Parent->Left; - if((RBTreeColorIsRed(rsib) == TRUE)) + if ((RBTreeColorIsRed(rsib) == TRUE)) { RBTreeSetColor(rsib, RBBLACK); RBTreeSetColor(rbnode->Parent, RBRED); @@ -854,15 +904,15 @@ KLINE RBTree* RBTreeRemoveAfterFix(RBRoot* root, RBTree* rbtree) rsib = rbnode->Parent->Left; } - if((RBTreeColorIsBlack(rsib->Right) == TRUE)&& - (RBTreeColorIsBlack(rsib->Left) == TRUE)) + if ((RBTreeColorIsBlack(rsib->Right) == TRUE) && + (RBTreeColorIsBlack(rsib->Left) == TRUE)) { RBTreeSetColor(rsib, RBRED); rbnode = rbnode->Parent; } else { - if((RBTreeColorIsBlack(rsib->Left) == TRUE)) + if ((RBTreeColorIsBlack(rsib->Left) == TRUE)) { RBTreeSetColor(rsib->Right, RBBLACK); RBTreeSetColor(rsib, RBRED); @@ -881,23 +931,28 @@ KLINE RBTree* RBTreeRemoveAfterFix(RBRoot* root, RBTree* rbtree) return rbnode; } -KLINE RBTree* RBTreeRemove(RBRoot* root, RBTree* rbtree, RBRePlace reper, RBDelAfter deler) +// 删除节点 +// @param root 根节点 +// @param rbtree 红黑树 +// @param reper 替换函数 +// @param deler 删除函数 +KLINE RBTree *RBTreeRemove(RBRoot *root, RBTree *rbtree, RBRePlace reper, RBDelAfter deler) { - RBTree* p; - RBTree* after; - RBTree* rbtnode; - RBTree* rbtrepl; - if(NULL == rbtree || NULL == root || NULL == reper || NULL == deler) + RBTree *p; + RBTree *after; + RBTree *rbtnode; + RBTree *rbtrepl; + if (NULL == rbtree || NULL == root || NULL == reper || NULL == deler) { return NULL; } rbtnode = rbtree; p = rbtnode->Parent; - if((NULL != rbtnode->Left) && (NULL != rbtnode->Right)) + if ((NULL != rbtnode->Left) && (NULL != rbtnode->Right)) { after = RBTreeFindSuccessor(rbtnode); - if(NULL == after) + if (NULL == after) { return NULL; } @@ -907,14 +962,14 @@ KLINE RBTree* RBTreeRemove(RBRoot* root, RBTree* rbtree, RBRePlace reper, RBDelA rbtrepl = rbtnode->Left != NULL ? rbtnode->Left : rbtnode->Right; - if(NULL != rbtrepl) + if (NULL != rbtrepl) { rbtrepl->Parent = rbtnode->Parent; - if(NULL == rbtrepl->Parent) + if (NULL == rbtrepl->Parent) { root->Node = rbtrepl; } - else if(RBTreeIsLeft(rbtnode) == TRUE) + else if (RBTreeIsLeft(rbtnode) == TRUE) { rbtnode->Parent->Left = rbtrepl; } @@ -925,30 +980,30 @@ KLINE RBTree* RBTreeRemove(RBRoot* root, RBTree* rbtree, RBRePlace reper, RBDelA rbtnode->Right = rbtnode->Left = rbtnode->Parent = NULL; - if(RBTreeColorIsBlack(rbtnode) == TRUE) + if (RBTreeColorIsBlack(rbtnode) == TRUE) { RBTreeRemoveAfterFix(root, rbtrepl); } deler(rbtnode); } - else if(NULL == rbtnode->Parent) + else if (NULL == rbtnode->Parent) { root->Node = NULL; deler(rbtnode); } else { - if(RBTreeColorIsBlack(rbtnode) == TRUE) + if (RBTreeColorIsBlack(rbtnode) == TRUE) { RBTreeRemoveAfterFix(root, rbtnode); } - if(NULL != rbtnode->Parent) + if (NULL != rbtnode->Parent) { - if(RBTreeIsLeft(rbtnode) == TRUE) + if (RBTreeIsLeft(rbtnode) == TRUE) { rbtnode->Parent->Left = NULL; } - else if(RBTreeIsRight(rbtnode) == TRUE) + else if (RBTreeIsRight(rbtnode) == TRUE) { rbtnode->Parent->Right = NULL; } @@ -959,32 +1014,39 @@ KLINE RBTree* RBTreeRemove(RBRoot* root, RBTree* rbtree, RBRePlace reper, RBDelA return NULL; } -KLINE RBTree* RBTreeDelete(RBRoot* root, RBTree* rbtree, RBRePlace reper, RBDelAfter deler) +// 删除节点 +// @param root 根节点 +// @param rbtree 红黑树 +// @param reper 替换函数 +// @param deler 删除函数 +KLINE RBTree *RBTreeDelete(RBRoot *root, RBTree *rbtree, RBRePlace reper, RBDelAfter deler) { - RBTree* rbt; + RBTree *rbt; rbt = RBTreeRemove(root, rbtree, reper, deler); return rbt; } -KLINE RBTree* RBTreeMostLeft(RBRoot* root) +// 得到红黑树中最左边的节点(即 key 最小的节点) +// @param root 根节点 +KLINE RBTree *RBTreeMostLeft(RBRoot *root) { - RBTree* rbtree; - if(NULL == root) + RBTree *rbtree; + if (NULL == root) { return NULL; } rbtree = root->Node; - if(NULL == rbtree) + if (NULL == rbtree) { return NULL; } - while(NULL != rbtree) + while (NULL != rbtree) { - if(NULL != rbtree->Left) + if (NULL != rbtree->Left) { rbtree = rbtree->Left; } - else if(NULL != rbtree->Right) + else if (NULL != rbtree->Right) { rbtree = rbtree->Right; } @@ -996,25 +1058,27 @@ KLINE RBTree* RBTreeMostLeft(RBRoot* root) return NULL; } -KLINE RBTree* RBTreeMostRight(RBRoot* root) +// 得到红黑树中最右边的节点(即 key 最大的节点) +// @param root 根节点 +KLINE RBTree *RBTreeMostRight(RBRoot *root) { - RBTree* rbtree; - if(NULL == root) + RBTree *rbtree; + if (NULL == root) { return NULL; } rbtree = root->Node; - if(NULL == rbtree) + if (NULL == rbtree) { return NULL; } - while(NULL != rbtree) + while (NULL != rbtree) { - if(NULL != rbtree->Right) + if (NULL != rbtree->Right) { rbtree = rbtree->Right; } - else if(NULL != rbtree->Left) + else if (NULL != rbtree->Left) { rbtree = rbtree->Left; } @@ -1026,9 +1090,8 @@ KLINE RBTree* RBTreeMostRight(RBRoot* root) return NULL; } - +// 遍历红黑树 #define RBTreeEntry(ptr, type, member) \ ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member))) - #endif