一篇文章(或一本书)由很多单词构成,有的时候我们想统计一下文章中单词出现的次数,怎样快速地做呢?《编程珠玑》书中提到的一种方式是使用散列表,本文实现了该方法。
为了简单,单词定义为仅由英文字母构成的,暂时忽略连字符号,所有单词由空格分开,所以先对一篇文章进行预处理:
//返回处理后单词总数
int pre_process(const char* filename)
{
ifstream input;
input.open(filename);
ofstream o;
o.open("C:/Users/liaojian/Documents/result_no_digital.txt");
string word;
int n = 0;
while(input>>word)
{
string s;
const char* p = word.c_str();
while(*p)
{
char c = *p;
if(c <= 'z' && c >= 'a' || c <= 'Z' && c >= 'A')
s += c;
++p;
}
if(s != "")
{
o<<s<<' ';
++n;
}
}
input.close();
o.close();
return n;
}
统计过程中需要同时记录单词及其出现次数,并且使用散列表对于不同的单词可能会计算出同样的hash值,为了避免冲突,使用链地址法,所以为每个单词建立如下结构体:
struct word_node
{
char* str;
int count;
word_node* next;
};
散列表每个元素也是一个结构体,记录了该元素下保存了几个单词:
struct list_head