#include "tree.h" Tree* tree_new(const void* const data) { Tree* tree = (Tree*) malloc(sizeof(Tree)); /// puts("tree new"); tree->data = data; tree->next = NULL; tree->child = NULL; return tree; } Tree* tree_add(Tree* tree, const void* const data) { Tree* last = tree; while(last->next != NULL) { last = last->next; } last->next = tree_new(data); return last->next; } Tree* tree_addChildTop(Tree* tree, const void* const data) { Tree* treenew = tree_new(data); treenew->next = tree->child; tree->child = treenew; return treenew; } Tree* tree_addtop(Tree* tree, const void* const data) { Tree* new_tree = tree_new(data); if(tree->next == NULL) { tree->next = new_tree; } else { new_tree->next = tree->next; tree->next = new_tree; } return new_tree; } Tree* tree_addChild(Tree* tree, const void* const data) { /// printf("addChild to %s with '%s'\n", tree->data, data); if(tree->child == NULL) { tree->child = tree_new(data); } else { return tree_add(tree->child, data); } return tree->child; } void tree_free(Tree* tree, void((*free_function)(const void*))) { Tree* tmp; do { if(tree->child != NULL) { tree_free(tree->child, free_function); } tmp = tree->next; if(free_function) free_function(tree->data); free(tree); } while((tree = tmp) != NULL); } Tree* tree_join(Tree* tree, Tree* subtree) { if(!tree) { return subtree; } while(tree->next) { tree = tree->next; } tree->next = subtree; return tree->next; } Tree* tree_extend(Tree* tree, Tree* subtree) { Tree* child; if(!tree) { return subtree; } child = tree_addChild(tree, subtree->data); child->child = subtree->child; return tree->next; } void tree_iterate(Tree* tree, void* (*fn)(const void* data)) { Tree* last = tree; void* (*fn2)(); do { fn2 = fn(last->data); if(last->child) tree_iterate(last->child, fn2); } while((last = last->next) != NULL); }