K&amp;R_6.5用二叉树统计单词出现的次数

2014-09-19

-----

```/*
* My practice of K&R 6.5
*
*/
#include
#include
#include
#include

#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);
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) {
}
else if(result > 0) {
}
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 = &#39;\0&#39;;
return c;
}
while(n > 0) {
c = getchar();
if(isalnum(c)) {
*w++ = c;
}
else {
break;
}
n--;
}

*w = &#39;\0&#39;;
return w[0];
}

int main() {
tnode *root = NULL; // 指针一定要初始化为NULL
char word[MAXWORD];

while((getword(word, MAXWORD)) != EOF) {
if(isalnum(word[0])) {
}
}

print_tree(root);

free_node(root);

return 0;
}
```

github:https://github.com/wusuopubupt/LearningC/blob/master/K%26R/chp6/binary_tree_word_counter.c