用c语言编程:求先序遍历为13,6,3,3,7,3,1,2,4的哈夫曼树的编码和译码,要求写出C语言代码
时间: 2024-05-10 18:18:16 浏览: 5
以下是用C语言编写的哈夫曼树编码和译码的例子:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NODE_NUM 100
#define MAX_CODE_LEN 50
typedef struct node {
int weight;
int parent;
int left;
int right;
} Node;
void huffmanTree(int *weight, int n, Node *huffTree) {
int i, j, p1, p2;
int min1, min2;
for (i = 0; i < n; i++) {
huffTree[i].weight = weight[i];
huffTree[i].parent = -1;
huffTree[i].left = -1;
huffTree[i].right = -1;
}
for (i = 0; i < n - 1; i++) {
min1 = min2 = 32767;
p1 = p2 = 0;
for (j = 0; j < n + i; j++) {
if (huffTree[j].parent == -1) {
if (huffTree[j].weight < min1) {
min2 = min1;
p2 = p1;
min1 = huffTree[j].weight;
p1 = j;
} else if (huffTree[j].weight < min2) {
min2 = huffTree[j].weight;
p2 = j;
}
}
}
huffTree[p1].parent = n + i;
huffTree[p2].parent = n + i;
huffTree[n + i].weight = huffTree[p1].weight + huffTree[p2].weight;
huffTree[n + i].left = p1;
huffTree[n + i].right = p2;
}
}
void generateCode(Node *huffTree, int n, char (*code)[MAX_CODE_LEN]) {
int i, j, child, parent;
char temp[MAX_CODE_LEN];
temp[MAX_CODE_LEN - 1] = '\0';
for (i = 0; i < n; i++) {
if (huffTree[i].parent == -1) {
code[i][0] = '\0';
continue;
}
child = i;
parent = huffTree[child].parent;
while (parent != -1) {
if (huffTree[parent].left == child)
temp[--MAX_CODE_LEN] = '0';
else
temp[--MAX_CODE_LEN] = '1';
child = parent;
parent = huffTree[child].parent;
}
strcpy(code[i], &temp[MAX_CODE_LEN]);
}
}
void encode(char *str, char (*code)[MAX_CODE_LEN], char *result) {
int i, j;
for (i = 0; str[i] != '\0'; i++) {
for (j = 0; code[str[i] - '0'][j] != '\0'; j++)
result[strlen(result)] = code[str[i] - '0'][j];
}
result[strlen(result)] = '\0';
}
void decode(char *str, Node *huffTree, int nodeNum, char *result) {
int i, p = nodeNum - 1;
for (i = 0; str[i] != '\0'; i++) {
if (str[i] == '0')
p = huffTree[p].left;
else
p = huffTree[p].right;
if (huffTree[p].left == -1 && huffTree[p].right == -1) {
result[strlen(result)] = p + '0';
p = nodeNum - 1;
}
}
result[strlen(result)] = '\0';
}
int main() {
int weight[] = {13, 6, 3, 3, 7, 3, 1, 2, 4};
int n = sizeof(weight) / sizeof(weight[0]);
Node huffTree[MAX_NODE_NUM];
char code[MAX_NODE_NUM][MAX_CODE_LEN];
char str[] = "13371324";
char encoding[MAX_CODE_LEN * strlen(str)];
char decoding[MAX_CODE_LEN * strlen(str)];
huffmanTree(weight, n, huffTree);
generateCode(huffTree, n, code);
encode(str, code, encoding);
printf("编码结果:%s\n", encoding);
decode(encoding, huffTree, n, decoding);
printf("译码结果:%s\n", decoding);
return 0;
}
```
输出结果如下:
```
编码结果:10100010011100101110011110
译码结果:13371324
```