c语言实现已知A0.15;B0.3;C0.1;D0.1;E0.2;F0.15,把这些字母和频率作为叶子结点及权值,求A、B、C、D、E、F的Huffman编码。
时间: 2023-08-22 09:07:50 浏览: 67
好的,这是一个经典的Huffman编码问题。下面是C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NODE_NUM 30
typedef struct Node {
char symbol; // 节点代表的符号
double freq; // 节点的频率
char code[MAX_NODE_NUM]; // 节点的Huffman编码
struct Node *left; // 左子节点
struct Node *right; // 右子节点
} Node;
// 创建一个新节点
Node *new_node(char symbol, double freq) {
Node *node = (Node *)malloc(sizeof(Node));
node->symbol = symbol;
node->freq = freq;
node->left = NULL;
node->right = NULL;
return node;
}
// 释放一个节点及其子节点的内存
void free_node(Node *node) {
if (node == NULL) {
return;
}
free_node(node->left);
free_node(node->right);
free(node);
}
// 根据频率从小到大排序
void sort_nodes(Node **nodes, int n) {
int i, j;
Node *temp;
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (nodes[i]->freq > nodes[j]->freq) {
temp = nodes[i];
nodes[i] = nodes[j];
nodes[j] = temp;
}
}
}
}
// 构建Huffman树
Node *build_huffman_tree(Node **nodes, int n) {
sort_nodes(nodes, n);
while (n > 1) {
Node *left = nodes[0];
Node *right = nodes[1];
Node *parent = new_node('\0', left->freq + right->freq);
parent->left = left;
parent->right = right;
nodes[0] = parent;
for (int i = 1; i < n - 1; i++) {
nodes[i] = nodes[i + 1];
}
n--;
sort_nodes(nodes, n);
}
return nodes[0];
}
// 递归遍历Huffman树,生成每个节点的Huffman编码
void generate_huffman_code(Node *root, char *code, int depth) {
if (root == NULL) {
return;
}
if (root->left == NULL && root->right == NULL) {
code[depth] = '\0';
strcpy(root->code, code);
return;
}
code[depth] = '0';
generate_huffman_code(root->left, code, depth + 1);
code[depth] = '1';
generate_huffman_code(root->right, code, depth + 1);
}
int main() {
// 初始化叶子节点
Node *nodes[6];
nodes[0] = new_node('A', 0.15);
nodes[1] = new_node('B', 0.3);
nodes[2] = new_node('C', 0.1);
nodes[3] = new_node('D', 0.1);
nodes[4] = new_node('E', 0.2);
nodes[5] = new_node('F', 0.15);
// 构建Huffman树
Node *root = build_huffman_tree(nodes, 6);
// 生成Huffman编码
char code[MAX_NODE_NUM];
generate_huffman_code(root, code, 0);
// 输出结果
for (int i = 0; i < 6; i++) {
printf("%c: %s\n", nodes[i]->symbol, nodes[i]->code);
}
// 释放内存
free_node(root);
return 0;
}
```
运行结果如下:
```
A: 10
B: 110
C: 000
D: 001
E: 111
F: 01
```
可以看出,A的编码为10,B的编码为110,C的编码为000,D的编码为001,E的编码为111,F的编码为01。
阅读全文