2nd 词频统计更新
词频统计更新
实现功能:从控制台输入文件路径,并统计单词总数及不重复的单词数,并输出所有单词词频,同时排序。
头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
定义宏
#define WORD_LENGTH 250
定义结构体及全局变量
typedef struct Node
{
char word[WORD_LENGTH];
int time;
struct Node *next;
}wordNode; typedef struct TopNode
{
int sum; //全文单词个数
int num; //全文无重复单词个数
wordNode * next;
}TopNode; TopNode t; TopNode * L = NULL;
声明文件中使用的函数
wordNode *wordSearch(char *word);
void wordJob(char word[]);
void wordCount(char *word); void printCountList();
void PrintFirstTenTimes(); void mergeSort(wordNode **head);
void FrontBackSplit(wordNode *head,wordNode **pre,wordNode **next);
wordNode *SortedMerge(wordNode *pre,wordNode *next); void release();
主函数
int main(int argc,char *argv[])
{
char temp[WORD_LENGTH];//定义用以临时存放单词的数组
char file_path[];
wordNode * h;
FILE *file;
printf("请输入文件路径:");
gets(file_path);
if((file = fopen(file_path, "r")) == NULL)
{
printf("文件读取失败!");
exit();
}
L = &t;
L->num = ;
L->sum = ;
L->next = NULL;
while((fscanf(file,"%s",temp))!= EOF)
{
L->sum++;
wordJob(temp);
wordCount(temp);
}
fclose(file);
printCountList();
printf("\n\n输出词频最高的10个词\n");
h = L->next;
mergeSort(&h); //排序
PrintFirstTenTimes();
release();
return ;
}
查找单词所在节点并返回
wordNode *wordSearch(char *word)
{
char * t;
wordNode *node;
wordNode *nextNode = L->next;
if(L->next == NULL)
{
node = (wordNode*)malloc(sizeof(wordNode));
strcpy(node->word,word);
node->time = ;
node->next = NULL; //初试化,必须有,否则会发生错误。
L->num++;
L->next = node;
return node;
}
while(nextNode != NULL) //查找匹配单词
{
t = nextNode->word;
if(strcmp(t,word) == )
{
return nextNode;
}
nextNode = nextNode->next;
}
if(nextNode == NULL) //原链表中不存在该单词
{
node = (wordNode*)malloc(sizeof(wordNode));
strcpy(node->word, word);
node->time = ;
node->next = L->next;
L->next = node;
L->num++;
return node;
}
else
return nextNode; //返回查找到的节点
}
词频统计
void wordCount(char *word)
{
wordNode *tmpNode;
tmpNode = wordSearch(word); //word所在的节点
tmpNode->time++;
}
输出所有词频
void printCountList()
{
int i = ;
wordNode *node = L->next;
if(L->next == NULL)
{
printf("该文件无内容!"); }
else
{
printf("\n这篇文章总计%d词\n\n不重复单词共%d个\n",L->sum,L->num);
printf("\n输出所有单词的频数\n");
while(node != NULL)
{
printf(" %s:%d次\t",node->word,node->time);
i++;
node = node->next;
if(i% == )
printf("\n");
}
}
}
输出词频最高的10个词
void PrintFirstTenTimes()
{
wordNode *node = L->next;
int i = ;
if(L->next == NULL)
{
printf("该文件无内容!"); }
else
{
while (node != NULL && i<=)
{
printf("\t%s:%d次\n",node->word,node->time);
node = node->next;
i++;
}
}
}
对词频统计结果进行归并排序
void mergeSort(wordNode **headnode)
{
wordNode *pre,*next,*head;
head = *headnode;
if(head == NULL || head->next == NULL)
{
return;
}
FrontBackSplit(head,&pre,&next);
mergeSort(&pre);
mergeSort(&next);
*headnode = SortedMerge(pre,next); //插入排序
}
取尾节点
void FrontBackSplit(wordNode *source,wordNode **pre,wordNode **next)
{
wordNode *fast;
wordNode *slow;
if(source == NULL || source->next == NULL)
{
*pre = source;
*next = NULL;
}
else
{
slow = source;
fast = source->next;
while(fast != NULL)
{
fast = fast->next;
if(fast != NULL)
{
slow = slow->next;
fast = fast->next;
}
}
*pre = source;
fast = source;
*next = slow->next; //pre和next为传址
slow->next = NULL;
}
}
取频数最大的节点作为头节点
wordNode *SortedMerge(wordNode *pre,wordNode *next)
{
wordNode *result = NULL;
if(pre == NULL)
return next;
else if(next == NULL)
return pre;
if(pre->time >= next->time)
{
result = pre;
result->next = SortedMerge(pre->next,next);
}
else
{
result = next;
result->next = SortedMerge(pre,next->next);
}
return result;
}
处理单词
void wordJob(char word[])
{
int i,k;
for(i = ;i<strlen(word);i++)
{
if(word[i]>='A'&& word[i]<='Z')
{
word[i] += ;
continue;
}
if(word[i]<'a'||word[i]>'z')
{
if(i == (strlen(word)-))
{
word[i] = '\0';
}
else
{
k = i;
while(i < strlen(word))
{
word[i] = word[i+];
i++;
}
i = k;
}
}
}
}
释放所有结点内存
void release()
{
wordNode *pre;
if(L->next == NULL)
return;
pre = L->next;
while(pre != NULL)
{
L->next = pre->next;
free(pre);
pre = L->next;
}
}
ssh://git@git.coding.net:amberpass/cptjgx.git
https://git.coding.net/amberpass/cptjgx.git
2nd 词频统计更新的更多相关文章
- 2nd 词频统计效能测试
词频统计效能测试 使用性能分析工具分析结果如下 :
- 【week2】 词频统计第一次更新
词频统计: 对每个功能预计时间: 功能 预计(min) 实际(min) 数据流读入 20 40 正则规范字符串 15 20 排序 30 45 输出 20 30 其他 25 词频统计psp 日期 类 ...
- 作业3-个人项目<词频统计>
上了一天的课,现在终于可以静下来更新我的博客了. 越来越发现,写博客是一种享受.来看看这次小林老师的“作战任务”. 词频统计 单词: 包含有4个或4个以上的字 ...
- 软件工程第一次个人项目——词频统计by11061153柴泽华
一.预计工程设计时间 明确要求: 15min: 查阅资料: 1h: 学习C++基础知识与特性: 4-5h: 主函数编写及输入输出部分: 0.5h: 文件的遍历: 1h: 编写两种模式的词频统计函数: ...
- Programming | 中/ 英文词频统计(MATLAB实现)
一.英文词频统计 英文词频统计很简单,只需借助split断句,再统计即可. 完整MATLAB代码: function wordcount %思路:中文词频统计涉及到对"词语"的判断 ...
- 词频统计 List Array
c# 使用数组进行词频统计 1.先考虑要是使用的数据结构: Array在在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单,但是数组存在一些不足的地方.在数组的两个数据间插入数据 ...
- C语言词频统计设计
项目需求: 1.设计一个词频统计小软件,对给定的英文文章进行单词频率的统计. 2.文章中相应的标点不计入统计. 3.将统计结果以从大到小的排序方式输出. 设计: 1.因为功能相对简单,采用C语言直接进 ...
- 词频统计的java实现方法——第一次改进
需求概要 原需求 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 新需求: 1.小文件输入. 为表明程序能跑 ...
- Python字典使用--词频统计的GUI实现
字典是针对非序列集合而提供的一种数据类型,字典中的数据是无序排列的. 字典的操作 为字典增加一项 dict[key] = value students = {"Z004":&quo ...
随机推荐
- libcurl编译及使用
环境: libcurl版本:7.54.1 VS:Visual Studio 2013 一.编译 1.下载最新版的libcurl(curl-7.54.1.zip)(地址:https://curl.hax ...
- # 第二周课堂实践以及MyOD
第二周课堂实践以及MyOD 之前使用的虚拟机出现问题被我删掉了,开始学着使用Mac系统自带的终端.在课堂上出现了问题,询问王雄老师也没有解决,课下先使用了实验楼环境进行实验,后来又在Mac重新进行了尝 ...
- 20155224 2016-2017-2 《Java程序设计》第3周学习总结
20155224 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 本周学习量比前两周大,代码量也比较多,还出现了挺多术语,都要慢慢查. 第四章 第四章主要学习 ...
- 虚拟机安装&Linux初探
学习基于VirtualBox虚拟机安装Ubuntu图文教程在自己笔记本上安装Linux操作系统 安装虚拟机的过程还算顺利.除了在安装增强设备功能时需要将之前的硬盘弹出之外,没有遇到其他的问题. 通过实 ...
- 20145207《Java程序设计》实验一(Java开发环境的熟悉)实验报告
<Java 程序设计>实验一(Java开发环境的熟悉)实验报告 目录 改变 Java开发环境的熟悉实验要求 实验成果 课后思考 改变 修改了之前仅仅是贴了图片,连代码都没粘的状态.增加了自 ...
- dedecms 顶级栏目内容显示
在需要的位置,添加: {dede:sql sql='Select content from dede_arctype where id=1'} [field:content/] {/dede:sql}
- echarts 拐点添加图片
series : [ { name:'搜索引擎', type:'line', symbol:'emptyCircle', symbolSize: 5, itemStyle: { normal: { l ...
- 【转载】DXUT进阶
原文:DXUT进阶 概要 这个指南涵盖了更多DXUT的高级应用. 这个指南里的大部分功能是可选的, 为了以最小的代价来增强你的应用程序. DXUT提供了一个简单的基于GUI系统的精灵和一个设备设置对话 ...
- 关于Python的装饰器(1)
Python的装饰器的概念,一直有点微妙.之前在StackOverflow上看过一篇感觉说明的很清楚的介绍: *A decorator must accept a function as an arg ...
- JVM知识(上)
目录 什么是JVM? JVM的生命周期 JVM的体系结构 JVM的数据类型 java虚拟机被称为"虚拟",因为它是一个抽象的计算机定义的规范.要运行一个Java程序,需要一个抽象的 ...