From af8994b0c684db11907bfd0b4a170516c080989b Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Sat, 21 Jun 2014 01:39:30 +0100 Subject: [PATCH] modified the rotate macro so that it works with any structure that has a left, right and parent reference to variables of itself. --- include/tr/tree.h | 51 +++++++++++++++++++++++------------------------ src/tree/delete.c | 7 ------- trdata.h | 4 ++-- 3 files changed, 27 insertions(+), 35 deletions(-) diff --git a/include/tr/tree.h b/include/tr/tree.h index 99f6a0b..5ab1b96 100644 --- a/include/tr/tree.h +++ b/include/tr/tree.h @@ -60,32 +60,31 @@ (node2)->parent = (node1)->parent; \ } -#define TR_TREE_ROT_RELCHILD_right(node) ((node)->left) -#define TR_TREE_ROT_RELCHILD_CHILD_right (relChild->right) -#define TR_TREE_ROT_RELCHILD_left(node) ((node)->right) -#define TR_TREE_ROT_RELCHILD_CHILD_left (relChild->left) - -#define TR_TREE_ROTATE(lr, _this, node) \ - if (NULL != (node)) { \ - TR_Tree _node = (node); \ - TR_Tree relChild = TR_TREE_ROT_RELCHILD_##lr(_node); \ - TR_Tree relChildLvl2 = TR_TREE_ROT_RELCHILD_##lr(_node)->lr; \ - relChild->lr = _node; \ - relChild->parent = _node->parent; \ - TR_TREE_ROT_RELCHILD_##lr(_node) = relChildLvl2; \ - if (NULL != relChildLvl2) { \ - relChildLvl2->parent = _node; \ - } \ - if (NULL != _node->parent) { \ - if (_node->parent->left == _node) { \ - _node->parent->left = relChild; \ - } else { \ - _node->parent->right = relChild; \ - } \ - } else { \ - *(_this) = relChild; \ - } \ - _node->parent = relChild; \ +#define TR_TREE_ROT_RCLD_right(node) ((node)->left) +#define TR_TREE_ROT_RCLD_left(node) ((node)->right) + +#define TR_TREE_ROTATE(lr, root, node) \ + if (NULL != (node)) { \ + void * stPar = node->parent; \ + void * relCld = TR_TREE_ROT_RCLD_##lr(node); \ + void * relCCld = TR_TREE_ROT_RCLD_##lr(node)->lr; \ + void * nLeft_p = &TR_TREE_ROT_RCLD_##lr(node); \ + if (NULL != relCCld) { \ + TR_TREE_ROT_RCLD_##lr(node)->lr->parent = node; \ + } \ + TR_TREE_ROT_RCLD_##lr(node)->lr = node; \ + if (NULL != node->parent) { \ + if (node->parent->left == node) { \ + node->parent->left = relCld; \ + } else { \ + node->parent->right = relCld; \ + } \ + } else { \ + *(root) = relCld; \ + } \ + node->parent = relCld; \ + TR_TREE_ROT_RCLD_##lr(node)->parent = stPar; \ + *(void**)nLeft_p = relCCld; \ } typedef enum {rbBlack=1, rbRed=2} TR_rbColor; diff --git a/src/tree/delete.c b/src/tree/delete.c index daccfa8..7c1ec0e 100644 --- a/src/tree/delete.c +++ b/src/tree/delete.c @@ -150,10 +150,6 @@ TR_treeDelete(TR_Tree * this, const void * search, TR_TreeComp comp) sibling->color = rbRed; } - /* - * this is the point where during the balancing our tree - * node can be finally deleted. - */ if (rbBlack == node->parent->color) { // case 3 node = node->parent; @@ -216,9 +212,6 @@ TR_treeDelete(TR_Tree * this, const void * search, TR_TreeComp comp) } TR_delete(del_node); - /* - * not sure if deleting here is correct. - */ return data; } diff --git a/trdata.h b/trdata.h index ae6b4fd..d8978cf 100644 --- a/trdata.h +++ b/trdata.h @@ -11,13 +11,13 @@ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the `memset' function. */ -#define HAVE_MEMSET 1 +/* #undef HAVE_MEMSET */ /* Define to 1 if you have the header file. */ #define HAVE_STDARG_H 1 /* Define to 1 if stdbool.h conforms to C99. */ -#define HAVE_STDBOOL_H 1 +/* #undef HAVE_STDBOOL_H */ /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1