哈夫曼编码代码c语言
时间: 2024-01-18 15:03:40 浏览: 82
以下是一个用C语言实现的Huffman编码的例子:
```c
#include <stdio.h>
#include <stdlib.h>
// Huffman树的结点
struct Node {
char data; // 字符
int freq; // 字符出现的频率
struct Node *left, *right; // 左子树和右子树
};
// 创建一个新的Huffman树结点
struct Node* newNode(char data, int freq) {
struct Node* node = (struct Node*)malloc(sizeof(struct Node));
node->data = data;
node->freq = freq;
node->left = node->right = NULL;
return node;
}
// 构建Huffman树
struct Node* buildHuffmanTree(char data[], int freq[], int size) {
struct Node *left, *right, *top;
// 创建一个优先队列,用于存储Huffman树的结点
struct PriorityQueue* pq = createPriorityQueue(size);
// 将每个字符作为一个独立的结点插入优先队列
for (int i = 0; i < size; ++i) {
enqueue(pq, newNode(data[i], freq[i]));
}
// 构建Huffman树,直到优先队列中只剩下一个结点
while (size(pq) > 1) {
// 从优先队列中取出两个最小频率的结点
left = dequeue(pq);
right = dequeue(pq);
// 创建一个新的结点作为它们的父结点
// 频率为左右子树频率之和
// 左子树为较小频率的结点,右子树为较大频率的结点
top = newNode('$', left->freq + right->freq);
top->left = left;
top->right = right;
// 将新的结点插入优先队列
enqueue(pq, top);
}
// Huffman树的根结点
return dequeue(pq);
}
// 打印Huffman编码
void printHuffmanCodes(struct Node* root, int arr[], int top) {
// 叶子结点的编码为0和1的序列
if (root->left) {
arr[top] = 0;
printHuffmanCodes(root->left, arr, top + 1);
}
if (root->right) {
arr[top] = 1;
printHuffmanCodes(root->right, arr, top + 1);
}
// 如果是叶子结点,则打印字符和对应的编码
if (!root->left && !root->right) {
printf("%c: ", root->data);
for (int i = 0; i < top; ++i) {
printf("%d", arr[i]);
}
printf("\n");
}
}
int main() {
char data[] = {'A', 'B', 'C', 'D', 'E'};
int freq[] = {3, 5, 4, 2, 6};
int size = sizeof(data) / sizeof(data[0]);
struct Node* root = buildHuffmanTree(data, freq, size);
int arr[100], top = 0;
printHuffmanCodes(root, arr, top);
return 0;
}
```
阅读全文