统计单词出现的频率

统计单词出现的频率

参考 《C程序设计语言》第6章 结构

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#define MAXWORD 100
#define BUFSIZE 100
char buf[BUFSIZE];
int bufp;
struct tnode{ //树的节点
    char *word; //指向单词的指针
    int count; //单词出现的次数
    struct tnode *left; //左子节点
    struct tnode *right; //右子节点
};
int getch(void);//取一个字符,可能是压回的字符
void ungetch(int);//把字符压回到输入栈中
int getword(char *word,int lim);//从输入中读取下一个单词或字符
struct tnode *talloc(void);
//addtree函数: 在p的位置或p的下方增加一个w节点
struct tnode *addtree(struct tnode *,char *);
//treeprint函数: 按序打印树p
void treeprint(struct tnode *);

//统计关键字出现的次数; 采用指针方式的版本
int main(){
    struct tnode *root;
    char word[MAXWORD];

    root=NULL;
    while(getword(word,MAXWORD)!=EOF)
        if(isalpha(word[0]))
        {
            root=addtree(root,word);
            printf("%s\n",root->word);
        }
            
    treeprint(root);
    return 0;

}
//addtree函数: 在p的位置或p的下方增加一个w节点
struct tnode *addtree(struct tnode *p,char *w){
    int cond;
    if(p==NULL){//该单词是一个新单词
        p=talloc();//创建一个新节点
        p->word=strdup(w);
        p->count=1;
        p->left=p->right=NULL;
        //printf("%s\n",p->word);
        //printf("%d\n",p->count);
    }
    else if((cond=strcmp(w,p->word))==0){
        p->count++;//新单词与节点中的单词匹配
        //printf("%s\n",p->word);
        //printf("%d\n",p->count);
    }
    else if(cond<0){//如果小于该节点的单词,则进入左子树
        p->left=addtree(p->left,w);
        //printf("%s\n",p->word);
        //printf("%d\n",p->count);
    }
    else{
        p->right=addtree(p->right,w);//如果大于该节点的单词,则进入右子树
        //printf("%s\n",p->word);
        //printf("%d\n",p->count);
    }
    return p;
}
//talloc函数: 创建一个tnode
struct tnode *talloc(void){
    return (struct tnode *) malloc(sizeof(struct tnode));
}
char *strdup(char *s){
    char *p;
    p=(char *)malloc(strlen(s)+1);//执行加1操作是为了在结尾加上字符'\0'
    if(p!=NULL)
        strcpy(p,s);
    return p;
}
int getword(char *word,int lim)//从输入中读取下一个单词或字符
{
    int c;
    char *w=word;
    while(isspace(c=getch()))
        ;
    if(c!=EOF)
        *w++=c;
    if(!isalpha(c)){
        *w++='\0';
        return c;
    }
    for(;--lim>0;w++)
        if(!isalpha(*w=getch())){
            ungetch(*w);
            break;
        }
        *w='\0';
        return word[0];
}

//treeprint函数: 按序打印树p
void treeprint(struct tnode *p){
    if(p!=NULL){
        treeprint(p->left);
        printf("%4d %s\n",p->count,p->word);
        treeprint(p->right);
    }
}

int getch(void){//取一个字符,可能是压回的字符
    return bufp>0?buf[--bufp]:getchar();
}
void ungetch(int c){//把字符压回到输入栈中
    if(bufp>=BUFSIZE)
        printf("栈已满\n");
    else
        buf[bufp++]=c;
}

实验结果

posted @ 2016-02-26 15:56  hopskin1  阅读(682)  评论(0编辑  收藏  举报