1. #include<iostream>
  2. #include<fstream>
  3. #include<string>
  4.  
  5. using namespace std;
  6.  
  7. struct Word //定义结构体
  8. {
  9. string word;
  10. size_t length;
  11. Word* next;
  12. int repnum;//repeat number 重复次数
  13. bool ifdel;//if delete 是否被删除
  14. Word(string _word, size_t _lendth = , Word* _next = NULL, int _repnum = , bool _ifdel = false) :
  15. word(_word), length(_lendth), next(_next), repnum(_repnum), ifdel(_ifdel){}
  16. };
  17.  
  18. Word *head = NULL, *tail = NULL;
  19. int size = ; //链表长度,即单词总个数
  20. int delsum = ;//delete sum 被删除的总个数
  21.  
  22. void Push(const string& str, const size_t& len) //形成链表
  23. {
  24. if (NULL == head)
  25. {
  26. head = tail = new Word(str, len, NULL, , false);
  27. }
  28. else
  29. {
  30. tail->next = new Word(str, len, NULL, , false);
  31. tail = tail->next;
  32. }
  33. size++;
  34. }
  35.  
  36. void Destory() //delete new
  37. {
  38. Word* ptr = head;
  39. while (ptr)
  40. {
  41. Word* pt = ptr;
  42. ptr = ptr->next;
  43. delete pt;
  44. }
  45. head = tail = NULL;
  46. size = ;
  47. }
  48.  
  49. void Readin(string& mystr) //read in 读入
  50. {
  51. string temps;
  52. for (size_t i = ; i < mystr.length(); i++)
  53. {
  54. if (mystr[i] >= 'a'&&mystr[i] <= 'z' || mystr[i] >= 'A'&&mystr[i] <= 'Z')
  55. {
  56. temps += mystr[i];
  57. }
  58. else
  59. {
  60. if (!temps.empty())//不空的时候返回0
  61. {
  62.  
  63. Push(temps, temps.length());
  64. temps.erase(temps.begin(), temps.end());
  65. }
  66. }
  67. }
  68. }
  69. void DeSame() //delete the same 删除相同的单词(不是真删,只是做标记)
  70. {
  71. Word* p = head;
  72. while (p&&p->next)
  73. {
  74. while (p->ifdel&&p->next)
  75. {
  76. p = p->next;
  77. }
  78. Word* pt = p->next;
  79. while (pt)
  80. {
  81. if (!pt->ifdel&&pt->word == p->word)
  82. {
  83. p->repnum++;
  84. pt->ifdel = true;
  85. delsum++;
  86. }
  87. pt = pt->next;
  88. }
  89. p = p->next;
  90. }
  91. }
  92.  
  93. void Inputp(Word* warr[]) //input point 将未被“删除”的结点的指针传入数组
  94. {
  95. int i = ;
  96. Word* pt = head;
  97. while (pt)
  98. {
  99. if (!pt->ifdel)
  100. {
  101. warr[i] = pt;
  102. i++;
  103. }
  104. pt = pt->next;
  105. }
  106. }
  107.  
  108. void Sort(Word** warr, int start, int end) //将指针按其指向的结点的repnum从大到小排序,快排实现
  109. {
  110. int i = , j = ;
  111. Word* key = NULL;
  112. key = warr[start];
  113. i = start;
  114. j = end;
  115. while (i<j)
  116. {
  117. while (warr[j]->repnum <= key->repnum&&i<j)j--;
  118. warr[i] = warr[j];
  119. while (warr[i]->repnum >= key->repnum&&i<j)i++;
  120. warr[j] = warr[i];
  121. }
  122. warr[i] = key;
  123. if (i - >start)Sort(warr, start, i - );
  124. if (end > i + )Sort(warr, i + , end);
  125. }
  126.  
  127. void Show(Word** warr, int len)
  128. {
  129. for (int i = ; i < len; i++)
  130. {
  131. cout << warr[i]->word << " " << warr[i]->repnum << endl;
  132. }
  133. }
  134.  
  135. int main()
  136. {
  137. ifstream readfile("zpc.txt", ios::in);
  138. if (!readfile){ cout << "程序出现异常,自动退出!" << endl; return ; }
  139. string str, str1;
  140. while (!readfile.eof())
  141. {
  142. getline(readfile, str1);
  143. str += str1;
  144. str += ' ';
  145. }
  146. readfile.close();
  147. Readin(str);
  148. DeSame();
  149. cout << "单词总个数(不考虑重复):" << size << endl;
  150. cout << "除去重复后的单词个数(即重复的单词按1个计):" << size - delsum << endl;
  151. Word** wdarr = new Word*[size - delsum];
  152. Inputp(wdarr);
  153. Sort(wdarr, , size - delsum - );
  154. Show(wdarr, size - delsum);
  155. delete[]wdarr;
  156. Destory();
  157. return ;
  158. }

