c语言:统计一个英文的文本文件中出现次数最多的前十个单词(1)规定单词的含义为连续的字母构成的字符串,字母以外的其他符号和空白符号都视为单词之间的分隔符。(2)输出出现次数最多的前十个单词及出现次数。仅大小写不同的单词视为同一单词。
时间: 2023-11-28 14:22:34 浏览: 188
C语言程序设计-分别统计字符串中字母、数字、空格和其他字符出现的次数(字符长度小于80);.c
5星 · 资源好评率100%
好的,这是一个比较典型的统计单词出现频率的问题。我们可以使用哈希表来实现。具体步骤如下:
1. 读入文本文件,将单词逐个提取出来并转换为小写字母。
2. 对于每个单词,将其作为键值,将对应的哈希表中的值加1。
3. 遍历哈希表,找到出现次数最多的前十个单词。
下面是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAX_WORD_LEN 50
#define HASH_SIZE 1000000
typedef struct Node {
char* key;
int val;
struct Node* next;
} Node;
Node* hash_table[HASH_SIZE];
// 哈希函数
unsigned long hash(char* str) {
unsigned long hash = 5381;
int c;
while ((c = *str++))
hash = ((hash << 5) + hash) + c;
return hash % HASH_SIZE;
}
// 向哈希表中插入键值对
void insert(char* key, int val) {
unsigned long h = hash(key);
Node* p = hash_table[h];
while (p != NULL) {
if (strcmp(p->key, key) == 0) {
p->val += val;
return;
}
p = p->next;
}
Node* node = (Node*)malloc(sizeof(Node));
node->key = strdup(key);
node->val = val;
node->next = hash_table[h];
hash_table[h] = node;
}
// 统计文本文件中出现次数最多的前十个单词
void count_words(FILE* fp) {
char word[MAX_WORD_LEN];
int ch, pos = 0;
while ((ch = fgetc(fp)) != EOF) {
if (isalpha(ch)) {
word[pos++] = tolower(ch);
} else if (pos > 0) {
word[pos] = '\0';
insert(word, 1);
pos = 0;
}
}
if (pos > 0) {
word[pos] = '\0';
insert(word, 1);
}
// 找出出现次数最多的前十个单词
Node* top_ten[10] = { NULL };
Node* p;
for (int i = 0; i < HASH_SIZE; i++) {
p = hash_table[i];
while (p != NULL) {
for (int j = 0; j < 10; j++) {
if (top_ten[j] == NULL || p->val > top_ten[j]->val) {
for (int k = 9; k > j; k--) {
top_ten[k] = top_ten[k - 1];
}
top_ten[j] = p;
break;
} else if (strcmp(p->key, top_ten[j]->key) == 0) {
top_ten[j] = p;
break;
}
}
p = p->next;
}
}
// 输出结果
for (int i = 0; i < 10; i++) {
if (top_ten[i] != NULL) {
printf("%-20s %d\n", top_ten[i]->key, top_ten[i]->val);
}
}
}
int main() {
memset(hash_table, 0, sizeof(hash_table));
FILE* fp = fopen("test.txt", "r");
if (fp == NULL) {
printf("Failed to open file.\n");
return 1;
}
count_words(fp);
fclose(fp);
return 0;
}
```
在这个实现中,我们使用了一个数组 `hash_table` 来表示哈希表。哈希表的每个元素是一个指向链表头的指针,链表中存储了键值对。
我们使用了一个字符串哈希函数,将字符串转换为一个 unsigned long 值。这个哈希函数的实现来自于 DJB 算法。
在 `count_words` 函数中,我们逐个读入文本文件中的字符,并将连续的字母构成的字符串转换为小写字母后插入哈希表中。在插入时,如果键值已经存在,则将对应的值加1。
最后,我们遍历哈希表,找到出现次数最多的前十个单词。我们使用一个数组 `top_ten` 来存储前十个单词的指针。在遍历哈希表时,对于每个键值对,我们将其与 `top_ten` 中的元素比较,将其插入到合适的位置。
最后,我们输出前十个单词及其出现次数。注意,在输出时,我们使用了格式化字符串 `%-20s %d\n`,这是为了让输出对齐。
阅读全文