74 lines
2.4 KiB
C
74 lines
2.4 KiB
C
#ifndef INCLUDED_C_RBTREE_H
|
|||
|
|
#define INCLUDED_C_RBTREE_H
|
||
|
|
|
||
|
|
#ifndef INCLUDED_C_TYPES_H
|
||
|
|
#include <c_Types.h>
|
||
|
|
#endif /*INCLUDED_C_TYPES_H*/
|
||
|
|
|
||
|
|
#ifndef INCLUDED_C_ALLOCATOR_H
|
||
|
|
#include <c_Allocator.h>
|
||
|
|
#endif /*INCLUDED_C_ALLOCATOR_H*/
|
||
|
|
|
||
|
|
/* ------------------------------------------------------------------------------------------------------------------ */
|
||
|
|
/* */
|
||
|
|
|
||
|
|
// 红黑树颜色枚举
|
||
|
|
typedef enum {
|
||
|
|
C_RB_RED = 0,
|
||
|
|
C_RB_BLACK = 1
|
||
|
|
} c_RBColor_t;
|
||
|
|
|
||
|
|
// 泛型值复制红黑树节点控制头
|
||
|
|
typedef struct c_RBNode_t {
|
||
|
|
struct c_RBNode_t* parent;
|
||
|
|
struct c_RBNode_t* left;
|
||
|
|
struct c_RBNode_t* right;
|
||
|
|
c_RBColor_t color;
|
||
|
|
// 后面会紧跟一整块大小为 item_size 的物理连续内存块,直接存放真实数据值
|
||
|
|
} c_RBNode_t;
|
||
|
|
|
||
|
|
typedef int (*c_RBTree_CompareFn_t)(const void* a, const void* b);
|
||
|
|
|
||
|
|
typedef struct {
|
||
|
|
c_RBNode_t* root; // 树的根节点
|
||
|
|
c_size_t item_size; // 单个元素的字节大小
|
||
|
|
c_size_t size; // 当前树内持有的有效节点个数
|
||
|
|
c_RBTree_CompareFn_t compare; // 关联的具体类型比较算子
|
||
|
|
c_Allocator_t allocator; // 内部绑定的自主内存管理器
|
||
|
|
} c_RBTree_t;
|
||
|
|
|
||
|
|
/* ------------------------------------------------------------------------------------------------------------------ */
|
||
|
|
/* */
|
||
|
|
|
||
|
|
c_err_t c_RBTree_Init(c_RBTree_t* self, c_size_t item_size, c_RBTree_CompareFn_t compare_fn, c_Allocator_t* allocator);
|
||
|
|
void c_RBTree_Destroy(c_RBTree_t* self);
|
||
|
|
|
||
|
|
c_err_t c_RBTree_Insert(c_RBTree_t* self, const void* item);
|
||
|
|
c_err_t c_RBTree_Remove(c_RBTree_t* self, const void* key);
|
||
|
|
bool c_RBTree_Contains(const c_RBTree_t* self, const void* key);
|
||
|
|
void c_RBTree_Clear(c_RBTree_t* self);
|
||
|
|
|
||
|
|
/* ------------------------------------------------------------------------------------------------------------------ */
|
||
|
|
/* */
|
||
|
|
|
||
|
|
C_STATIC_FORCE_INLINE
|
||
|
|
c_size_t c_RBTree_Size(const c_RBTree_t* self) {
|
||
|
|
if (!self) return 0;
|
||
|
|
return self->size; // 直接返回内置计数器
|
||
|
|
}
|
||
|
|
|
||
|
|
C_STATIC_FORCE_INLINE
|
||
|
|
c_RBColor_t c_RBTree_GetColor(const c_RBNode_t* node) {
|
||
|
|
// 根据红黑树标准性质:所有外部叶子空节点(NULL)物理上皆默认为黑色
|
||
|
|
return (node == NULL) ? C_RB_BLACK : node->color;
|
||
|
|
}
|
||
|
|
|
||
|
|
C_STATIC_FORCE_INLINE
|
||
|
|
void c_RBTree_SetColor(c_RBNode_t* node, c_RBColor_t color) {
|
||
|
|
if (node != NULL) {
|
||
|
|
node->color = color; // 只有非空节点才允许修改颜色状态
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#endif /*INCLUDED_C_RBTREE_H*/
|