哈夫曼编码和译码程序代码C语言
时间: 2024-10-21 10:05:22 浏览: 65
哈夫曼编码是一种用于数据压缩的自适应二进制前缀编码算法,其特点是编码长度是基于字符出现频率的,常用频率低的字符分配较短的编码。下面是一个简单的C语言实现哈夫曼树生成和编码解码的示例:
首先,我们先创建一个结构体表示节点:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
char data;
int freq;
struct Node *left, *right;
} Node;
```
然后,创建函数用于构建哈夫曼树:
```c
Node* createNode(char data, int freq) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->freq = freq;
newNode->left = newNode->right = NULL;
return newNode;
}
Node* HuffmanBuildTree(Node** nodes, int n) {
if(n <= 1)
return nodes[0];
int min_freq = INT_MAX;
int min_index;
for(int i = 0; i < n; i++) {
if(nodes[i]->freq < min_freq) {
min_freq = nodes[i]->freq;
min_index = i;
}
}
Node* left = HuffmanBuildTree(nodes, n - 1);
Node* right = HuffmanBuildTree(nodes + min_index + 1, n - 1);
Node* newNode = createNode('\0', min_freq + left->freq + right->freq);
newNode->left = left;
newNode->right = right;
return newNode;
}
```
接下来,我们可以编写编码部分:
```c
void huffmanCode(Node* root, char* code, int index) {
if(root->left == NULL && root->right == NULL) {
code[root->data] = index;
printf("%d ", index);
} else {
huffmanCode(root->left, code, index++);
huffmanCode(root->right, code, index++);
}
}
// 使用时调用此函数生成哈夫曼树并计算编码
void buildHuffmanAndGenerateCodes(Node* root) {
char* code = malloc(strlen("01") * sizeof(char)); // 假设最大编码长度为2
huffmanCode(root, code, 0); // 初始化编码数组
// 编码过程...
}
```
最后,解码部分涉及读取输入流、找到相应的二进制编码,并按照哈夫曼树的规则重建原始字符串。这通常需要一个倒置哈夫曼树的映射表。
阅读全文