用c语言实现有一电文共使用五种字符A,B,C,D,E,其出现频率依次为4,7,5,2,9。构造对应的编码哈夫曼树(要求左子树根结点的权小于等于右子树根结点的权),并输出个字符的编码。
时间: 2023-09-12 19:07:59 浏览: 163
欲发一封内容为 AABBCAB ……( 共长 100 字符...)的电报报文,实现哈夫曼编码和译码。
5星 · 资源好评率100%
好的,以下是我给出的 C 语言代码实现。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NODE_NUM 100 // 哈夫曼树最大结点数
// 哈夫曼树结点
typedef struct {
int weight; // 权值
int parent; // 父结点下标
int lchild; // 左孩子下标
int rchild; // 右孩子下标
} Node;
// 构造哈夫曼树
void huffmanTree(Node* nodes, int n) {
// 初始化哈夫曼树结点数组
for (int i = 0; i < 2*n-1; i++) {
nodes[i].weight = 0;
nodes[i].parent = -1;
nodes[i].lchild = -1;
nodes[i].rchild = -1;
}
// 初始化叶子结点
for (int i = 0; i < n; i++) {
nodes[i].weight = i + 1;
}
// 构造哈夫曼树
for (int i = n; i < 2*n-1; i++) {
int min1 = -1, min2 = -1;
// 找出权值最小的两个结点
for (int j = 0; j < i; j++) {
if (nodes[j].parent == -1) {
if (min1 == -1 || nodes[j].weight < nodes[min1].weight) {
min2 = min1;
min1 = j;
} else if (min2 == -1 || nodes[j].weight < nodes[min2].weight) {
min2 = j;
}
}
}
// 合并两个结点
nodes[min1].parent = i;
nodes[min2].parent = i;
nodes[i].lchild = min1;
nodes[i].rchild = min2;
nodes[i].weight = nodes[min1].weight + nodes[min2].weight;
}
}
// 获取字符编码
void getCharCode(Node* nodes, int n, char* chars, char** codes) {
// 初始化编码数组
for (int i = 0; i < n; i++) {
codes[i] = (char*)malloc(100 * sizeof(char));
codes[i][0] = '\0';
}
// 获取编码
for (int i = 0; i < n; i++) {
int index = i;
int parent = nodes[index].parent;
// 从叶子结点向上遍历
while (parent != -1) {
if (nodes[parent].lchild == index) {
strcat(codes[i], "0");
} else {
strcat(codes[i], "1");
}
index = parent;
parent = nodes[index].parent;
}
// 反转编码
int len = strlen(codes[i]);
for (int j = 0; j < len/2; j++) {
char temp = codes[i][j];
codes[i][j] = codes[i][len-j-1];
codes[i][len-j-1] = temp;
}
}
}
int main() {
int n = 5;
int weights[] = {4, 7, 5, 2, 9};
char chars[] = {'A', 'B', 'C', 'D', 'E'};
Node nodes[MAX_NODE_NUM];
huffmanTree(nodes, n);
char* codes[n];
getCharCode(nodes, n, chars, codes);
for (int i = 0; i < n; i++) {
printf("%c: %s\n", chars[i], codes[i]);
free(codes[i]);
}
return 0;
}
```
在上面的代码中,我们首先定义了一个哈夫曼树结点的结构体 `Node`。然后通过函数 `huffmanTree` 构造哈夫曼树,函数 `getCharCode` 获取字符编码。最后在 `main` 函数中输出每个字符的编码。注意,在 C 语言中需要手动分配和释放内存。
阅读全文