- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
哈夫曼编/译码系统的设计与实现
一、 实验项目简介:
问题描述:
利用哈夫曼编码进行通信可以人大提高信道利用率,缩短信息传输吋间,降低传输成
本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据 进行译码(解码)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编 /译码系统。试为这样的信息收发站设计一个哈夫曼编/译码系统。
一个完整的系统应具有以下功能:
1) 初始化(Tnitialzation)。从数据文件DataFile. data中读入字符及每个字符的权值,建 立哈夫曼树HuffTree;
2) 编码(EnCoding)o用已建好的哈夫曼树,对文件ToBeTran. data中的文本进行编码
形成报文,将报文写在文件Code, txt中;
3) 译码(Decoding),,利用已建好的哈夫曼树,对文件CodeFi le. data中的代码进行解 码形成原文,结果存入文件Textfile, txt中;
4) 输出(Output)。输出DataFile. data中出现的字符以及各字符出现的频度(或概率); 输出 ToBeTran. data 及其报文 Code, txt;输出 CodeFile. data 及其原文 Textfile, txt; 耍求:所设计的系统应能在程序执行的过程中,根据实际情况(不同的输入)建立 DataF订e. data、ToBeTran. data和CodeFi le. data三个文件,以保证系统的通用性。
二、 实验冃的:
理解哈夫曼树的特征及其应用;在对哈夫曼树进行理解的基础上,构造哈夫曼树,并用 构造的哈夫曼树进行编码和译码;通过该实验,使学生对二叉树的构建、遍历等以及哈夫曼 编码的应用冇更深层次的理解。
实验步骤:实验分2次完成
第1次:完成程序的主框架设计,进行调试,验证其正确性;(2学吋)
第2次:详细设计,进行调试,对运行结果进行分析,完成实验报告。(2学时)
三、 参考程序
(一)基本实验的参考程序
文件HuffermanDef. h是赫夫曼树和赫夫曼编码的存储表示
typedef struct
{
char ch;
unsigned int weight;
unsi gned int parent, 1 chi Id, rchi Id;
}HTNode, *HuffmanTree; /* 动态分配数组存储赫夫曼树*/typedef char **Huf fmanCode; /* 动态分配数组存储赫夫曼编码表*/
文件HuffermanUse. c是求赫夫曼编码
#includeIIuffernianDef. h
int Min(HuffmanTree t, int i)
{ /* 函数void select()调用*/
int j,flag;
unsigned int k=UINT_MAX; /*取k为不小于可能的值*/
for(j=l;j=i;j++)
if(t[j]. weightkt[j]. parent==0)
k=t[j]. weight, flag=j;
t[f lcig]? parent二 1;
return flag;
}
void Select(HuffmanTree t, int i, int *si, int *s2)
{ /* si为故小的两个值中序号小的那个*/
int j;
*sl=Min(t, i);
*s2=Min(t, i);
if(*sl*s2)
{
j=*sl;
*sl=*s2;
*s2=j;
}
}
HuffmcinCode 1 lu f f mtinCod i ng (Hu f f mtinTr ee *HT, cheir * ch, int int n)
{ /* W存放n个字符的权值(均0),构造赫夫曼树I1T,并求出n个字符的赫夫曼编码I1C */
HuffmanCode HC;
int m, i, si, s2, start;
unsigned c, f;
HuffmtinTree p;
char *cd;
if(n=l)
return NULL;
m=2*n-l; //哈夫曼树的结点数
*HT= (HuffmanTree)malloc ((m+1)*sizeof (HTNode)); /* 0 号单元未用*/
for (p= (*HT)+1, i=l; i=n;++i, ++p, ++w, ++ch)
{
(*p)? ch=*ch;
(*p)? weight二*w;
(*p)? parent二0;
(*p). lchild=0;
(*p). rchild=0;
}
for(:i=m;++i, ++p)
(*p)? parent二0;
for (i=n+l; i=m;++i) /*
文档评论(0)