求哈夫曼编/译码器程序

来源:百度知道 编辑:UC知道 时间:2024/09/21 11:12:36
二、哈夫曼编/译码器(★必做)
[问题描述]
利用哈夫曼编码进行数据通信可以大大提高信道利用率,统筹数据传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(还原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼的编/译码系统。
[基本要求]
一个完整的编/译码系统应具有以下功能:
(1) 建立哈夫曼编码树(CREATE)。从键盘输入字符集中的所有字符及其对应的频率值,建立哈夫曼编码树。
(2) 输出编码表(TABLE)。利用已建好的哈夫曼树,列出字符集中的所有字符及其对应的哈夫曼编码。
(3) 编码(CODING)。利用建好哈夫曼树,对从键盘输入的正文串进行编码,并在屏幕上显示结果。
(4) 译码(DECODING)。利用已建好的哈夫曼树,对从键盘输入的0,1代码串进行译码,并在屏幕上显示结果。
[测试数据]
(1) 利用下中给出的字母/频率数据调试程序。

字母 C D E F K L U Z
频率 32 42 120 24 7 42 37 2
(2) 用下表中给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM IS MY FAVORITE”

字母 频率 字母 频率
A 77 O 67
B 17 P 20
C 32 Q 5
D 42 R 59
E 120 S 67
F 24 T 85
G 17 U 37
H 50 V 12
I 76 W 22
J 4 X 4
K 7 Y 22
L 42 Z 2
M 24 (空格) 186
N 67
[实现提示]
(1) 用户界面设计为菜单方式。程序运行后,显示如下功能菜单:
1、 建立哈夫曼编码树
2、 输入编码表
3、 编码
4、 译码
5、 退出
用户每键入一个选择数字,程序就执行

不懂,这问题好难!!!

分数太少

C语言的,细节可能不太一样,但是建立过程是这个

#include<string.h>
#include<stdlib.h>
#include<stdio.h>

int m,s1,s2;

typedef struct {
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char *HuffmanCode;

void Select(HuffmanTree HT,int n) {
int i,j;
for(i = 1;i <= n;i++)
if(!HT[i].parent){s1 = i;break;}
for(j = i+1;j <= n;j++)
if(!HT[j].parent){s2 = j;break;}
for(i = 1;i <= n;i++)
if((HT[s1].weight>HT[i].weight)&&(!HT[i].parent)&&(s2!=i))s1=i;
for(j = 1;j <= n;j++)
if((HT[s2].weight>HT[j].weight)&&(!HT[j].parent)&&(s1!=j))s2=j;
}

void HuffmanCoding(HuffmanTree HT, HuffmanCode HC[], int *w, int n) {

int i, j;
char *cd;
int p;
int cdlen;

if (n<=1) return;
m = 2 * n - 1;
HT = (HuffmanTree)malloc((m+1) *