c语言哈夫曼树编码译码
时间: 2023-11-07 11:10:01 浏览: 121
c语言哈夫曼编码及译码
哈夫曼编码是一种基于二叉树的编码方式,可以实现无损压缩数据的功能。下面是C语言实现哈夫曼树编码和译码的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 哈夫曼树的节点结构体
typedef struct huffman_node {
char data; // 数据
int freq; // 频率
struct huffman_node *left; // 左子节点
struct huffman_node *right; // 右子节点
} huffman_node_t;
// 哈夫曼编码表的结构体
typedef struct huffman_table {
char data; // 数据
char code[256]; // 编码
} huffman_table_t;
// 构建哈夫曼树
huffman_node_t* build_huffman_tree(char* data, int* freq, int n) {
huffman_node_t **nodes = (huffman_node_t**)malloc(n * sizeof(huffman_node_t*));
for (int i = 0; i < n; i++) {
huffman_node_t *node = (huffman_node_t*)malloc(sizeof(huffman_node_t));
node->data = data[i];
node->freq = freq[i];
node->left = NULL;
node->right = NULL;
nodes[i] = node;
}
while (n > 1) {
// 找出频率最小的两个节点
int min1 = 0, min2 = 1;
if (nodes[0]->freq > nodes[1]->freq) {
min1 = 1;
min2 = 0;
}
for (int i = 2; i < n; i++) {
if (nodes[i]->freq < nodes[min1]->freq) {
min2 = min1;
min1 = i;
} else if (nodes[i]->freq < nodes[min2]->freq) {
min2 = i;
}
}
// 合并频率最小的两个节点
huffman_node_t *parent = (huffman_node_t*)malloc(sizeof(huffman_node_t));
parent->data = 0;
parent->freq = nodes[min1]->freq + nodes[min2]->freq;
parent->left = nodes[min1];
parent->right = nodes[min2];
if (min1 < min2) {
nodes[min1] = parent;
nodes[min2] = nodes[n - 1];
} else {
nodes[min2] = parent;
nodes[min1] = nodes[n - 1];
}
n--;
}
return nodes[0];
}
// 生成哈夫曼编码表
void generate_huffman_table(huffman_node_t *root, char* code, int depth, huffman_table_t* table) {
if (root->left == NULL && root->right == NULL) {
table[root->data].data = root->data;
strcpy(table[root->data].code, code);
return;
}
code[depth] = '0';
generate_huffman_table(root->left, code, depth + 1, table);
code[depth] = '1';
generate_huffman_table(root->right, code, depth + 1, table);
}
// 哈夫曼编码
char* huffman_encode(char* data, huffman_table_t* table) {
int n = strlen(data);
char* code = (char*)malloc(n * 256 * sizeof(char));
int k = 0;
for (int i = 0; i < n; i++) {
strcat(code, table[data[i]].code);
}
return code;
}
// 哈夫曼解码
char* huffman_decode(char* code, huffman_node_t* root) {
int n = strlen(code);
char* data = (char*)malloc(n * sizeof(char));
huffman_node_t* p = root;
int k = 0;
for (int i = 0; i < n; i++) {
if (code[i] == '0') {
p = p->left;
} else {
p = p->right;
}
if (p->left == NULL && p->right == NULL) {
data[k++] = p->data;
p = root;
}
}
return data;
}
int main() {
char data[] = "ABCDAAAABBBCDEFG";
int freq[] = {3, 4, 3, 2, 2, 2, 1, 2, 1, 1};
int n = strlen(data);
// 构建哈夫曼树
huffman_node_t* root = build_huffman_tree(data, freq, n);
// 生成哈夫曼编码表
char code[256];
memset(code, 0, sizeof(code));
huffman_table_t table[256];
generate_huffman_table(root, code, 0, table);
// 哈夫曼编码
char* encoded = huffman_encode(data, table);
// 哈夫曼解码
char* decoded = huffman_decode(encoded, root);
printf("原始数据:%s\n", data);
printf("哈夫曼编码:%s\n", encoded);
printf("哈夫曼解码:%s\n", decoded);
return 0;
}
```
以上代码实现了哈夫曼树的构建、哈夫曼编码表的生成、哈夫曼编码和哈夫曼解码的功能。在实际应用中,需要根据具体的需求对代码进行修改和优化。
阅读全文