Browse Source

modified the rotate macro so that it works with any structure that has a left, right and parent reference to variables of itself.

1.0.0
Georg Hopp 12 years ago
parent
commit
af8994b0c6
  1. 51
      include/tr/tree.h
  2. 7
      src/tree/delete.c
  3. 4
      trdata.h

51
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;

7
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;
}

4
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 <stdarg.h> 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 <stdint.h> header file. */
#define HAVE_STDINT_H 1

Loading…
Cancel
Save