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 ...
随机推荐
- conda与pip的关系
最近在搭建平台的时候,遇到了conda,具体尝试使用之后觉得conda还是非常好用的.他会交代清楚相互有依赖的包是什么,确认之后才会执行指令.要比pip好很多. 普通按照python 的时候一般都是自 ...
- 用go实现简单的冒泡排序
package main import "fmt" func main(){ var arr = [] int { 9 , 6 , 2 , 5 , 8 , 10 , 12 , 1 ...
- 复数 一级ADT实现
COMPLEX.h /* typedef struct { float RE; //实部 float IM; //虚部 }Complex; */ typedef struct complex * Co ...
- SQL 查询某时间段的数据 datadiff 计算时间差
datediff语法格式:datediff(day,开始时间,结束时间) 一.应用举例: 上面的代码,将查询 'created_time' > '2016-09-20' 的所有记录. 如果要查 ...
- Oracle入门第五天(下)——数据库其他对象
一.概述 其他数据库对象 主要掌握的为序列 二.序列 1.什么是序列 序列: 可供多个用户用来产生唯一数值的数据库对象 自动提供唯一的数值 共享对象 主要用于提供主键值 将序列值装入内存可以提高访问效 ...
- C#数据流
C#编程中数据流的使用一直不很熟练,没有一个系统的认识,但是它的重要性显然不言而喻.System.IO下的Stream类是所有数据流的基类,当我们对数据进行逐字节操作时,首先需要将数据转换为数据流.C ...
- 2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 https://lydsy.com/JudgeOnline/problem.php?id=2288 分析: 贪心+堆+链表. 首先把序列变一下,把相 ...
- 解读python手册的例子a, b = b, a+b
Python手册上有个例子,用于输出10以内的斐波那契序列.代码如下: a, b = 0, 1 while b < 10: print(b) a, b = b, a+b 用到了一些Python的 ...
- MySQL数据库之安装,基本操作
一.基础部分 1.数据库是什么 之前所学,数据要永久保留,比如用户注册的用户信息,都是保存于文件,而文件只能存在于某一台机器上. 如果我们不考虑从文件中读取数据的效率问题,并且假设我们的程序所有的组件 ...
- python学习笔记01 --------------hello world 与变量。
1.第一个程序: print('hello world') 输出结果: hello world 2.变量 2.1 变量的作用: 把程序运算的中间结果临时存到内存里,以备后面的代码继续调用. 2.2 变 ...