帮我用c语言写代码完成以下任务哈夫曼编码 任务:根据电文中各字符出现的频率,建立哈夫曼树,并设计字符的哈夫曼编码。 功能要求: 1) 建立并输出哈夫曼树的存储结构; 2) 根据哈夫曼树,设计并输出对应字符的哈夫曼编码; 3) 将指定接收到的电文进行译码并输出。 界面要求:程序运行后,给出菜单项的内容和输入提示: 1. 建立哈夫曼树 2. 哈夫曼编码 3. 译码 0. 退出 请选择0-3:
时间: 2024-03-19 21:44:52 浏览: 12
为了方便,我将分为三部分给你分别展示代码,包括建立哈夫曼树、哈夫曼编码和译码。
建立哈夫曼树:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_TREE_SIZE 100
typedef struct {
char ch; // 存储字符
int weight; // 存储权值
int parent, lchild, rchild; // 存储父节点和左右子节点的下标
} HTNode, *HuffmanTree;
void CreateHuffmanTree(HuffmanTree *HT, int n) {
if (n <= 1) {
return;
}
int m = 2 * n - 1;
*HT = (HuffmanTree) malloc((m + 1) * sizeof(HTNode));
for (int i = 1; i <= n; i++) {
scanf(" %c %d", &(*HT)[i].ch, &(*HT)[i].weight);
(*HT)[i].parent = 0;
(*HT)[i].lchild = 0;
(*HT)[i].rchild = 0;
}
for (int i = n + 1; i <= m; i++) {
(*HT)[i].ch = ' ';
(*HT)[i].weight = 0;
(*HT)[i].parent = 0;
(*HT)[i].lchild = 0;
(*HT)[i].rchild = 0;
}
int s1, s2, min1 = 0, min2 = 0;
for (int i = n + 1; i <= m; i++) {
s1 = s2 = 0;
min1 = min2 = 0;
for (int j = 1; j < i; j++) {
if ((*HT)[j].parent == 0) {
if ((*HT)[j].weight < (*HT)[min1].weight) {
min2 = min1;
min1 = j;
} else if ((*HT)[j].weight < (*HT)[min2].weight) {
min2 = j;
}
}
}
(*HT)[min1].parent = i;
(*HT)[min2].parent = i;
(*HT)[i].lchild = min1;
(*HT)[i].rchild = min2;
(*HT)[i].weight = (*HT)[min1].weight + (*HT)[min2].weight;
}
}
void PrintHuffmanTree(HuffmanTree HT, int n) {
printf("Huffman Tree:\n");
for (int i = 1; i <= 2 * n - 1; i++) {
printf("%d: %c %d %d %d %d\n", i, HT[i].ch, HT[i].weight, HT[i].parent, HT[i].lchild, HT[i].rchild);
}
}
```
哈夫曼编码:
```c
#define MAX_CODE_LEN 20
typedef struct {
char ch;
char code[MAX_CODE_LEN];
} HCode;
void HuffmanCoding(HuffmanTree HT, int n, HCode *HC) {
char *cd = (char *) malloc(n * sizeof(char));
cd[n - 1] = '\0';
for (int i = 1; i <= n; i++) {
int start = n - 1;
int c = i;
int f = HT[i].parent;
while (f != 0) {
if (HT[f].lchild == c) {
cd[--start] = '0';
} else {
cd[--start] = '1';
}
c = f;
f = HT[f].parent;
}
strcpy(HC[i].code, &cd[start]);
HC[i].ch = HT[i].ch;
}
free(cd);
}
void PrintHuffmanCode(HCode *HC, int n) {
printf("Huffman Code:\n");
for (int i = 1; i <= n; i++) {
printf("%c: %s\n", HC[i].ch, HC[i].code);
}
}
```
译码:
```c
void Decode(HuffmanTree HT, int n) {
printf("Please input the coded message:\n");
char code[100];
scanf("%s", code);
int p = 2 * n - 1;
for (int i = 0; code[i] != '\0'; i++) {
if (code[i] == '0') {
p = HT[p].lchild;
} else {
p = HT[p].rchild;
}
if (HT[p].lchild == 0 && HT[p].rchild == 0) {
printf("%c", HT[p].ch);
p = 2 * n - 1;
}
}
printf("\n");
}
```
完整代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_TREE_SIZE 100
#define MAX_CODE_LEN 20
typedef struct {
char ch; // 存储字符
int weight; // 存储权值
int parent, lchild, rchild; // 存储父节点和左右子节点的下标
} HTNode, *HuffmanTree;
typedef struct {
char ch;
char code[MAX_CODE_LEN];
} HCode;
void CreateHuffmanTree(HuffmanTree *HT, int n) {
if (n <= 1) {
return;
}
int m = 2 * n - 1;
*HT = (HuffmanTree) malloc((m + 1) * sizeof(HTNode));
for (int i = 1; i <= n; i++) {
scanf(" %c %d", &(*HT)[i].ch, &(*HT)[i].weight);
(*HT)[i].parent = 0;
(*HT)[i].lchild = 0;
(*HT)[i].rchild = 0;
}
for (int i = n + 1; i <= m; i++) {
(*HT)[i].ch = ' ';
(*HT)[i].weight = 0;
(*HT)[i].parent = 0;
(*HT)[i].lchild = 0;
(*HT)[i].rchild = 0;
}
int s1, s2, min1 = 0, min2 = 0;
for (int i = n + 1; i <= m; i++) {
s1 = s2 = 0;
min1 = min2 = 0;
for (int j = 1; j < i; j++) {
if ((*HT)[j].parent == 0) {
if ((*HT)[j].weight < (*HT)[min1].weight) {
min2 = min1;
min1 = j;
} else if ((*HT)[j].weight < (*HT)[min2].weight) {
min2 = j;
}
}
}
(*HT)[min1].parent = i;
(*HT)[min2].parent = i;
(*HT)[i].lchild = min1;
(*HT)[i].rchild = min2;
(*HT)[i].weight = (*HT)[min1].weight + (*HT)[min2].weight;
}
}
void PrintHuffmanTree(HuffmanTree HT, int n) {
printf("Huffman Tree:\n");
for (int i = 1; i <= 2 * n - 1; i++) {
printf("%d: %c %d %d %d %d\n", i, HT[i].ch, HT[i].weight, HT[i].parent, HT[i].lchild, HT[i].rchild);
}
}
void HuffmanCoding(HuffmanTree HT, int n, HCode *HC) {
char *cd = (char *) malloc(n * sizeof(char));
cd[n - 1] = '\0';
for (int i = 1; i <= n; i++) {
int start = n - 1;
int c = i;
int f = HT[i].parent;
while (f != 0) {
if (HT[f].lchild == c) {
cd[--start] = '0';
} else {
cd[--start] = '1';
}
c = f;
f = HT[f].parent;
}
strcpy(HC[i].code, &cd[start]);
HC[i].ch = HT[i].ch;
}
free(cd);
}
void PrintHuffmanCode(HCode *HC, int n) {
printf("Huffman Code:\n");
for (int i = 1; i <= n; i++) {
printf("%c: %s\n", HC[i].ch, HC[i].code);
}
}
void Decode(HuffmanTree HT, int n) {
printf("Please input the coded message:\n");
char code[100];
scanf("%s", code);
int p = 2 * n - 1;
for (int i = 0; code[i] != '\0'; i++) {
if (code[i] == '0') {
p = HT[p].lchild;
} else {
p = HT[p].rchild;
}
if (HT[p].lchild == 0 && HT[p].rchild == 0) {
printf("%c", HT[p].ch);
p = 2 * n - 1;
}
}
printf("\n");
}
int main() {
HuffmanTree HT = NULL;
HCode HC[MAX_TREE_SIZE];
int n = 0;
while (1) {
printf("1. Create Huffman Tree\n");
printf("2. Huffman Coding\n");
printf("3. Decode\n");
printf("0. Exit\n");
printf("Please select 0-3: ");
int choice;
scanf("%d", &choice);
switch (choice) {
case 0:
return 0;
case 1:
printf("Please input the number of characters: ");
scanf("%d", &n);
CreateHuffmanTree(&HT, n);
PrintHuffmanTree(HT, n);
break;
case 2:
HuffmanCoding(HT, n, HC);
PrintHuffmanCode(HC, n);
break;
case 3:
Decode(HT, n);
break;
default:
printf("Invalid input\n");
break;
}
}
}
```