Listing 3

#include <stdio.h>

#define DEBUG
#include "heaptst1.h"

#define MAX_LINE 256

struct node {
       struct node * left;
       struct node * right;
       char * data;
};

struct node * insert(struct node *, struct node *);
struct node * build_node(char *);
char * getnext(void);
void walk_tree(struct node *);
void free_tree(struct node *);

void main()
{
       char * word;
       struct node *root, *new;
       
       root = NULL;
       free(root);                 /* error */
       
       do {
              word = getnext();
              new = build_node(word);
              root = insert(new,root);
       } while (word != NULL);
       
       walk_tree(root);
       free_tree(root);
       exit(0);
}

struct node * insert(struct node * new, struct node * tree)
{
       if (tree==NULL) return new;
       if (new == NULL) return tree;
       if (strcmp(new->data,tree->data) < 0)
          tree->left = insert(new,tree->left);
       else
          tree->right = insert(new,tree->right);
       return tree;
}
struct node * build_node(char * word)
{
       struct node * new;
       
       if (word == NULL) return NULL;
       new = (struct node *) malloc( sizeof(struct node));
       new->right = new->left = NULL;
       new->data = word;
       return new;
}

char * getnext(void)
{
       char * new;
       char buffer[MAX_LINE];
       if (gets(buffer) == NULL) return NULL;
       new = (char *) malloc( strlen(buffer)+1);
       strcpy(new,buffer);
       return new;
}

void walk_tree(struct node * tree)
{
       if (tree == NULL) return;
       if (tree->left != NULL) walk_tree(tree->left);
       if (tree->data != NULL) printf("%s\n",tree->data);
       if (tree->right != NULL) walk_tree(tree->right);
}

void free_tree(struct node * tree)
{
       if (tree == NULL) return;
       if (tree->left != NULL)
            free_tree(tree->left);
       if (tree->right != NULL)
            free_tree(tree->right);
       if (tree->data != NULL)
            free(tree->data);
       free(tree);
       free(tree);                 /* error */
}
/* End of File */