summaryrefslogtreecommitdiff
path: root/tree.c
blob: 2fd50d2588210b6aceaa1384b6fd03ecd0134d80 (plain)
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);
}
..