BST for words

Chapter: BST for words


Exercise 3

Complete the following program. The places where you need to incorporate your own code are marked /* Write code to ... */. To keep you on your toes, you will have to look for places where I have inserted a space after a < sign to ensure your browser doesn't eat C code thinking it's a label! If you prefer to write your own code from scratch instead of editing mine, feel free to do so.
#include < stdlib.h >
#include < stdio.h >
#define MAX 10000
void extern exit(int);
FILE *inFile;


char wordsbuffer[MAX];
char *thisword;
char *nextword = wordsbuffer;
int done = 0;

typedef struct treenode {
/* Write code to define the fields here */
} TreeNode, *TreeNodePtr;
 
/* Is my character alphabetic? */
int alpha(char ch) {
  return  ((ch > = 'a' && ch < = 'z')||(ch > = 'A'&&ch < = 'Z'));
}

/* Convert to lower case */
char lower(char c) {
  return (c > = 'A' && c < = 'Z') ? c + 'a' - 'A' : c;
}

char *getword() {
  if (done) return (char*) EOF;
  thisword = nextword;
  while (!alpha(*nextword = fgetc(inFile)) && (*nextword != EOF));
  if (*nextword == EOF) return (char*) EOF;
  *nextword = lower(*nextword);
  while (alpha(*++nextword = lower(fgetc(inFile))));
  if (*nextword == EOF) done = 1;
  *nextword++ = '\0';
  return thisword;
}

void print_tree(t) 
  TreeNodePtr t;
{
/* Write code to print the information in the tree in a sensible order */
}

/* To compare two strings.  Returns negative, 0 or positive depending as
   s precedes, equals, or follows t alphabetically */

int strcomp(s, t)
     char *s, *t;
{
  for ( ; *s == *t; s++, t++) if (*s == 0) return 0;
  return (*s - *t);
}

TreeNodePtr insert(t, w) 
     TreeNodePtr t;
     char *w;
{
/* Complete this code */
  int comp;
  if (t == NULL) {    /* insert word into empty tree or subtree */
    t = malloc(sizeof(TreeNode));
    t->myword = w;
    t->count = 1;
    t->leftchild = t->rightchild = NULL;
  }
  else if ((comp = strcomp(w, t->myword)) == 0)
  /* Write code to deal with inserting word w identical to that in root t */
    ;
  else if (comp < 0) 
     /* Write code to deal with word w preceding that in root t */
     ;
  else 
    /* Write code to deal with word w following the word in root t */
     ;
  return t;

}

void recycle(TreeNodePtr t) {
/* Write code to free all the memory you malloc'ed */
}

main(argc, argv)
     int argc; char *argv[];
{
  TreeNodePtr root;
  if (argc < 2) {
    fprintf(stderr, "Usage: fread < filename >\n");
    exit(-1);
  }
  inFile = fopen(argv[1], "r");
  char *this;
  root = NULL;
  while ((this = getword()) != (char*) EOF) root = insert(root, this);
  print_tree(root);
  recycle(root);
}




rhyspj@gwu.edu