资源简介
利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼编/译码系统。
[基本要求]
一个完整的系统应具有以下功能:
(1)I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。
(2)E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
(3)D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。
(4)P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码写入文件CodePrint中。
(5)T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。
代码片段和文件信息
#include
#include
#include
using namespace std;
#include
#include
typedef struct
{
char character;
unsigned int weight;
unsigned int parentlchildrchild;
}HTNode*HuffmanTree;
typedef char **HuffmanCode;
char *c;
FILE *ff;
int L;
struct H{
char s[1000];
};
H hc[1000];
HuffmanTree HT;
HuffmanCode HC;
void menu() //定义菜单函数
{
printf(“please make the choice:\n“);
cout<<“***** I: 初始化 *****“< cout<<“***** E:编码 *****“< cout<<“***** D:译码 *****“< cout<<“***** P:印代码文件 *****“< cout<<“***** T: 印赫夫曼树 *****“< cout<<“***** Q: 退出 *****“< }
void Select(HuffmanTree &HTint endint &s1int &s2) //选择权值最小的两个结点
{
int i;
int weight1weight2; //定义两个最小权值
weight1=weight2=1000;
for(i=1;i<=end;i++)
{
if(HT[i].parent==0 && HT[i].weight {
weight1 = HT[i].weight;
s1 = i;
}
}
for(i=1;i<=end;i++)
{
if(HT[i].parent==0 && HT[i].weight {
weight2 = HT[i].weight;
s2 = i;
}
}
}
void Initialization(HuffmanTree &HTHuffmanCode &HC) //初始化赫夫曼树
{
FILE *fp*fp1;
fp=fopen(“hfmTree.txt““w+“); //以写的方式打开文件,如果文件不存在,则创建文件
fp1=fopen(“ht.txt““w+“); //编辑两个文件
int mnis1s2startfb;
int *w;
char *cd;
bool flag = true; //布尔类型
printf(“please input n: \n“);
scanf(“%d“&n);
fprintf(fp“%d\n“n); //将常规变量格式化输出到指定文件
fprintf(fp1“%d\n“n);
if(n<=1)return;
w=(int *)malloc((n+1)*sizeof(int)); //动态申请数组空间存储结点的权值
c=(char *)malloc((n+1)*sizeof(char)); //动态申请数组空间存储结点字符
printf(“please input character and weight: \n“);
for(i=1;i<=n;i++)
{
fflush(stdin);
cout<<“请输入第“< scanf(“%c“&c[i]);
scanf(“%d“&w[i]);
}
m=2*n-1; //有n个叶子的huffman树共有2*n-1个结点
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(i=1;i<=n;i++) //初始化赫夫曼树
{ //叶子赋字符和权值
HT[i].character=c[i];
HT[i].weight=w[i];
HT[i].parent=0; //清华大学数据结构P149页表格直观显示存储结构
HT[i].lchild=0;
HT[i].rchild=0;
}
for(i=n+1;i<=m;++i)
{ //非叶子节点置零
HT[i].character=0;
HT[i].weight=0;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for(i=n+1;i<=m;++i) //选择权值最小的两个结点
{
Select(HTi-1s1s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lch
- 上一篇:24点游戏.cpp
- 下一篇:课程设计--计算器基于MFC
评论
共有 条评论