rbtree.h
来自「sip协议栈」· C头文件 代码 · 共 536 行 · 第 1/2 页
H
536 行
dad = old, slot = &(left(old)); \ else if (result > 0) \ dad = old, slot = &(right(old)); \ else \ break; \ } \ \ if (old == node) \ old = NULL; \ else if (old) { \ if ((left(node) = left(old))) \ parent(left(node)) = node; \ if ((right(node) = right(old))) \ parent(right(node)) = node; \ \ if (!(parent(node) = parent(old))) \ *tree = node; \ else if (left(parent(node)) == old) \ left(parent(node)) = node; \ else assert(right(parent(node)) == old), \ right(parent(node)) = node; \ \ COPY_COLOR(node, old); \ \ REMOVE(old); \ \ } else { \ *slot = node; \ parent(node) = dad; \ \ if (tree != slot) { \ prefix##_balance_insert(tree, node); \ } else { \ SET_BLACK(node); \ } \ } \ \ INSERT(node); \ \ if (return_old) \ *return_old = old; \ \ return 0; \} \extern int const prefix##_dummy/* Append node into tree. */#define RBTREE_APPEND(SCOPE, prefix, Type, left, right, parent, \ IS_RED, SET_RED, IS_BLACK, SET_BLACK, COPY_COLOR, \ CMP, REMOVE, INSERT) \SCOPE \int prefix ## _append(Type **const tree, \ Type * const node) \{ \ Type *old, *dad, **slot; \ \ if (tree == NULL || node == NULL) return -1; \ \ for (slot = tree, old = *slot, dad = NULL; old; old = *slot) { \ if (old == node) \ return 0; \ if (CMP(node, old) < 0) \ dad = old, slot = &(left(old)); \ else \ dad = old, slot = &(right(old)); \ } \ \ *slot = node; \ parent(node) = dad; \ \ if (tree != slot) { \ prefix##_balance_insert(tree, node); \ } else { \ SET_BLACK(node); \ } \ \ INSERT(node); \ \ return 0; \} \extern int const prefix##_dummy/* Remove node. */#define RBTREE_REMOVE(SCOPE, prefix, Type, left, right, parent, \ IS_RED, SET_RED, IS_BLACK, SET_BLACK, COPY_COLOR, \ REMOVE, INSERT) \SCOPE \void prefix##_remove(Type **top, Type *node) \{ \ Type *kid, *dad; \ int need_to_balance; \ \ if (top == NULL || node == NULL) \ return; \ \ /* Make sure that node is in tree */ \ for (dad = node; dad; dad = parent(dad)) \ if (dad == *top) \ break; \ \ if (!dad) return; \ \ /* Find a successor node with a free branch */ \ if (!left(node) || !right(node)) \ dad = node; \ else for (dad = right(node); left(dad); dad = left(dad)) \ ; \ /* Dad has a free branch => kid is dad's only child */ \ kid = left(dad) ? left(dad) : right(dad); \ \ /* Remove dad from tree */ \ if (!(parent(dad))) \ *top = kid; \ else if (left(parent(dad)) == dad) \ left(parent(dad)) = kid; \ else assert(right(parent(dad)) == dad), \ right(parent(dad)) = kid; \ if (kid) \ parent(kid) = parent(dad); \ \ need_to_balance = kid && IS_BLACK(dad); \ \ /* Put dad in place of node */ \ if (node != dad) { \ if (!(parent(dad) = parent(node))) \ *top = dad; \ else if (left(parent(dad)) == node) \ left(parent(dad)) = dad; \ else assert(right(parent(dad)) == node), \ right(parent(dad)) = dad; \ \ COPY_COLOR(dad, node); \ \ if ((left(dad) = left(node))) \ parent(left(dad)) = dad; \ \ if ((right(dad) = right(node))) \ parent(right(dad)) = dad; \ } \ \ REMOVE(node); \ SET_RED(node); \ \ if (need_to_balance) \ prefix##_balance_delete(top, kid); \} \extern int const prefix##_dummy/* Functions currently used only by test cases *//** Return inorder successor of node @a node. */#define RBTREE_SUCC(SCOPE, prefix, Type, left, right, parent) \SCOPE Type *prefix##_succ(Type const *node) \{ \ Type const *dad; \ \ if (right(node)) { \ for (node = right(node); left(node); node = left(node)) \ ; \ return (Type *)node; \ } \ \ for (dad = parent(node); dad && node == right(dad); dad = parent(node)) \ node = dad; \ \ return (Type *)dad; \} \extern int const prefix##_dummy/** Return inorder precedessor of node @a node. */#define RBTREE_PREC(SCOPE, prefix, Type, left, right, parent) \ SCOPE Type *prefix##_prec(Type const *node) \{ \ Type const *dad; \ \ if (left(node)) { \ for (node = left(node); right(node); node = right(node)) \ ; \ return (Type *)node; \ } \ \ for (dad = parent(node); dad && node == left(dad); dad = parent(node)) \ node = dad; \ \ return (Type *)dad; \} \extern int const prefix##_dummy/** Return first node in tree @a node. */#define RBTREE_FIRST(SCOPE, prefix, Type, left, right, parent) \SCOPE Type *prefix##_first(Type const *node) \{ \ while (node && left(node)) \ node = left(node); \ \ return (Type *)node; \} \extern int const prefix##_dummy/** Return last node in tree @a node. */#define RBTREE_LAST(SCOPE, prefix, Type, left, right, parent) \SCOPE Type *prefix##_last(Type const *node) \{ \ while (node && right(node)) \ node = right(node); \ \ return (Type *)node; \} \extern int const prefix##_dummy/** Return height of the tree */#define RBTREE_HEIGHT(SCOPE, prefix, Type, left, right, parent) \SCOPE int prefix##_height(Type const *tree) \{ \ int left, right; \ \ if (!tree) \ return 0; \ \ left = left(tree) ? prefix##_height(left(tree)) : 0; \ right = right(tree) ? prefix##_height(right(tree)) : 0; \ \ if (left > right) \ return left + 1; \ else \ return right + 1; \} \extern int const prefix##_dummy#define RBTREE_PROTOS(SCOPE, prefix, Type) \ SCOPE int prefix ## _insert(Type **, Type *, Type **return_old); \ SCOPE int prefix ## _append(Type **, Type *); \ SCOPE void prefix ## _remove(Type **, Type *); \ SCOPE Type *prefix ## _succ(Type const *); \ SCOPE Type *prefix ## _prec(Type const *); \ SCOPE Type *prefix ## _first(Type const *); \ SCOPE Type *prefix ## _last(Type const *); \ SCOPE int prefix ## _height(Type const *)#define RBTREE_BODIES(SCOPE, prefix, Type, \ left, right, parent, \ IS_RED, SET_RED, IS_BLACK, SET_BLACK, COPY_COLOR, \ CMP, INSERT, REMOVE) \ RBTREE_LEFT_ROTATE(prefix, Type, left, right, parent); \ RBTREE_RIGHT_ROTATE(prefix, Type, left, right, parent); \ RBTREE_BALANCE_INSERT(prefix, Type, left, right, parent, \ IS_RED, SET_RED, IS_BLACK, SET_BLACK); \ RBTREE_BALANCE_DELETE(prefix, Type, left, right, parent, \ IS_RED, SET_RED, IS_BLACK, SET_BLACK, \ COPY_COLOR); \ RBTREE_INSERT(SCOPE, prefix, Type, left, right, parent, \ IS_RED, SET_RED, IS_BLACK, SET_BLACK, COPY_COLOR, \ CMP, REMOVE, INSERT); \ RBTREE_APPEND(SCOPE, prefix, Type, left, right, parent, \ IS_RED, SET_RED, IS_BLACK, SET_BLACK, COPY_COLOR, \ CMP, REMOVE, INSERT); \ RBTREE_REMOVE(SCOPE, prefix, Type, left, right, parent, \ IS_RED, SET_RED, IS_BLACK, SET_BLACK, COPY_COLOR, \ REMOVE, INSERT); \ RBTREE_SUCC(SCOPE, prefix, Type, left, right, parent); \ RBTREE_PREC(SCOPE, prefix, Type, left, right, parent); \ RBTREE_FIRST(SCOPE, prefix, Type, left, right, parent); \ RBTREE_LAST(SCOPE, prefix, Type, left, right, parent); \ RBTREE_HEIGHT(SCOPE, prefix, Type, left, right, parent)#endif /* !define(RBTREE_H) */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?