哈弗曼编法c语言怎么编
时间: 2023-06-21 08:10:51 浏览: 54
Huffman编码是一种基于字符出现频率进行数据压缩的算法,它可以将原始数据中出现频率较高的字符用较短的二进制编码表示,从而达到压缩数据的目的。
下面是一个用C语言实现Huffman编码的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NODE 256
typedef struct huffman_node {
int weight;
int parent;
int left_child;
int right_child;
} huffman_node;
void huffman_build(huffman_node *node, int n)
{
int i, j, m1, m2, x1, x2;
for (i = 0; i < 2 * n - 1; i++) {
node[i].weight = 0;
node[i].parent = -1;
node[i].left_child = -1;
node[i].right_child = -1;
}
for (i = 0; i < n; i++) {
printf("Enter weight of node %d: ", i);
scanf("%d", &node[i].weight);
}
for (i = 0; i < n - 1; i++) {
m1 = m2 = 0x7fffffff;
x1 = x2 = 0;
for (j = 0; j < n + i; j++) {
if (node[j].parent == -1 && node[j].weight < m1) {
m2 = m1;
x2 = x1;
m1 = node[j].weight;
x1 = j;
} else if (node[j].parent == -1 && node[j].weight < m2) {
m2 = node[j].weight;
x2 = j;
}
}
node[x1].parent = n + i;
node[x2].parent = n + i;
node[n + i].weight = node[x1].weight + node[x2].weight;
node[n + i].left_child = x1;
node[n + i].right_child = x2;
}
}
void huffman_encode(huffman_node *node, int n, char *str)
{
int i, j, k, p;
char *code[MAX_NODE];
for (i = 0; i < MAX_NODE; i++) {
code[i] = (char *) malloc(n * sizeof(char));
}
code[n - 1][0] = '\0';
for (i = n - 2; i >= 0; i--) {
j = node[i].left_child;
k = node[i].right_child;
strcpy(code[j], code[i]);
strcat(code[j], "0");
strcpy(code[k], code[i]);
strcat(code[k], "1");
}
printf("Huffman codes:\n");
for (i = 0; i < n; i++) {
printf("Node %d: %s\n", i, code[i]);
}
printf("Encoded string: ");
for (i = 0; i < strlen(str); i++) {
p = str[i];
printf("%s", code[p]);
}
printf("\n");
for (i = 0; i < MAX_NODE; i++) {
free(code[i]);
}
}
int main()
{
int n;
char str[100];
huffman_node node[MAX_NODE];
printf("Enter the number of nodes: ");
scanf("%d", &n);
printf("Enter the string to be encoded: ");
scanf("%s", str);
huffman_build(node, n);
huffman_encode(node, n, str);
return 0;
}
```
以上代码实现了简单的Huffman编码,输入字符的出现频率,然后对字符进行编码,输出编码后的字符串。当然,Huffman编码还可以进行更多的优化,比如使用最小堆来进行节点的选择,这样可以更快速地找到出现频率较小的节点,从而提高编码效率。