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 ...
 
随机推荐
- 【转】 GATK--原始数据预处理
			
1. 对原始下机fastq文件进行过滤和比对(mapping) 对于Illumina下机数据推荐使用bwa进行mapping. Bwa比对步骤大致如下: (1)对参考基因组构建索引: 例子:bwa i ...
 - ASP.NET Web Form 与 ASP.NET MVC 区别
			
Asp.net 微软提供web开发框架或者技术.分Web Form和ASP.NET MVC.下面简单说明各自优缺点及使用场景. Web Form ASP.NET Webform提供了一个类似于winf ...
 - 20155304 2016-2017-2《Java程序设计》课程总结
			
20155304 2016-2017-2<Java程序设计>课程总结 (按顺序)每周作业链接汇总 预备作业1:对自己专业看法及.学习Java的期望,以及心中的师生关系 预备作业2:有关技能 ...
 - 学号20155308 2006-2007-2 《Java程序设计》第3周学习总结
			
学号20155308 2006-2007-2 <Java程序设计>第3周学习总结 教材学习内容总结 对象(Object):存在的具体实体,具有明确的状态和行为 类(Class):具有相同属 ...
 - 【课堂实践】Myod
			
实验内容 编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 实验代码 od.java 截图 遇到的问题及解决办法 一开始想的方向是将得出的功能结果 ...
 - [arc065E]Manhattan Compass[曼哈顿距离和切比雪夫距离转换]
			
Description 传送门 Solution 题目要求的是曼达顿距离,对于每个点(x,y),我们把它变为(x-y,x+y),就可以转换成求切比雪夫距离了. 证明如下:$max(\left | (x ...
 - 通过java反射机制获取该类的所有属性类型、值
			
转自:http://blog.csdn.net/sd4000784/article/details/7448221 方法使用了这俩个包下的 field 和method import Java.lang ...
 - sqlserver2008 数据库
			
删除数据库提示: 无法对 数据库'DBName' 执行 删除,因为它正用于复制 之前建立过此数据库的发布订阅,但是后来删掉了发布订阅,也将对应的作业停止了,仍然报这个错,遂用此命令强制删除发布: sp ...
 - angular 缓存模板  ng-template $templateCache
			
由于浏览器加载html模板是异步加载的,如果加载大量的模板会拖慢网站的速度,这里有一个技巧,就是先缓存模板. 使用angular缓存模板主要有三种方法: 方法一:通过script标签引入 <sc ...
 - JS基础,课堂作业,相亲问答
			
相亲问答 <script> var a = prompt("你有房子么?"); var b = prompt("你有钱么?"); var c = p ...