summaryrefslogtreecommitdiff
path: root/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'tree.c')
-rwxr-xr-xtree.c101
1 files changed, 101 insertions, 0 deletions
diff --git a/tree.c b/tree.c
new file mode 100755
index 0000000..2fd50d2
--- /dev/null
+++ b/tree.c
@@ -0,0 +1,101 @@
1#include "tree.h"
2
3Tree* tree_new(const void* const data)
4{
5 Tree* tree = (Tree*) malloc(sizeof(Tree));
6 /// puts("tree new");
7 tree->data = data;
8 tree->next = NULL;
9 tree->child = NULL;
10 return tree;
11}
12
13Tree* tree_add(Tree* tree, const void* const data)
14{
15 Tree* last = tree;
16 while(last->next != NULL)
17 { last = last->next; }
18
19 last->next = tree_new(data);
20 return last->next;
21}
22
23Tree* tree_addChildTop(Tree* tree, const void* const data)
24{
25 Tree* treenew = tree_new(data);
26 treenew->next = tree->child;
27 tree->child = treenew;
28 return treenew;
29}
30
31Tree* tree_addtop(Tree* tree, const void* const data)
32{
33 Tree* new_tree = tree_new(data);
34 if(tree->next == NULL)
35 {
36 tree->next = new_tree;
37 }
38 else
39 {
40 new_tree->next = tree->next;
41 tree->next = new_tree;
42 }
43 return new_tree;
44}
45
46
47Tree* tree_addChild(Tree* tree, const void* const data)
48{
49 /// printf("addChild to %s with '%s'\n", tree->data, data);
50 if(tree->child == NULL)
51 { tree->child = tree_new(data); }
52 else
53 { return tree_add(tree->child, data); }
54
55 return tree->child;
56}
57
58void tree_free(Tree* tree, void((*free_function)(const void*)))
59{
60 Tree* tmp;
61 do
62 {
63 if(tree->child != NULL)
64 { tree_free(tree->child, free_function); }
65
66 tmp = tree->next;
67 if(free_function)
68 free_function(tree->data);
69 free(tree);
70 } while((tree = tmp) != NULL);
71}
72
73Tree* tree_join(Tree* tree, Tree* subtree)
74{
75 if(!tree) { return subtree; }
76 while(tree->next)
77 { tree = tree->next; }
78 tree->next = subtree;
79 return tree->next;
80}
81
82Tree* tree_extend(Tree* tree, Tree* subtree)
83{
84 Tree* child;
85 if(!tree) { return subtree; }
86 child = tree_addChild(tree, subtree->data);
87 child->child = subtree->child;
88 return tree->next;
89}
90
91void tree_iterate(Tree* tree, void* (*fn)(const void* data))
92{
93 Tree* last = tree;
94 void* (*fn2)();
95 do
96 {
97 fn2 = fn(last->data);
98 if(last->child)
99 tree_iterate(last->child, fn2);
100 } while((last = last->next) != NULL);
101}
..