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