编写程序,c实现赫夫曼编译算法
时间: 2023-09-06 19:03:10 浏览: 105
赫夫曼编码程序 可以运行
5星 · 资源好评率100%
赫夫曼编码是一种无损的数据压缩算法,通过根据字符的出现频率构建一棵二叉树,将出现频率较高的字符编码为较短的二进制码,出现频率较低的字符编码为较长的二进制码,从而实现数据的压缩。以下是使用C语言编写的赫夫曼编码算法的实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 最大字符数
#define MAX_CHAR 256
// 赫夫曼树结点的结构体
typedef struct Node {
unsigned char ch;
int freq;
struct Node *left, *right;
} Node;
// 定义优先队列的元素
typedef struct QueueNode {
Node* HuffmanTree;
struct QueueNode *next;
} QueueNode, *Queue;
// 创建一个新的结点
Node* createNode(unsigned char ch, int freq) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->ch = ch;
newNode->freq = freq;
newNode->left = newNode->right = NULL;
return newNode;
}
// 创建一个新的队列结点
QueueNode* createQueueNode(Node* HuffmanTree) {
QueueNode* newQueueNode = (QueueNode*)malloc(sizeof(QueueNode));
newQueueNode->HuffmanTree = HuffmanTree;
newQueueNode->next = NULL;
return newQueueNode;
}
// 在优先队列中插入结点,按照频率从小到大的顺序
void insertNode(Queue* queue, Node* node) {
QueueNode* newQueueNode = createQueueNode(node);
if ((*queue) == NULL || (*queue)->HuffmanTree->freq >= node->freq) {
newQueueNode->next = *queue;
*queue = newQueueNode;
} else {
QueueNode* current = *queue;
while (current->next != NULL && current->next->HuffmanTree->freq < node->freq) {
current = current->next;
}
newQueueNode->next = current->next;
current->next = newQueueNode;
}
}
// 从队列中删除并返回具有最小频率的结点
Node* deleteNode(Queue* queue) {
if (*queue == NULL) {
return NULL;
}
QueueNode* dequeuedNode = *queue;
Node* minFreqNode = dequeuedNode->HuffmanTree;
*queue = dequeuedNode->next;
free(dequeuedNode);
return minFreqNode;
}
// 建立赫夫曼树
Node* buildHuffmanTree(int charFreq[]) {
Queue queue = NULL;
// 初始化队列,插入所有的字符节点到队列中
for (int i = 0; i < MAX_CHAR; i++) {
if (charFreq[i] != 0) {
insertNode(&queue, createNode((unsigned char)i, charFreq[i]));
}
}
// 构建赫夫曼树
while (queue->next != NULL) {
Node* leftChild = deleteNode(&queue);
Node* rightChild = deleteNode(&queue);
// 创建一个新的父节点
Node* parentNode = createNode('$', leftChild->freq + rightChild->freq);
parentNode->left = leftChild;
parentNode->right = rightChild;
insertNode(&queue, parentNode);
}
return deleteNode(&queue);
}
// 打印字符的赫夫曼编码
void printHuffmanCodes(Node* root, int code[], int top) {
if (root->left) {
code[top] = 0;
printHuffmanCodes(root->left, code, top + 1);
}
if (root->right) {
code[top] = 1;
printHuffmanCodes(root->right, code, top + 1);
}
if (root->left == NULL && root->right == NULL) {
printf("字符 '%c' 的赫夫曼编码为: ", root->ch);
for (int i = 0; i < top; i++) {
printf("%d", code[i]);
}
printf("\n");
}
}
// 赫夫曼编码主函数
void huffmanEncode(char data[]) {
int charFreq[MAX_CHAR] = {0};
// 计算字符出现的频率
for (int i = 0; data[i] != '\0'; i++) {
charFreq[data[i]]++;
}
// 建立赫夫曼树
Node* root = buildHuffmanTree(charFreq);
// 打印赫夫曼编码
int code[MAX_CHAR] = {0};
int top = 0;
printHuffmanCodes(root, code, top);
}
int main() {
char data[] = "Hello, Huffman!";
huffmanEncode(data);
return 0;
}
```
这段代码实现了赫夫曼编码算法,并可以将一个字符串的字符转换为相应的赫夫曼编码进行输出。
阅读全文