- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
-
- #define MAXWORD 100
-
- /* a binary tree node */
- typedef struct tnode_ {
- char *word;
- int count;
- struct tnode_ *left;
- struct tnode_ *right;
- } tnode;
-
- void print_tree(tnode *root);
- tnode *add_tree(tnode *root, char *word);
- void free_node(tnode *root);
-
- char *copy_string(char *s) {
- char *p = (char *)malloc(strlen(s)+1);
- if(p != NULL) {
- strcpy(p, s);
- }
-
- return p;
- }
-
- tnode *add_tree(tnode *p, char *word) {
- int result;
- if(p == NULL) {
- p = (tnode *)malloc(sizeof(tnode));
- p->word= copy_string(word); // Attention !
- p->count = 1;
- p->left = NULL;
- p->right = NULL;
- }
- else {
- result = strcmp(word, p->word);
- if(result < 0) {
- p->left = add_tree(p->left, word);
- }
- else if(result > 0) {
- p->right = add_tree(p->right, word);
- }
- else {
- p->count++;
- }
- }
-
- return p;
- }
-
- void print_tree(tnode *p) {
- if(p) {
- print_tree(p->left);
- printf("%s\t : %4d\n", p->word, p->count);
- print_tree(p->right);
- }
- }
-
- void free_node(tnode *p) {
- if(p) {
- free_node(p->left);
- free_node(p->right);
- free(p->word);
- free(p);
- }
- }
-
- int getword(char *word, int n) {
- int c;
- char *w = word;
-
- while(isspace(c = getchar())) {
- ;
- }
- if(c != EOF) {
- *w++ = c;
- }
- if(!isalpha(c)) {
- *w = '\0';
- return c;
- }
- while(n > 0) {
- c = getchar();
- if(isalnum(c)) {
- *w++ = c;
- }
- else {
- break;
- }
- n--;
- }
-
- *w = '\0';
- return w[0];
- }
-
- int main() {
- tnode *root = NULL; // 指针一定要初始化为NULL
- char word[MAXWORD];
-
- while((getword(word, MAXWORD)) != EOF) {
- if(isalnum(word[0])) {
- root = add_tree(root, word);
- }
- }
-
- print_tree(root);
-
- free_node(root);
-
- return 0;
- }
|