1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
#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);
}
|