Commit af8994b0c684db11907bfd0b4a170516c080989b
1 parent
3266c808
modified the rotate macro so that it works with any structure that has a left, r…
…ight and parent reference to variables of itself.
Showing
3 changed files
with
27 additions
and
35 deletions
| ... | ... | @@ -60,32 +60,31 @@ |
| 60 | 60 | (node2)->parent = (node1)->parent; \ |
| 61 | 61 | } |
| 62 | 62 | |
| 63 | -#define TR_TREE_ROT_RELCHILD_right(node) ((node)->left) | |
| 64 | -#define TR_TREE_ROT_RELCHILD_CHILD_right (relChild->right) | |
| 65 | -#define TR_TREE_ROT_RELCHILD_left(node) ((node)->right) | |
| 66 | -#define TR_TREE_ROT_RELCHILD_CHILD_left (relChild->left) | |
| 67 | - | |
| 68 | -#define TR_TREE_ROTATE(lr, _this, node) \ | |
| 69 | - if (NULL != (node)) { \ | |
| 70 | - TR_Tree _node = (node); \ | |
| 71 | - TR_Tree relChild = TR_TREE_ROT_RELCHILD_##lr(_node); \ | |
| 72 | - TR_Tree relChildLvl2 = TR_TREE_ROT_RELCHILD_##lr(_node)->lr; \ | |
| 73 | - relChild->lr = _node; \ | |
| 74 | - relChild->parent = _node->parent; \ | |
| 75 | - TR_TREE_ROT_RELCHILD_##lr(_node) = relChildLvl2; \ | |
| 76 | - if (NULL != relChildLvl2) { \ | |
| 77 | - relChildLvl2->parent = _node; \ | |
| 78 | - } \ | |
| 79 | - if (NULL != _node->parent) { \ | |
| 80 | - if (_node->parent->left == _node) { \ | |
| 81 | - _node->parent->left = relChild; \ | |
| 82 | - } else { \ | |
| 83 | - _node->parent->right = relChild; \ | |
| 84 | - } \ | |
| 85 | - } else { \ | |
| 86 | - *(_this) = relChild; \ | |
| 87 | - } \ | |
| 88 | - _node->parent = relChild; \ | |
| 63 | +#define TR_TREE_ROT_RCLD_right(node) ((node)->left) | |
| 64 | +#define TR_TREE_ROT_RCLD_left(node) ((node)->right) | |
| 65 | + | |
| 66 | +#define TR_TREE_ROTATE(lr, root, node) \ | |
| 67 | + if (NULL != (node)) { \ | |
| 68 | + void * stPar = node->parent; \ | |
| 69 | + void * relCld = TR_TREE_ROT_RCLD_##lr(node); \ | |
| 70 | + void * relCCld = TR_TREE_ROT_RCLD_##lr(node)->lr; \ | |
| 71 | + void * nLeft_p = &TR_TREE_ROT_RCLD_##lr(node); \ | |
| 72 | + if (NULL != relCCld) { \ | |
| 73 | + TR_TREE_ROT_RCLD_##lr(node)->lr->parent = node; \ | |
| 74 | + } \ | |
| 75 | + TR_TREE_ROT_RCLD_##lr(node)->lr = node; \ | |
| 76 | + if (NULL != node->parent) { \ | |
| 77 | + if (node->parent->left == node) { \ | |
| 78 | + node->parent->left = relCld; \ | |
| 79 | + } else { \ | |
| 80 | + node->parent->right = relCld; \ | |
| 81 | + } \ | |
| 82 | + } else { \ | |
| 83 | + *(root) = relCld; \ | |
| 84 | + } \ | |
| 85 | + node->parent = relCld; \ | |
| 86 | + TR_TREE_ROT_RCLD_##lr(node)->parent = stPar; \ | |
| 87 | + *(void**)nLeft_p = relCCld; \ | |
| 89 | 88 | } |
| 90 | 89 | |
| 91 | 90 | typedef enum {rbBlack=1, rbRed=2} TR_rbColor; | ... | ... |
| ... | ... | @@ -150,10 +150,6 @@ TR_treeDelete(TR_Tree * this, const void * search, TR_TreeComp comp) |
| 150 | 150 | sibling->color = rbRed; |
| 151 | 151 | } |
| 152 | 152 | |
| 153 | - /* | |
| 154 | - * this is the point where during the balancing our tree | |
| 155 | - * node can be finally deleted. | |
| 156 | - */ | |
| 157 | 153 | if (rbBlack == node->parent->color) { |
| 158 | 154 | // case 3 |
| 159 | 155 | node = node->parent; |
| ... | ... | @@ -216,9 +212,6 @@ TR_treeDelete(TR_Tree * this, const void * search, TR_TreeComp comp) |
| 216 | 212 | } |
| 217 | 213 | |
| 218 | 214 | TR_delete(del_node); |
| 219 | - /* | |
| 220 | - * not sure if deleting here is correct. | |
| 221 | - */ | |
| 222 | 215 | return data; |
| 223 | 216 | } |
| 224 | 217 | ... | ... |
| ... | ... | @@ -11,13 +11,13 @@ |
| 11 | 11 | #define HAVE_MEMORY_H 1 |
| 12 | 12 | |
| 13 | 13 | /* Define to 1 if you have the `memset' function. */ |
| 14 | -#define HAVE_MEMSET 1 | |
| 14 | +/* #undef HAVE_MEMSET */ | |
| 15 | 15 | |
| 16 | 16 | /* Define to 1 if you have the <stdarg.h> header file. */ |
| 17 | 17 | #define HAVE_STDARG_H 1 |
| 18 | 18 | |
| 19 | 19 | /* Define to 1 if stdbool.h conforms to C99. */ |
| 20 | -#define HAVE_STDBOOL_H 1 | |
| 20 | +/* #undef HAVE_STDBOOL_H */ | |
| 21 | 21 | |
| 22 | 22 | /* Define to 1 if you have the <stdint.h> header file. */ |
| 23 | 23 | #define HAVE_STDINT_H 1 | ... | ... |
Please
register
or
login
to post a comment