#include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> #define MAXWORD 100 struct tnode { /* the tree node: */ char *word; /* points to the text */ int count; /* number of occurrences 一个统计出现次数的计数值 */ struct tnode *left; /* left child */ struct tnode *right; /* right child */ }; struct tnode *addtree(struct tnode *, char *); void treeprint(struct tnode *); int getword(char *, int); /* word frequency count */ main() { struct tnode *root; char word[MAXWORD]; root = NULL; while (getword(word, MAXWORD) != EOF) if (isalpha(word[0])) root = addtree(root, word); treeprint(root); return 0; } struct tnode *talloc(void); /* addtree: add a node with w, at or below p */ struct tnode *addtree(struct tnode *p, char *w) { int cond; if (p == NULL) { /*a new word has arrived*/ p = talloc(); /* make a new node */ p->word = strdup(w); p->count = 1; p->left = p->right = NULL; } else if ((cond = strcmp(w, p->word)) == 0) p->count++; /* repeated word */ else if (cond < 0) /* less than into left subtree */ p->left = addtree(p->left, w); else /* greater than into right subtree */ p->right = addtree(p->right, w); return p; } /* treeprint: in-order print of tree p */ void treeprint(struct tnode *p) { if (p != NULL) { treeprint(p->left); printf("%4d %s/n", p->count, p->word); treeprint(p->right); } } /* getword: get next word or character from input. P134 */ int getword(char *word, int lim) { int c, getch(void); void ungetch(int); char *w = word; while (isspace(c = getch())) ; if (c != EOF) *w++ = c; if (!isalpha(c)) { *w = '/0'; return c; } for ( ; --lim > 0; w++) if (!isalnum(*w = getch())) { ungetch(*w); break; } *w = '/0'; return word[0]; } /* isspace 函数跳过空白符,isalpha 函数识别字母,isalnum 函数识别字母和数字。所有这些函数都定义在标准头文件<ctype.h>中。*/ #define BUFSIZE 100 char buf[BUFSIZE]; /* buffer for ungetch */ int bufp = 0; /* next free position in buf */ int getch(void) /* get a (possibly pushed-back) character */ { return (bufp > 0) ? buf[--bufp] : getchar(); } void ungetch(int c) /* push character back on input */ { if (bufp >= BUFSIZE) printf("ungetch: too many characters/n"); else buf[bufp++] = c; } /* talloc: make a tnode */ struct tnode *talloc(void) { return (struct tnode *) malloc(sizeof(struct tnode)); } /* strdup 函数只是把通过其参数传入的字符串复制到某个安全的位置。它是通过调用malloc 函数实现的: char *strdup(char *s) make a duplicate of s { char *p; p = (char *) malloc(strlen(s)+1); +1 for '/0' if (p != NULL) strcpy(p, s); return p; } */ 代码是整理自“The_C_Programming_Language”,注释有自己加的。