1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
/*
!!DESCRIPTION!! print word frequencies; uses structures
!!ORIGIN!! LCC 4.1 Testsuite
!!LICENCE!! own, freely distributeable for non-profit. read CPYRIGHT.LCC
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXWORDS 250
FILE *in;
#define getchar() fgetc(in)
struct node
{
int count; /* frequency count */
struct node *left; /* left subtree */
struct node *right; /* right subtree */
char *word; /* word itself */
} words[MAXWORDS];
int next; /* index of next free entry in words */
/*struct node *lookup();*/
#if defined(NO_NEW_PROTOTYPES_FOR_OLD_FUNC_DECL) && !defined(NO_OLD_FUNC_DECL)
#else
int err(char *s);
int getword(char *buf);
void tprint(struct node *tree);
struct node *lookup(char *word, struct node **p);
#endif
int isletter(char c);
/* err - print error message s and die */
#ifndef NO_OLD_FUNC_DECL
err(s) char *s; {
#else
int err(char *s) {
#endif
printf("? %s\n", s);
exit(EXIT_FAILURE);
}
/* getword - get next input word into buf, return 0 on EOF */
#ifndef NO_OLD_FUNC_DECL
int getword(buf) char *buf;
#else
int getword(char *buf)
#endif
{
char *s;
int c;
while (((c = getchar()) != -1) && (isletter(c) == 0))
;
for (s = buf; (c = isletter(c)); c = getchar())
*s++ = c;
*s = 0;
if (s > buf)
return 1;
return 0;
}
/* isletter - return folded version of c if it is a letter, 0 otherwise */
int isletter(char c)
{
if ((c >= 'A') && (c <= 'Z')) c += 'a' - 'A';
if ((c >= 'a') && (c <= 'z')) return c;
return 0;
}
/* lookup - lookup word in tree; install if necessary */
#ifndef NO_OLD_FUNC_DECL
struct node *lookup(word, p)
char *word; struct node **p;
#else
struct node *lookup(char *word, struct node **p)
#endif
{
int cond;
/* char *malloc(); */
if (*p) {
cond = strcmp(word, (*p)->word);
if (cond < 0)
return lookup(word, &(*p)->left);
else if (cond > 0)
return lookup(word, &(*p)->right);
else
return *p;
}
if (next >= MAXWORDS)
err("out of node storage");
words[next].count = 0;
words[next].left = words[next].right = 0;
words[next].word = malloc(strlen(word) + 1);
if (words[next].word == 0)
err("out of word storage");
strcpy(words[next].word, word);
return *p = &words[next++];
}
/* tprint - print tree */
#ifndef NO_OLD_FUNC_DECL
void tprint(tree) struct node *tree; {
#else
void tprint(struct node *tree) {
#endif
if (tree) {
tprint(tree->left);
printf("%d:%s\n", tree->count, tree->word);
tprint(tree->right);
}
}
int main(void)
{
struct node *root;
char word[20];
in = fopen("wf1.in","rb");
if (in == NULL) {
return EXIT_FAILURE;
}
root = 0;
next = 0;
while (getword(word))
lookup(word, &root)->count++;
tprint(root);
fclose(in);
return 0;
}
|