统计单词个数及词频(C++实现)的更多相关文章

  1. 第六章 第一个Linux驱动程序:统计单词个数

    现在进入了实战阶段,使用统计单词个数的实例让我们了解开发和测试Linux驱动程序的完整过程.第一个Linux驱动程序是统计单词个数. 这个Linux驱动程序没有访问硬件,而是利用设备文件作为介质与应用 ...

  2. 第六章第一个linux个程序:统计单词个数

    第六章第一个linux个程序:统计单词个数 从本章就开始激动人心的时刻——实战,去慢慢揭开linux神秘的面纱.本章的实例是统计一片文章或者一段文字中的单词个数.  第 1 步:建立 Linu x 驱 ...

  3. NOIP200107统计单词个数

    NOIP200107统计单词个数 难度级别: A: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 给出一个长度不超过200的由 ...

  4. NOIP2001 统计单词个数

    题三 统计单词个数(30分) 问题描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k&l ...

  5. Codevs_1040_[NOIP2001]_统计单词个数_(划分型动态规划)

    描述 http://codevs.cn/problem/1040/ 与Codevs_1017_乘积最大很像,都是划分型dp. 给出一个字符串和几个单词,要求将字符串划分成k段,在每一段中求共有多少单词 ...

  6. luogu P1026 统计单词个数

    题目链接 luogu P1026 统计单词个数 题解 贪心的预处理母本串从i到j的最大单词数 然后dp[i][j] 表示从前i个切了k次最优解 转移显然 代码 #include<cstdio&g ...

  7. Codevs 1040 统计单词个数

    1040 统计单词个数 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给出一个长度不超过200的 ...

  8. codevs1040统计单词个数(区间+划分型dp)

    1040 统计单词个数 2001年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 给出一个长度不超 ...

  9. P1026 统计单词个数——substr

    P1026 统计单词个数 string 基本操作: substr(x,y) x是起始位置,y是长度: 返回的是这一段字符串: 先预处理sum[i][j],表示以i开头,最多的单词数: 从后往前寻找,保 ...

随机推荐

  1. Hibernate配置Log4J,很有参考价值的

    hibernate3 自带的默认的日志框架是slf4j,hibernate3的slf只是一个日志的接口,而hibernate3 自带默认的日志框架,在实际开发中很少有公司或者是项目中用到,这里记录一种 ...

  2. JavaScript 入门教程一 开篇介绍

    一.JavaScript 刚开始是为了解决一些由服务器端进行的验证而开发的前端语言.在宽带还不普及的90年代,当用户辛苦输入很多信息并提交给服务器后,等了漫长的时间,等到的不是提交成功的提示而是某些必 ...

  3. CentOS 6.6 安装 PHP Memcached 扩展

    PHP 的 Memcached扩展使用了 libmemcached 库提供的 api 与 memcached 服务端进行交互.它同样提供了一个 session 处理器(memcached). PHP ...

  4. Android监听Home键

    监听广播  ACTION_CLOSE_SYSTEM_DIALOGS private void registerHomeReceiver(){ IntentFilter homeFilter = new ...

  5. Different Approaches for MVCC

    https://www.enterprisedb.com/well-known-databases-use-different-approaches-mvcc Well-known Databases ...

  6. request.querystring和request.form、session的区别

    1. request.querystring是用来接收地址里面问号“?”后面的参数的内容,  用get方法读取的 不安全   request.form是用来接收表单递交来的数据 ,是用post方法读取 ...

  7. 制作大漠字库并用python调用大漠工具方法来识别文字

    1.制作字库 1.截取需要的图片 2.这里截取了"火狐主页"四个字,接下来抓取文字的颜色 3.颜色由是由三个部分组成,即R G B其中的R是由00-FF(16进制) 即0-255个 ...

  8. Python学习【第一篇】Python简介

    Python简介 Python前世今生 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. 现在,全世界差不多有600多种编 ...

  9. linux添加ip、路由相关命令

    1- Linux添加永久路由vi /etc/sysconfig/network-scripts/route-eth1ADDRESS0=192.168.10.0NETMASK0=255.255.255. ...

  10. (copy) DBAN vs nwipe

    source: https://sourceforge.net/p/dban/discussion/208932/thread/cb591b59/ Question:Trouble in runnin ...