5 static str_tree *new_leaf(const char *s, void *extra)
8 leaf = (str_tree *) malloc(sizeof(str_tree));
18 leaf->left = leaf->right = NULL;
21 str_tree *str_tree_add(str_tree **root, const char *s, void *extra)
24 return (*root = new_leaf(s, extra));
25 else if (strcmp(s, (*root)->s) < 0)
26 return str_tree_add(&(*root)->left, s, extra);
28 return str_tree_add(&(*root)->right, s, extra);
31 str_tree *str_tree_find(str_tree *node, const char *s)
35 if (strcmp(s, node->s) == 0)
37 else if (strcmp(s, node->s) < 0)
38 return str_tree_find(node->left, s);
40 return str_tree_find(node->right, s);
43 void str_tree_free(str_tree **root)
47 str_tree *node = *root;
49 str_tree_free(&node->left);
50 str_tree_free(&node->right);
56 int str_tree_traverse(str_tree *root,int(*f)(str_tree *node))
58 if (root == NULL) return 1;
60 if (!str_tree_traverse(root->left,f) ||
62 !str_tree_traverse(root->right,f)) return 0;