Files
2026-08-30 02:51:25 +08:00

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*/