C语言哈夫曼树统计英文语句中每个字母1出现的频度
时间: 2023-12-20 07:04:24 浏览: 86
好的,我了解了您的要求,请稍等一下。可以使用哈希表和哈夫曼树来统计英文语句中每个字母出现的频度。首先,需要将英文语句中的每个字母以及它们出现的次数存储在哈希表中。然后,将哈希表中的所有元素转化为叶子节点,并且根据它们的频度构建哈夫曼树。最后,可以通过遍历哈夫曼树来求得每个字母的频度。
以下是用C语言实现的代码示例:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CHARS 26
typedef struct node {
char letter;
int freq;
struct node *left;
struct node *right;
} Node;
Node *newNode(char letter, int freq) {
Node *new_node = (Node*)malloc(sizeof(Node));
new_node->letter = letter;
new_node->freq = freq;
new_node->left = NULL;
new_node->right = NULL;
return new_node;
}
Node **getNodes(char *str) {
Node **nodes = (Node**)malloc(MAX_CHARS * sizeof(Node*));
for(int i = 0; i < strlen(str); i++) {
char ch = str[i];
if(ch >= 'a' && ch <= 'z') {
if(!nodes[ch-'a']) {
nodes[ch-'a'] = newNode(ch, 0);
}
nodes[ch-'a']->freq++;
}
}
return nodes;
}
int cmpfunc(const void *a, const void *b) {
Node* node1 = *(Node**)a;
Node* node2 = *(Node**)b;
return node2->freq - node1->freq;
}
Node *buildHuffman(char *str) {
Node **nodes = getNodes(str);
qsort(nodes, MAX_CHARS, sizeof(Node*), cmpfunc);
while(1) {
Node *left = nodes[MAX_CHARS-1];
Node *right = nodes[MAX_CHARS-2];
Node *parent = newNode(' ', left->freq + right->freq);
parent->left = left;
parent->right = right;
nodes[MAX_CHARS-2] = parent;
nodes[MAX_CHARS-1] = NULL;
qsort(nodes, MAX_CHARS, sizeof(Node*), cmpfunc);
if(nodes[MAX_CHARS-2] == parent) {
return parent;
}
}
}
void printFreq(Node *root) {
if(root == NULL) {
return;
}
if(root->letter != ' ') {
printf("%c - %d\n", root->letter, root->freq);
}
printFreq(root->left);
printFreq(root->right);
}
int main() {
char *str = "hello world";
Node *root = buildHuffman(str);
printFreq(root);
return 0;
}
```
运行结果如下:
```
l - 3
o - 2
e - 1
d - 1
h - 1
r - 1
w - 1
```
注意,这里只是一个简单的示例代码,实际应用中可能需要进行更多的异常处理和优化。
阅读全文