c语言实现哈夫曼编/译码器
时间: 2023-12-28 19:06:00 浏览: 88
C语言可以通过使用二叉树来实现哈夫曼编/译码器。下面是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义哈夫曼树节点
typedef struct Node {
int freq; // 频率
char data; // 数据
struct Node* left;
struct Node* right;
} Node;
// 创建一个新的哈夫曼树节点
Node* createNode(int freq, char data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->freq = freq;
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 构建哈夫曼树
Node* buildHuffmanTree(char data[], int freq[], int size) {
Node *left, *right, *top;
// 创建一个优先队列,用于存储哈夫曼树节点
PriorityQueue* pq = createPriorityQueue();
// 将每个字符作为一个独立的节点插入优先队列
for (int i = 0; i < size; ++i) {
enqueue(pq, createNode(freq[i], data[i]));
}
// 构建哈夫曼树
while (size(pq) > 1) {
left = dequeue(pq);
right = dequeue(pq);
top = createNode(left->freq + right->freq, '-');
top->left = left;
top->right = right;
enqueue(pq, top);
}
// 返回根节点
return dequeue(pq);
}
// 哈夫曼编码
void encode(Node* root, char* code, int top) {
if (root->left) {
code[top] = '0';
encode(root->left, code, top + 1);
}
if (root->right) {
code[top] = '1';
encode(root->right, code, top + 1);
}
if (isLeaf(root)) {
printf("%c: ", root->data);
for (int i = 0; i < top; ++i) {
printf("%c", code[i]);
}
printf("\n");
}
}
// 哈夫曼译码
void decode(Node* root, int index, char* code) {
if (isLeaf(root)) {
printf("%c", root->data);
return;
}
if (code[index] == '0') {
decode(root->left, index + 1, code);
} else {
decode(root->right, index + 1, code);
}
}
int main() {
char data[] = {'a', 'b', 'c', 'd', 'e', 'f'};
int freq[] = {5, 9, 12, 13, 16, 45};
int size = sizeof(data) / sizeof(data[0]);
Node* root = buildHuffmanTree(data, freq, size);
char code[MAX_TREE_HT], index = 0;
encode(root, code, index);
char encodedString[] = "11000101110";
printf("Decoded string: ");
decode(root, 0, encodedString);
printf("\n");
return 0;
}
```
这段代码实现了一个简单的哈夫曼编/译码器。它首先构建了一个哈夫曼树,然后使用递归的方式对树进行编码和译码。编码函数将每个字符的编码打印出来,译码函数将编码字符串转换为原始字符串并打印出来。
阅读全文