使用C语言编写一段程序 根据A-Z、空格、逗号、句号的频率确定哈夫曼树,并使用哈夫曼树对文本解码
时间: 2023-08-07 20:03:16 浏览: 43
下面是用C语言实现的哈夫曼编码和解码程序。
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 1000
#define MAX_NODES 1000
typedef struct Node {
char data;
int weight;
int lchild, rchild, parent;
char code[MAX_LEN];
} Node;
void createHuffmanTree(Node *nodes, int n) {
int i, j, p1, p2, min1, min2;
for (i = 0; i < 2 * n - 1; i++) {
nodes[i].weight = 0;
nodes[i].lchild = -1;
nodes[i].rchild = -1;
nodes[i].parent = -1;
}
for (i = 0; i < n; i++) {
printf("Enter the character and its weight: ");
fflush(stdout);
scanf(" %c %d", &nodes[i].data, &nodes[i].weight);
}
for (i = 0; i < n - 1; i++) {
min1 = min2 = MAX_NODES;
p1 = p2 = -1;
for (j = 0; j < n + i; j++) {
if (nodes[j].parent == -1) {
if (nodes[j].weight < min1) {
min2 = min1;
p2 = p1;
min1 = nodes[j].weight;
p1 = j;
} else if (nodes[j].weight < min2) {
min2 = nodes[j].weight;
p2 = j;
}
}
}
nodes[p1].parent = n + i;
nodes[p2].parent = n + i;
nodes[n + i].weight = nodes[p1].weight + nodes[p2].weight;
nodes[n + i].lchild = p1;
nodes[n + i].rchild = p2;
}
}
void encode(Node *nodes, int n) {
int i, j, k;
for (i = 0; i < n; i++) {
k = i;
while (nodes[k].parent != -1) {
j = k;
k = nodes[k].parent;
if (nodes[k].lchild == j) {
strcat(nodes[i].code, "0");
} else {
strcat(nodes[i].code, "1");
}
}
strrev(nodes[i].code);
}
}
void decode(Node *nodes, int n) {
char str[MAX_LEN];
printf("Enter the encoded string: ");
fflush(stdout);
scanf("%s", str);
int i, j, k;
for (i = 0; i < strlen(str); i++) {
k = n + n - 2;
while (nodes[k].lchild != -1) {
if (str[i] == '0') {
k = nodes[k].lchild;
} else {
k = nodes[k].rchild;
}
i++;
}
printf("%c", nodes[k].data);
i--;
}
}
int main() {
Node nodes[MAX_NODES];
int n;
printf("Enter the number of characters: ");
fflush(stdout);
scanf("%d", &n);
createHuffmanTree(nodes, n);
encode(nodes, n);
for (int i = 0; i < n; i++) {
printf("%c: %s\n", nodes[i].data, nodes[i].code);
}
decode(nodes, n);
return 0;
}
```
这个程序首先让用户输入字符和它们的权重,然后根据它们的权重创建哈夫曼树。接下来,它使用哈夫曼树对每个字符进行编码,并打印编码结果。最后,它让用户输入一个编码的字符串,并使用哈夫曼树将其解码为原始字符串。