通过给定字符a、b、c、d、e、f、g的使用频率,用c语言编程求出它们的赫夫曼编码,生成一段完整代码
时间: 2024-11-30 07:21:03 浏览: 23
在C语言中,我们可以手动实现赫夫曼树的构建过程来计算字符的赫夫曼编码。下面是一个简化的示例,假设我们已经有了字符频率的数组:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 定义节点结构
typedef struct Node {
char ch;
int freq;
struct Node* left;
struct Node* right;
} Node;
// 创建新节点
Node* newNode(char ch, int freq) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->ch = ch;
newNode->freq = freq;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 比较节点频率
int compareNodes(const void* a, const void* b) {
return ((const Node*)a)->freq - ((const Node*)b)->freq;
}
// 合并两个频率最低的节点
Node* mergeTwoNodes(Node* left, Node* right) {
if (!left || !right) return left ? left : right;
if (left->freq < right->freq) {
left->right = mergeTwoNodes(left->right, right);
return left;
} else {
right->left = mergeTwoNodes(left, right->left);
return right;
}
}
// 构建赫夫曼树
Node* buildHuffmanTree(int freqs[], int n) {
// 将频率作为优先级放入优先队列
Node** nodes = (Node**)malloc(n * sizeof(Node*));
for (int i = 0; i < n; i++) {
nodes[i] = newNode(freqs[i], freqs[i]);
}
qsort(nodes, n, sizeof(Node*), compareNodes);
while (n > 1) {
n--;
Node* newNode = mergeTwoNodes(nodes[n - 1], nodes[n]);
nodes[n - 1] = newNode;
}
return nodes[0]; // 返回根节点
}
// 打印赫夫曼编码
void printCodes(Node* root, char* codes, int index) {
if (!root->left && !root->right) {
codes[index++] = '0';
printf("%c: %s\n", root->ch, codes);
} else {
printCodes(root->left, codes, index);
printCodes(root->right, codes, index);
}
}
int main() {
int freqs[] = {5, 25, 4, 7, 9, 12, 30, 8}; // 字符频率
int n = sizeof(freqs) / sizeof(freqs[0]);
Node* root = buildHuffmanTree(freqs, n);
char codes[256] = {0};
printCodes(root, codes, 0);
return 0;
}
```
注意,此代码仅适用于单个字符集。实际应用中可能需要处理更复杂的数据结构。在这个代码里,`printCodes`函数会递归地生成赫夫曼编码,并打印出来。赫夫曼编码会根据构建的树的路径生成,最左边的是0,最右边的是1。
阅读全文