#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct list_node list_node;
struct list_node
{
unsigned number;
list_node *next;
};
typedef struct tree_node tree_node;
struct tree_node
{
char *word;
list_node *first, *last;
tree_node *left, *right;
};
int get_token(char *s, size_t n);
tree_node *
add_tree(tree_node *t, char *w, unsigned n);
void put_tree(tree_node *t);
#define MAX_TOKEN 256
int main()
{
tree_node *xr = NULL;
char token[MAX_TOKEN];
unsigned ln = 1;
while (get_token(token, MAX_TOKEN) != EOF)
if (isalpha(token[0])
|| token[0] == '_')
xr = add_tree(xr, token, ln);
else if (token[0] == '\n')
++ln;
put_tree(xr);
return 0;
}
int get_token(char *s, size_t n)
{
int c;
while ((c = fgetc(stdin)) != EOF)
if (isalpha(c) || c == '_' || c == '\n')
break;
if (c == EOF)
{
*s = '\0';
return EOF;
}
*s++ = c;
n -= 2;
if (c != '\n')
{
while (isalnum(c = fgetc(stdin))
|| c == '_')
if (n > 0)
{
*s++ = c;
--n;
}
ungetc(c, stdin);
}
*s = '\0';
return 1;
}
tree_node *
add_tree(tree_node *t, char *w, unsigned n)
{
int cmp;
if (t == NULL)
{
t = (tree_node *)
malloc(sizeof(tree_node));
t->word = (char *)malloc(strlen(w) + 1);
strcpy(t->word, w);
t->first = (list_node *)
malloc(sizeof(list_node));
t->first->number = n;
t->first->next = NULL;
t->last = t->first;
t->left = t->right = NULL;
}
else if ((cmp = strcmp(w, t->word)) < 0)
t->left = add_tree(t->left, w, n);
else if (cmp > 0)
t->right = add_tree(t->right, w, n);
else if (n != t->last->number)
{
t->last->next = (list_node *)
malloc(sizeof(list_node));
t->last = t->last->next;
t->last->number = n;
t->last->next = NULL;
}
return t;
}
void put_tree(tree_node *t)
{
list_node *p;
if (t != NULL)
{
put_tree(t->left);
printf("%12s: ", t->word);
(p = t->first;
for(;p != NULL;p = p->next)
printf("%4d ", p->number);
printf("\n");
put_tree(t->right);
}
}
/* End of File */