|
|
1.1 ! root 1: /* wf1 - print word frequencies; uses structures */ ! 2: ! 3: struct node { ! 4: int count; /* frequency count */ ! 5: struct node *left; /* left subtree */ ! 6: struct node *right; /* right subtree */ ! 7: char *word; /* word itself */ ! 8: } words[2000]; ! 9: int next; /* index of next free entry in words */ ! 10: ! 11: struct node *lookup(); ! 12: ! 13: main() { ! 14: struct node *root; ! 15: char word[20]; ! 16: ! 17: root = 0; ! 18: next = 0; ! 19: while (getword(word)) ! 20: lookup(word, &root)->count++; ! 21: tprint(root); ! 22: return 0; ! 23: } ! 24: ! 25: /* err - print error message s and die */ ! 26: err(s) char *s; { ! 27: printf("? %s\n", s); ! 28: exit(1); ! 29: } ! 30: ! 31: /* getword - get next input word into buf, return 0 on EOF */ ! 32: int getword(buf) char *buf; { ! 33: char *s; ! 34: int c; ! 35: ! 36: while ((c = getchar()) != -1 && isletter(c) == 0) ! 37: ; ! 38: for (s = buf; c = isletter(c); c = getchar()) ! 39: *s++ = c; ! 40: *s = 0; ! 41: if (s > buf) ! 42: return (1); ! 43: return (0); ! 44: } ! 45: ! 46: /* isletter - return folded version of c if it is a letter, 0 otherwise */ ! 47: int isletter(c) { ! 48: if (c >= 'A' && c <= 'Z') ! 49: c += 'a' - 'A'; ! 50: if (c >= 'a' && c <= 'z') ! 51: return (c); ! 52: return (0); ! 53: } ! 54: ! 55: /* lookup - lookup word in tree; install if necessary */ ! 56: struct node *lookup(word, p) char *word; struct node **p; { ! 57: int cond; ! 58: char *malloc(); ! 59: ! 60: if (*p) { ! 61: cond = strcmp(word, (*p)->word); ! 62: if (cond < 0) ! 63: return lookup(word, &(*p)->left); ! 64: else if (cond > 0) ! 65: return lookup(word, &(*p)->right); ! 66: else ! 67: return *p; ! 68: } ! 69: if (next >= 2000) ! 70: err("out of node storage"); ! 71: words[next].count = 0; ! 72: words[next].left = words[next].right = 0; ! 73: words[next].word = malloc(strlen(word) + 1); ! 74: if (words[next].word == 0) ! 75: err("out of word storage"); ! 76: strcpy(words[next].word, word); ! 77: return *p = &words[next++]; ! 78: } ! 79: ! 80: /* tprint - print tree */ ! 81: tprint(tree) struct node *tree; { ! 82: if (tree) { ! 83: tprint(tree->left); ! 84: printf("%d\t%s\n", tree->count, tree->word); ! 85: tprint(tree->right); ! 86: } ! 87: } ! 88: ! 89: /* strcmp - compare s1 and s2, return <0, 0, or >0 */ ! 90: int strcmp(s1, s2) char *s1, *s2; { ! 91: while (*s1 == *s2) { ! 92: if (*s1++ == 0) ! 93: return 0; ! 94: ++s2; ! 95: } ! 96: if (*s1 == 0) ! 97: return -1; ! 98: else if (*s2 == 0) ! 99: return 1; ! 100: return *s1 - *s2; ! 101: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.