統計入力内のすべての単語が表示される回数(二叉検索ツリーを使用して実装:再帰と非再帰)


/*@function:               
 * @method:        。               ,            ,          ;  ,      
 */
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>

#define MAXWORD 	100

typedef struct tnode
{
	char 	word[MAXWORD];
	int 	count;
	struct tnode *left;
	struct tnode *right;
}tnode_t;

tnode_t *addtree(tnode_t *, char *);
void treeprint(tnode_t *);
int getword(char *, int);



main(void)
{
		tnode_t *root;
		char word[MAXWORD];
		
		root = NULL;
		while(getword(word, MAXWORD) != EOF)
			if(isalpha(word[0]))
				root = addtree(root, word);
		treeprint(root);
		return 0;
}

/* add a node to the tree by using non-recursive method */
/*
tnode_t *addtree(tnode_t *p, char *w)
{
	int cond;
	tnode_t *s, *temp1, *temp2;//s     node,temp2 temp1    
	s = (tnode_t *)malloc(sizeof(tnode_t));
	if(s == NULL)
	{
		printf("error: malloc
"); exit(0); } strcpy(s->word, w); s->count = 1; s->left = s->right = NULL; if(p == NULL) //if tree is empty { p = s; return p; } temp1 = p; while(temp1 != NULL) //find the place to insert { temp2 = temp1; if((cond = strcmp(w, temp1->word)) < 0) temp1 = temp1->left; else if(cond == 0) //if the node is existed, count increases, and free memory of s { temp1->count++; free(s); return p; } else temp1 = temp1->right; } if((cond = strcmp(w, temp2->word)) < 0) temp2->left = s; else temp2->right = s; return p; } **/ /* add a node to the tree by using recursive method */ tnode_t *addtree(tnode_t *p, char *w) { int cond; tnode_t *s; if(p == NULL) // { s = (tnode_t *)malloc(sizeof(tnode_t)); if(s == NULL) { printf("error: malloc
"); exit(0); } strcpy(s->word, w); s->count = 1; s->left = s->right = NULL; p = s; return p; } else if((cond = strcmp(w, p->word)) < 0) p->left = addtree(p->left, w);//note else if(cond == 0) p->count++; else p->right = addtree(p->right, w); return p; } /***********************************/ /* inorder print */ void treeprint(tnode_t *p) { if(p != NULL) { treeprint(p->left); printf("%s\t%d
", p->word, p->count); treeprint(p->right); } } /***********************************/ int getword(char *word, int lim) { int c; char *w = word; while(isspace(c = getchar())) // c , ; if(c != EOF) *w++ = c; if(!isalpha(c)) // c { *w = '\0'; return c; } for(; --lim > 0; w++) if(!isalnum(*w = getchar())) // c break; *w = '\0'; return word[0]; }