BUAA词频统计(树实现)

2023-11-12

【问题描述】

编写程序统计一个英文文本文件中每个单词的出现次数(词频统计),并将统计结果按单词字典序输出到屏幕上。

要求:程序应用二叉排序树(BST)来存储和统计读入的单词。

注:在此单词为仅由字母组成的字符序列。包含大写字母的单词应将大写字母转换为小写字母后统计。在生成二叉排序树不做平衡处理。

【输入形式】

打开当前目录下文件article.txt,从中读取英文单词进行词频统计。

【输出形式】

程序应首先输出二叉排序树中根节点、根节点的右节点及根节点的右节点的右节点上的单词(即root、root->right、root->right->right节点上的单词),单词中间有一个空格分隔,最后一个单词后没有空格,直接为回车(若单词个数不足三个,则按实际数目输出)。

程序将单词统计结果按单词字典序输出到屏幕上,每行输出一个单词及其出现次数,单词和其出现次数间由一个空格分隔,出现次数后无空格,直接为回车。

【样例输入】

当前目录下文件article.txt内容如下:

“Do not take to heart every thing you hear.”

“Do not spend all that you have.”

“Do not sleep as long as you want;”

【样例输出】

do not take

all 1

as 2

do 3

every 1

have 1

hear 1

heart 1

long 1

not 3

sleep 1

spend 1

take 1

that 1

thing 1

to 1

want 1

you 3

【样例说明】

程序首先在屏幕上输出程序中二叉排序树上根节点、根节点的右子节点及根节点的右子节点的右子节点上的单词,分别为do not take,然后按单词字典序依次输出单词及其出现次数。

方法一

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>

typedef struct node
{
    char word[20];
    int num;
    struct node *lchild, *rchild;
} Tree;
Tree *temp, *tempp, *root = NULL, *add = NULL;

Tree *New(char w[]);
Tree *PTFT(Tree *root);

int main()
{
    char ch;
    FILE *fp;
    fp = fopen("article.txt", "r+");
    ch = fgetc(fp);
    while (ch != EOF)
    {
        char s[20] = {0};
        if ((ch <= 'z' && ch >= 'a') || (ch <= 'Z' && ch >= 'A'))
        {
            if (ch <= 'Z' && ch >= 'A')
                ch = ch + 32;
            s[0] = ch;
            for (int i = 1; i < 20; i++)
            {
                ch = fgetc(fp);
                if (ch <= 'Z' && ch >= 'A')
                {
                    ch = ch + 32;
                }
                if ((ch >= 'z' || (ch < 'a' && ch > 'Z') || ch < 'A'))
                {
                    root = New(s);
                    ungetc(ch, fp);
                    break;
                }
                s[i] = ch;
            }
        }
        ch = fgetc(fp);
    }
    while (tempp != NULL)
    {
        printf("%s ", tempp->word);
        tempp = tempp->rchild;
    }
    printf("\n");
    PTFT(root);
    fclose(fp);
    return 0;
}

Tree *New(char w[])
{
    temp = (Tree *)malloc(sizeof(Tree));
    temp->lchild = temp->rchild = NULL;
    for (int i = 0; i < 20; i++)
    {
        temp->word[i] = 0;
    }
    strcpy(temp->word, w);
    if (root == NULL)
    {
        temp->num = 1;
        root = tempp = temp;
    }
    else
    {
        temp->num = 1;
        for (int i = 0; strlen(tempp->word) != 0; i++)
        {
            if (strcmp(temp->word, tempp->word) > 0 && tempp->rchild == NULL)
            {
                tempp = tempp->rchild = temp;
                break;
            }
            if (strcmp(temp->word, tempp->word) > 0 && tempp->rchild != NULL)
                tempp = tempp->rchild;
            if (strcmp(temp->word, tempp->word) == 0)
            {
                tempp->num++;
                break;
            }
            if (strcmp(temp->word, tempp->word) < 0 && tempp->lchild != NULL)
                tempp = tempp->lchild;
            if (strcmp(temp->word, tempp->word) < 0 && tempp->lchild == NULL)
            {
                tempp = tempp->lchild = temp;
                break;
            }
        }
        tempp = root;
    }
    tempp = root;
    return root;
}

