| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1734 人关注过本帖, 1 人收藏
标题:二叉树实现单词统计分享
只看楼主 加入收藏
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
结帖率:97.5%
收藏(1)
已结贴  问题点数:20 回复次数:5 
二叉树实现单词统计分享
当初递归理解不是很清楚,又从新去回忆了下递归,导致这个程序理解花了太长时间了。代码虽然短小,里面要学的东西不少,要加油咯。

binary_tree.cpp:
程序代码:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

#define MAXWORD    100

struct tnode
{
    char *word;
    int count;
    struct tnode *left;
    struct tnode *right;
};

struct tnode *addtree(struct tnode*, char *);
struct tnode *talloc();
char *strdup1(char *);
void treeprint(struct tnode*);
int getword(char *, int);

int main()
{
    struct tnode *root;
    char word[MAXWORD];

    root = NULL;
    while (getword(word, MAXWORD) != EOF)
        if (isalpha(*word))
            root = addtree(root, word);
    treeprint(root);
    return 0;
    
}

struct tnode *addtree(struct tnode *p, char *w)
{
    int cond;

    if (p == NULL)
    {
        p = talloc();
        p->word = strdup1(w);
        p->count = 1;
        p->left = p->right = NULL;
    }
    else if (!(cond = strcmp(p->word, w)))
        p->count++;
    else if (cond < 0)
        p->left = addtree(p->left, w);
    else
        p->right = addtree(p->right, w);
    return p;
}

struct tnode *talloc()
{
    return (struct tnode *)malloc(sizeof(struct tnode));
}

char *strdup1(char *s)
{
    char *p;

    p = (char *)malloc(strlen(s) + 1);
    if(p != NULL)
    strcpy(p, s);
    return p;
}

void treeprint(struct tnode *p)
{
    if (p != NULL) {
        treeprint(p->left);
        printf("%4d %s\n", p->count, p->word);
        treeprint(p->right);
    }
}


getword.cpp:
程序代码:
#include <ctype.h>
#include <stdio.h>

int getword(char *word, int lim)
{
    int c, getch();
    void ungetch(int);
    char *w = word;

    while (isspace(c = getch()))
        ;
    if (c != EOF)
        *w++ = c;
    if (!isalpha(c)) {
        *w = '\0';
        return c;
    }
    for (; --lim; w++)
        if (!isalnum(*w = getch()))
        {
            break;
        }
    *w = '\0';
    return word[0];
}


getch.cpp:
程序代码:
#include<stdio.h>

#define BUFSIZE 100

char buf[BUFSIZE];
int bufp = 0;

int getch()
{
    return (bufp > 0) ? buf[--bufp] : getchar();
}

void ungetch(int c)
{
    if (bufp >= BUFSIZE)
        printf("ungetch: too many charaters\n");
    else
        buf[bufp++] = c;
}
收到的鲜花
  • 九转星河2017-05-18 12:08 送鲜花  10朵   附言:选材好~
搜索更多相关主题的帖子: 二叉树 单词 统计 
2017-05-18 12:00
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:10 
这个选材好~可以看看键树实现单词统计~前者效率取决于单词的平均数量~后者效率取决于单词的平均长度~当然二叉搜索树改进为AVL树大数据搜索效率会更高~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-18 12:07
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:10 
嗯……现在我可以肯定了,这是书上的示例代码。

除了main()函数,没有一段是你自己写的。
好吧,连main()函数都不是。

[此贴子已经被作者于2017-5-18 12:11编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-18 12:07
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 3楼 renkejun1942
我现在没时间去做练习题。现在主要是理解程序的结构和算法。争取20天把后面三章理解。就是这么急。。。。

[此贴子已经被作者于2017-5-18 12:18编辑过]

2017-05-18 12:17
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 4楼 Emotiona
其实我学习数据结构都没有一本数据结构算法书~上论坛~查资料~自己思考总结~~正常来说大二老师要重新讲一次~到时后再系统完善一下知识点~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-18 12:26
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 5楼 九转星河
我那个擦。我还有20天毕业。现在连个新手都不是。我们专科只有java 没有c  唉。不知道拿什么拯救了。数据结构这东西我先放着,把k&r的基础都理解在系统学习
2017-05-18 12:31
快速回复:二叉树实现单词统计分享
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030531 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved