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,32 +60,31 @@ | ||
60 | (node2)->parent = (node1)->parent; \ | 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 | typedef enum {rbBlack=1, rbRed=2} TR_rbColor; | 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,10 +150,6 @@ TR_treeDelete(TR_Tree * this, const void * search, TR_TreeComp comp) | ||
150 | sibling->color = rbRed; | 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 | if (rbBlack == node->parent->color) { | 153 | if (rbBlack == node->parent->color) { |
158 | // case 3 | 154 | // case 3 |
159 | node = node->parent; | 155 | node = node->parent; |
@@ -216,9 +212,6 @@ TR_treeDelete(TR_Tree * this, const void * search, TR_TreeComp comp) | @@ -216,9 +212,6 @@ TR_treeDelete(TR_Tree * this, const void * search, TR_TreeComp comp) | ||
216 | } | 212 | } |
217 | 213 | ||
218 | TR_delete(del_node); | 214 | TR_delete(del_node); |
219 | - /* | ||
220 | - * not sure if deleting here is correct. | ||
221 | - */ | ||
222 | return data; | 215 | return data; |
223 | } | 216 | } |
224 | 217 |
@@ -11,13 +11,13 @@ | @@ -11,13 +11,13 @@ | ||
11 | #define HAVE_MEMORY_H 1 | 11 | #define HAVE_MEMORY_H 1 |
12 | 12 | ||
13 | /* Define to 1 if you have the `memset' function. */ | 13 | /* Define to 1 if you have the `memset' function. */ |
14 | -#define HAVE_MEMSET 1 | 14 | +/* #undef HAVE_MEMSET */ |
15 | 15 | ||
16 | /* Define to 1 if you have the <stdarg.h> header file. */ | 16 | /* Define to 1 if you have the <stdarg.h> header file. */ |
17 | #define HAVE_STDARG_H 1 | 17 | #define HAVE_STDARG_H 1 |
18 | 18 | ||
19 | /* Define to 1 if stdbool.h conforms to C99. */ | 19 | /* Define to 1 if stdbool.h conforms to C99. */ |
20 | -#define HAVE_STDBOOL_H 1 | 20 | +/* #undef HAVE_STDBOOL_H */ |
21 | 21 | ||
22 | /* Define to 1 if you have the <stdint.h> header file. */ | 22 | /* Define to 1 if you have the <stdint.h> header file. */ |
23 | #define HAVE_STDINT_H 1 | 23 | #define HAVE_STDINT_H 1 |
Please
register
or
login
to post a comment