词频统计更新

实现功能:从控制台输入文件路径,并统计单词总数及不重复的单词数,并输出所有单词词频,同时排序。

头文件

 #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 词频统计更新的更多相关文章

  1. 2nd 词频统计效能测试

    词频统计效能测试 使用性能分析工具分析结果如下 :

  2. 【week2】 词频统计第一次更新

    词频统计: 对每个功能预计时间: 功能 预计(min) 实际(min) 数据流读入 20 40 正则规范字符串 15 20 排序 30 45 输出 20 30 其他   25 词频统计psp 日期 类 ...

  3. 作业3-个人项目<词频统计>

    上了一天的课,现在终于可以静下来更新我的博客了.       越来越发现,写博客是一种享受.来看看这次小林老师的“作战任务”.                词频统计 单词: 包含有4个或4个以上的字 ...

  4. 软件工程第一次个人项目——词频统计by11061153柴泽华

    一.预计工程设计时间 明确要求: 15min: 查阅资料: 1h: 学习C++基础知识与特性: 4-5h: 主函数编写及输入输出部分: 0.5h: 文件的遍历: 1h: 编写两种模式的词频统计函数: ...

  5. Programming | 中/ 英文词频统计(MATLAB实现)

    一.英文词频统计 英文词频统计很简单,只需借助split断句,再统计即可. 完整MATLAB代码: function wordcount %思路:中文词频统计涉及到对"词语"的判断 ...

  6. 词频统计 List Array

    c# 使用数组进行词频统计 1.先考虑要是使用的数据结构: Array在在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单,但是数组存在一些不足的地方.在数组的两个数据间插入数据 ...

  7. C语言词频统计设计

    项目需求: 1.设计一个词频统计小软件,对给定的英文文章进行单词频率的统计. 2.文章中相应的标点不计入统计. 3.将统计结果以从大到小的排序方式输出. 设计: 1.因为功能相对简单,采用C语言直接进 ...

  8. 词频统计的java实现方法——第一次改进

    需求概要 原需求 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 新需求: 1.小文件输入. 为表明程序能跑 ...

  9. Python字典使用--词频统计的GUI实现

    字典是针对非序列集合而提供的一种数据类型,字典中的数据是无序排列的. 字典的操作 为字典增加一项 dict[key] = value students = {"Z004":&quo ...

随机推荐

  1. python range,xrange区别

    range: 直接生成一个列表对象 xrange: 生成一个xrange对象 xrange使用: 操作一个非常大的数据时,而且没存比较吃紧的时,可以使用xrange来节省内存 xrange一般在循环里 ...

  2. Linux入门第二天——基本命令入门(中)

    一.文件搜索命令 1.文件搜索命令:locate 速度很快(具体见Linux工具网址的对比),注意无法找到新建的文件(原理暂不展开) locate命令其实是“find -name”的另一种写法,但是要 ...

  3. 20155223 2016-2017-2《Java程序设计》课程总结

    20155223 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1 预备作业2 预备作业3 第一周 第二周 第三周 第四周 第五周 第六周 第七周 第八周 ...

  4. 2016-2017-2 20155325实验二《Java面向对象程序设计》实验报告

    实验二 面向对象程序设计-1 答案截图 码云代码链接 链接1 实验遇到的问题和解决过程 问题1:在plugins里搜索不到JUnitGenerator V2.0只能搜到Generste Teats 问 ...

  5. PANIC: HOME is defined but could not find Nexus_4_API_22.ini file in $HOME/.android/avd (Note: avd is searched in the order of $ANDROID_AVD_HOME,$ANDROID_SDK_HOME/.android/avd and $HOME/.android/avd)

    sudo cp /root/.android/avd/*.ini  $Home/.android/avd/ sudo cp -r  /root/.android/avd/*.avd  $Home/.a ...

  6. 【NOIP2018pj】题解

    [NOIP2018pj]题解 \(T1\) 题面 洛谷 题解 好像并没有什么好说的... #include <iostream> #include <cstdio> #incl ...

  7. 【LG5017】[NOIP2018pj]摆渡车

    [LG5017][NOIP2018pj]摆渡车 题面 洛谷 题解 震惊!普及组竟然考斜率优化??? 当然有其他的方法 首先我们转化一下模型 此题可以变为: 在一根时间轴上有一些点,每个时间点\(i\) ...

  8. 【转】CentOS Linux解决Device eth0 does not seem to be present(linux)

    原文来自:http://www.linuxidc.com/Linux/2012-12/76248.htm 在VMware里克隆出来的CentOS Linux.. ifconfig...没有看到eth0 ...

  9. javaweb(十五)——JSP基础语法

    任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之 ...

  10. html5新特性localStorage和sessionStorage

    HTML5 提供了两种在客户端存储数据的新方法: localStorage: (1)它的生命周期是永久的,关闭页面或浏览器之后localStorage中的数据也不会消失. (2)它的容量大小是5M作用 ...