Listing 1

/*
 * xr.c - a cross-reference generator
 */
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct listnode listnode;
struct listnode
   {
   unsigned number;
   listnode *next;
   };

typedef struct treenode treenode;
struct treenode
   {
   char *word;
   listnode *lines;
   treenode *left, *right;
   };

treenode *addtree(treenode *t, char *w, unsigned n);
void printtree(treenode *t);
int getword(char *word, size_t lim);

#define MAXWORD 100

int main(void)
   {
   treenode *root = NULL;
   char word[MAXWORD];
   unsigned lineno = 1;
   
   while (getword(word, MAXWORD) != EOF)
      if (isalpha(word[0]))
          root = addtree(root, word, lineno);
      else if (word[0] == '\n')
          ++lineno;
   printtree(root);
   return 0;
   }