Tree *PTFT(Tree *root)
{
    if (root == NULL)
    {
        return NULL;
    }
    PTFT(root->lchild);
    printf("%s %d", root->word, root->num);
    printf("\n");
    PTFT(root->rchild);
    /*printf("%s %d", root->word, root->num);
    printf("\n");*/
    return NULL;
}

方法二

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct BSTree
{
    struct BSTree *lchild;
    char str[20];
    int num;
    struct BSTree *rchild;
};
typedef struct BSTree *bst;
bst tree, one, curr;
struct BSTree llBtree[100];
int n, treeIdx; // number, self_statistic;
int i, j, k;

bst creat_bst(char s[])
{
    one = &llBtree[treeIdx++];
    one->lchild = one->rchild = NULL;
    for (i = 0; i < 20; i++)
        one->str[i] = 0;
    strcpy(one->str, s);
    if (tree == NULL)
    {
        one->num = 1;
        tree = curr = one;
    }
    else
    {
        one->num = 1;
        for (j = 0; strlen(curr->str) != 0; j++)
        {
            if (strcmp(one->str, curr->str) < 0 && curr->lchild == NULL)
            {
                curr = curr->lchild = one;
                break;
            }
            else if (strcmp(one->str, curr->str) < 0 && curr->lchild != NULL)
                curr = curr->lchild;
            else if (strcmp(one->str, curr->str) > 0 && curr->rchild == NULL)
            {
                curr = curr->rchild = one;
                break;
            }
            else if (strcmp(one->str, curr->str) > 0 && curr->rchild != NULL)
                curr = curr->rchild;
            else if (strcmp(one->str, curr->str) == 0)
            {
                curr->num++;
                break;
            }
        }
    }
    curr = tree;
    return tree;
}

bst print_tree(bst tree)
{
    if (tree == NULL)
        return NULL;
    print_tree(tree->lchild);
    printf("%s %d\n", tree->str, tree->num);
    print_tree(tree->rchild);
    return NULL;
}

int main()
{
    char c;
    FILE *input = fopen("article.txt", "r");
    while ((c = fgetc(input)) != EOF)
    {
        char s[20] = {0};
        if ((c < 123 && c > 96) || (c < 91 && c > 64))
        {
            if (c < 91 && c > 64)
                c += 32;
            s[0] = c;
            for (i = 1; i < 20; i++)
            {
                c = fgetc(input);
                if ((c > 122 || (c < 97 && c > 90) || c < 65))
                {
                    tree = creat_bst(s);
                    ungetc(c, input);
                    break;
                }
                if (c < 91 && c > 64)
                    c += 32;
                s[i] = c;
            }
        }
        else
            continue;
    }
    for (; curr != NULL; curr = curr->rchild)
        printf("%s ", curr->str);
    printf("\n");
    print_tree(tree);
    return 0;
}

