编写一个程序,对下表中的单词按出现频度构造一棵哈夫曼树并输出对应的哈夫曼编码。单词TheofatoandinthatheisatonforHisarebe出现频度1192677541518462450242195190181174157138124123 c语言实现
时间: 2024-11-25 16:21:38 浏览: 89
在C语言中编写一个程序来构建哈夫曼树并为其单词分配哈夫曼编码需要几个步骤,包括创建频率统计、构造最小堆、生成哈夫曼树以及编码每个单词。这里是一个简化版的示例,假设我们已经有了单词和它们的频率数组:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char word[50];
int freq;
} Node;
// 对于节点进行比较,用于构建最小堆
int compareNodes(Node* a, Node* b) {
return a->freq > b->freq ? 1 : (a->freq == b->freq ? 0 : -1);
}
// 创建最小堆
void heapify(Node** arr, int n, int i) {
int smallest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < n && compareNodes(arr[left], arr[smallest]) < 0)
smallest = left;
if (right < n && compareNodes(arr[right], arr[smallest]) < 0)
smallest = right;
if (smallest != i) {
swap(&arr[i], &arr[smallest]);
heapify(arr, n, smallest);
}
}
// 构建哈夫曼树
Node* buildHuffmanTree(Node** arr, int n) {
for (int i = 0; i < n; i++)
heapify(arr, n, i);
while (n > 1) {
Node* left = arr[0];
Node* right = arr[1];
arr[0] = (Node*)malloc(sizeof(Node));
arr[0]->word = "0" + left->word;
arr[0]->freq = left->freq + right->freq;
heapify(arr, n, 0);
n--;
arr[1] = arr[0];
}
return arr[0]; // 最终的哈夫曼树根节点
}
// 输出哈夫曼编码
void printHuffmanCode(Node* root, char* prefix, FILE* output) {
if (!root)
return;
printHuffmanCode(root->left, prefix, output);
fprintf(output, "%s%d", prefix, root->word[0] - '0');
printHuffmanCode(root->right, prefix, output);
}
int main() {
// 假设单词频率数据存储在这里
Node words[] = {{"The", 11}, {"ofo", 192}, ...}; // 根据实际数据填充
int numWords = sizeof(words) / sizeof(words[0]);
Node* huffmanRoot = buildHuffmanTree(words, numWords);
FILE* file = fopen("huffman_codes.txt", "w");
printHuffmanCode(huffmanRoot, "", file);
fclose(file);
free(huffmanRoot);
return 0;
}
```
注意,这只是一个简化的版本,实际应用中可能还需要处理更复杂的数据输入,并可能需要使用优先队列等数据结构来替代手动维护最小堆。另外,这个示例没有显示完整的所有单词,你需要根据实际情况提供完整的单词及其频率数组。
阅读全文