#ifndef INCLUDED_C_RBTREE_H #define INCLUDED_C_RBTREE_H #ifndef INCLUDED_C_TYPES_H #include #endif /*INCLUDED_C_TYPES_H*/ #ifndef INCLUDED_C_ALLOCATOR_H #include #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*/