打印
[资料分享与下载]

用二叉树统计单词出现的次数

[复制链接]
857|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
東南博士|  楼主 | 2015-9-20 14:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
因为预先不知道出现的单词列表,无法方便地排序并使用折半查找;也不能分别对输入中的每个单词都执行一次线性查找,开销太大-->O(n^n)。
所以考虑使用二叉树的数据结构(O(n*logn))来组织这些单词,实现如下:
  • #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;  
  • }  

相关帖子

沙发
cowboy2014| | 2015-9-20 20:34 | 只看该作者
这个也是C语言的知识,楼主够辛苦的

使用特权

评论回复
板凳
FSL_TICS_ZJJ| | 2015-9-21 09:54 | 只看该作者
感谢楼主资料分享。
资料分享帖就没必要用未结帖形式了。

使用特权

评论回复
地板
東南博士|  楼主 | 2015-9-25 14:39 | 只看该作者
是吧!好的。
另外,飞思卡尔的有没有一些关于射频方面的资料?

使用特权

评论回复
5
芙蓉洞| | 2015-9-26 21:53 | 只看该作者
#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;  
}  

使用特权

评论回复
6
Mancherstun| | 2015-9-27 14:36 | 只看该作者
二叉树是不是倒立的树形啊?

使用特权

评论回复
7
東南博士|  楼主 | 2015-9-28 21:44 | 只看该作者
都差不多的!

使用特权

评论回复
8
lovecat2015| | 2015-9-29 09:04 | 只看该作者
最近看ucos 的源码也提到了二叉树

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

382

主题

6081

帖子

34

粉丝