diff options
Diffstat (limited to 'src/tree.c')
-rw-r--r-- | src/tree.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/tree.c b/src/tree.c new file mode 100644 index 000000000..1f3b21546 --- /dev/null +++ b/src/tree.c @@ -0,0 +1,52 @@ +#include "tree.h" + +static inline TreeNode * newTreeNode() { + TreeNode * ret = malloc(sizeof(TreeNode)); + + ret->data[0] = NULL; + ret->data[1] = NULL; + + ret->children[0] = NULL; + ret->children[1] = NULL; + ret->children[2] = NULL; + + return ret; +} + +static inline void freeTreeNode(TreeNode * node) { + free(node); +} + +Tree * newTree(TreeFreeDataFunc * freeFunc, TreeCompareDataFunc * compareFunc) { + Tree * ret = malloc(sizeof(Tree)); + + ret->headNode = NULL; + ret->freeFunc = freeFunc; + ret->compareFunc = compareFunc; + + return ret; +} + +void freeTree(Tree * tree) { + TreeIterator * iter = newTreeIterator(tree, POSTORDER); + + TreeNode * node; + + if(data->freeFunc) { + void * data; + + while( ( data = nextTreeIterator(iter) ) ) { + + } + + freeTreeIterator(iter); + + iter = newTreeIterator(tree, POSTORDER); + } + + while( ( node = nextNodeTreeIterator(iter) ) ) { + freeTreeNode(node); + } + + freeTreeIterator(iter); +} |