仅供参考、学习!不得抄袭!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BUAA词频统计(树实现) 的相关文章

  • 计算机专业论文 方向,计算机专业本科生方向论文题目 计算机专业本科生论文题目怎样取...

    100道 计算机专业本科生方向论文题目供您参考 希望能解决毕业生们的计算机专业本科生论文题目怎样取相关问题 选好题目那就开始写计算机专业本科生论文吧 一 比较好写的计算机专业本科生论文题目 1 对本科生计算机课程教学改革的探讨 2 浅谈对本
  • 《UNIX环境高级编程》笔记 第十三章-守护进程

    1 概念 守护进程 daemon 是生存期长的一种进程 它们常常在系统引导装入时启动 仅在系统关闭时才终止 因为它们没有控制终端 所以说它们是在后台运行的 Linux的大多数服务就是用守护进程实现的 这些守护进程名通常以d结尾 如inetd
  • ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; con

    作业背景 node mysql 附 想必各位点进来都是遇到了这个错误 我们都知道报错提示的是出问题的范围 而在范围内有着许多不确定的因素 抽象些来说就是导致脱发的原因不一定是熬夜 还有可能是压力大 焦虑 疾病等原因 问题描述 ER NOT
  • Centos离线手动安装gcc

    正常联网情况下 在Centos系统中 我们可以使用yum命令很方便的从网络自动下载和安装gcc编译器 但是 由于各种原因 在实际使用中 Centos系统系统不允许介入互联网 所以只能自己手动下载 上传至服务器 再自己安装编译器 网上可以找到
  • 云计算 第3章虚拟化技术(2)

    物理网络与虚拟网络 CPU虚拟化 CPU及指令集 CPU的操作由它所执行的指令确定 这些指令成为机器指令Machine Instruction 目前 X86服务器在企业中的部署与应用越来越广泛 X86是一个Intel通用计算机系列的编号 也
  • Sqoop使用汇总

    命令 查看数据库 sqoop list databases connect jdbc mysql 127 0 0 1 3306 username root password root 查看表 sqoop list tables connec
  • 巨详细,大电流线性电源(LDO)原理,看完你就明白了

    原文来自公众号 工程师看海 上一篇文章介绍了PMOS结构线性电源的基本工作原理 今天结合仿真介绍大电流LDO使用的NMOS 架构基本工作原理 以及其他一些重要的LDO参数 包括PSRR Dropout Voltage等 添加微信 chunh
  • 对于模式的思考

    一是确定那些知识是需要掌握的 第二则是如何掌握 Pattern无疑是需要学习的 但事实是它很容易被遗忘 却很难在实际工作中熟练地运用 方法就是将解决问题的模式与实际中某个重要的应用match起来 1 Structural Pattern D

