用c语言实现哈夫曼编码 要求: (1)根据所给定的图,实现下列函数编写: (2)用户输入结点个数,结点名称和权值,请构建哈夫曼树,进行哈夫曼编码 (3)用户输入一串字符,实现编码;用户输入编码,实现译码。
时间: 2023-11-27 19:02:27 浏览: 89
以下是一个用C语言实现哈夫曼编码的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NODE_NUM 100
#define MAX_CODE_LEN 50
typedef struct {
char name;
int weight;
char code[MAX_CODE_LEN];
int code_len;
} HuffmanNode;
void huffman_encode(HuffmanNode *nodes, int node_num, char *input, char *output) {
// 构建哈夫曼树
int i, j, k;
for (i = 0; i < node_num - 1; ++i) {
int min1 = -1, min2 = -1;
for (j = 0; j < node_num; ++j) {
if (nodes[j].weight != 0 && min1 == -1) {
min1 = j;
} else if (nodes[j].weight != 0 && min2 == -1) {
min2 = j;
} else if (nodes[j].weight != 0 && nodes[j].weight < nodes[min1].weight) {
min2 = min1;
min1 = j;
} else if (nodes[j].weight != 0 && (min2 == -1 || nodes[j].weight < nodes[min2].weight)) {
min2 = j;
}
}
nodes[node_num + i].weight = nodes[min1].weight + nodes[min2].weight;
nodes[node_num + i].name = '\0';
for (k = 0; k < nodes[min1].code_len; ++k) {
nodes[min1].code[k] = '0';
}
for (k = 0; k < nodes[min2].code_len; ++k) {
nodes[min2].code[k] = '1';
}
nodes[min1].code[nodes[min1].code_len] = '\0';
nodes[min2].code[nodes[min2].code_len] = '\0';
strcat(nodes[min1].code, nodes[min2].code);
nodes[min1].code_len += nodes[min2].code_len;
nodes[min2].weight = 0;
}
// 打印编码表
printf("编码表:\n");
for (i = 0; i < node_num; ++i) {
printf("%c: %s\n", nodes[i].name, nodes[i].code);
}
// 对输入字符串进行编码
printf("编码结果:");
int len = strlen(input);
for (i = 0; i < len; ++i) {
for (j = 0; j < node_num; ++j) {
if (input[i] == nodes[j].name) {
printf("%s", nodes[j].code);
strcat(output, nodes[j].code);
break;
}
}
}
printf("\n");
}
void huffman_decode(HuffmanNode *nodes, int node_num, char *input, char *output) {
// 对编码字符串进行译码
printf("译码结果:");
int len = strlen(input);
int pos = 0;
while (pos < len) {
for (int i = 0; i < node_num; ++i) {
if (strncmp(input + pos, nodes[i].code, nodes[i].code_len) == 0) {
printf("%c", nodes[i].name);
strcat(output, &nodes[i].name);
pos += nodes[i].code_len;
break;
}
}
}
printf("\n");
}
int main() {
int node_num;
printf("请输入结点个数:");
scanf("%d", &node_num);
HuffmanNode nodes[MAX_NODE_NUM];
memset(nodes, 0, sizeof(nodes));
for (int i = 0; i < node_num; ++i) {
printf("请输入第 %d 个结点的名称和权值(用空格分隔):", i + 1);
scanf(" %c %d", &nodes[i].name, &nodes[i].weight);
nodes[i].code_len = 0;
}
char input[MAX_NODE_NUM];
char output[MAX_NODE_NUM * MAX_CODE_LEN] = "";
printf("请输入需要编码的字符串:");
scanf("%s", input);
huffman_encode(nodes, node_num, input, output);
char decode_input[MAX_NODE_NUM * MAX_CODE_LEN];
printf("请输入需要译码的编码字符串:");
scanf("%s", decode_input);
char decode_output[MAX_NODE_NUM] = "";
huffman_decode(nodes, node_num, decode_input, decode_output);
return 0;
}
```
这个示例代码实现了哈夫曼编码的基本功能,可以根据用户输入的结点个数、结点名称和权值构建哈夫曼树,并对用户输入的字符串进行编码和译码。注意,这个示例代码中并没有考虑哈夫曼编码的效率问题,实际使用时还需要进行优化。
阅读全文