#includetypedef struct node_t{ struct node_t *next; char *word; int count;}*node;#define NHASH 9973 // 最好定位质数#define MULT 31 // 乘法器node bin[NHASH]; // 哈希表索引unsigned int hash(char *p){ unsigned int h = 0; for(; *p; p++) h = MULT * h + *p; return h % NHASH;}void incword(char *s){ unsigned int h = hash(s); node p; for(p=bin[h]; p; p=p->next) if(strcmp(s, p->word) == 0){ (p->count)++; return; } p = malloc(sizeof(*p)); p->count = 1; p->word = malloc(strlen(s)+1); strcpy(p->word, s); p->next = bin[h]; // 栈式插入,从表头处插入,而非从表的尾部插入 bin[h] = p;}void main(int argc, char **argv){ int i; char buf[32]; for(i=0; i next) printf("%s:%d\n", p->word, p->count);}
以哈希表为数据结构统计词频大致思路:
构造一个结构体数组 struct node_t bin[质数]; 称为哈希表
构造一个哈希函数,给定一个 字符串 返回一个整数,这个整数哈希表的键值;
每获取一个字符串,把字符串 与 它的所对应键值的node 节点为表头的链表上的所有单词比较,若存在相同的,count++,否则增加到链表节点,把单词挂到该节点上,并置count=1;
输出的时候,从哈希表的0键值处开始,遍历所有链表,并输出各非空节点;