随机推荐

  • 数据整理——大数据治理的关键技术

    摘要 数据是政府 企业和机构的重要资源 数据治理关注数据资源有效利用的众多方面 如数据资产确权 数据管理 数据开放共享 数据隐私保护等 从数据管理的角度 探讨了数据治理中的一项关键技术 数据整理 介绍了以数据拥有者和直接使用者 行业用户 为
  • 如何引导机器?如何面临人机结合?《​人工智能与人类未来》

    微信公众号 乐生活与爱 公众号曾转载过蔡恒进教授的奇文 意识如何演化 机器何时有自我意识 附着与隧通 心智的工作模式 值得反复也读 我上周听了由北京大学博古睿研究中心 中国人民大学哲学院 中国人民大学哲学与认知科学交叉平台 服务器艺术联合主
  • “孔乙己的长衫”:学历究竟成为敲门砖还是枷锁

    在社会上 学历是一个很重要的指标 学历不高的人 在工作中很难晋升到管理层 学历高的人 则可以获得更多的机会 但事实上 这只是一个表面现象 更多的是学历给人带来的附加值 我虽然知道这世界上有一个孔乙己 但我却并不知道他生活在哪个城市 如果可以
  • css文本超出2行显示...

    可以使用CSS的text overflow和ellipsis属性来实现文本超过2行时显示省略号 设置文本溢出隐藏 使用CSS的overflow属性来将文本溢出部分隐藏 同时使用white space属性来设置文本换行方式为normal或者n
  • 关于struts漏洞

    文章出处 阿里云社区 漏洞扫描 gt 技术运维问题 gt 技术分享 gt Struts2代码执行漏洞 Apache Struts s2 005 远程代码执行漏洞 CVE 2010 1870 受影响版本 Struts 2 0 0 Struts
  • Kconfig:'endmenu' in different file than 'menu'

    问题描述 heat ubuntu AM5728 update u boot 2017 01 g70d59ba v2 0 make ARCH arm menuconfig scripts kconfig mconf Kconfig drive
  • CGAL 点云随机下采样

    目录 一 概述 1 主要函数 二 代码实现 三 结果展示 一 概述 随机删除用户指定的输入点的一部分 1 主要函数 头文件 include
  • 解决PowerShell不显示conda虚拟环境的问题

    目录 1 指令正常执行和结果 2 指令执行异常以及解决办法 问题1 CommandNotFoundError No command conda conda 问题2 conda init powershell执行完毕后 重启PowerShel
  • 工作中经常使用shell脚本

    在工作中我们常用shell脚本处理一些问题 今天在来一些这里整理了一些工作中常用的简单shell脚本 1 更新脚本 bin bash apt get update DEBIAN FRONTEND noninteractive apt get
  • 【C语言】小游戏-扫雷(清屏+递归展开+标记)

    大家好 我是深鱼 目录 一 游戏介绍 二 文件分装 三 代码实现步骤 1 制作简易游戏菜单 2 初始化棋盘 11 11 3 打印棋盘 9 9 4 布置雷 5 计算 x y 周围8个坐标的和 6 排查雷 lt 1 gt 清屏后打印棋盘 lt
  • Python:赋值,浅拷贝(copy)和深拷贝(deepcopy)

    基础知识请查看之前博客 Python 对象 可变对象与不可变对象 赋值 浅拷贝和深拷贝的关键问题 修改一个变量 会不会导致另外拷贝出来的对象的改变 不可变对象 import copy a1 0 a2 a1 a3 copy copy a1 a
  • 使用https://mail.google.com/登录GMail

    原来使用gmail google com登录 登录可以进去 但查看邮件时 总是出现 Oop unable to reach Gmail Please check your internet connection and try again
  • spring-boot后端解决跨域问题

    代码 import cn hutool log Log import cn hutool log LogFactory import com alibaba fastjson JSONObject import org springfram
  • 添加静态路由实现不同网段的路由的通信和不用网段之间设备的通信

    两不同网段的路由器 如何互通 三个案例详解 gzmenghai com
  • 下一代电信城域网设计原则

    下一代电信城域网设计原则 作者 epon 运营商早期建设的IP城域网多采用大L3 小L3的组网模式 核心层旁挂BAS 在运营中遇到很多问题 过大的二层网络 导致网络的安全性 可靠性较差 网络不可管理 传统L3设备 采用低成本ASIC套片 提
  • error:expected '=',',',';','asm'or'_attribute_'

    今天在Linux上调一个存包队列 当用gcc编译时 出现error expected asm or attribute 等错误 这个错误是出现在两个函数上 这两个函数的返回类型是bool 当我把bool类型改为void 再进行编译时 错误就
  • 菜鸟教程《Python 3 教程》笔记(18):File(文件)方法

    菜鸟教程 Python 3 教程 笔记 18 18 File 文件 方法 18 1 open 方法 18 2 file 对象 18 2 1 flush 18 2 2 fileno 18 2 3 isatty 18 2 4 truncate
  • PROFINET趣谈——设备模型

    设备名 MAC地址和IP地址是为了在网络中找到对应设备 而要定位确切的输入 IX1 1 输出 QW2 就需要熟悉设备模型的概念 PROFINET IO的设备类型与PROFIBUS几乎相同 如图所示 设备模型包括若干槽 slot 与子槽 su
  • Java内存泄露监控工具:JVM监控工具介绍

    jstack 如果java程序崩溃生成core文件 jstack工具可以用来获得core文件的java stack和native stack的信息 从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题 另外 jstack工具还可以附
  • BUAA词频统计(树实现)

    问题描述 编写程序统计一个英文文本文件中每个单词的出现次数 词频统计 并将统计结果按单词字典序输出到屏幕上 要求 程序应用二叉排序树 BST 来存储和统计读入的单词 注 在此单词为仅由字母组成的字符序列 包含大写字母的单词应将大写字母转换为