资源描述:
《数据结构课程设计-哈弗曼编码、译码器》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、安徽省巢湖学院计算机与信息工程学院课程设计报告课程名称《数据结构》课题名称哈弗曼编码、译码器专业计算机科学与技术班级10计本2班学号姓名联系方式指导教师2011年12月29日一.实验目的练习树和哈夫曼树的有关操作,和各个算法程序,理解哈夫曼树的编码和译码二.实验环境Microsoftvisualc++三、问题描述利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一
2、个完整的编码/译码系统。试为这样的信息收发站写一个哈夫曼编码的编码/译码器。四、需求分析(1)初始化;从终端输入字符集的大小n,以及n个字符和n个权值建立哈夫曼树。(2)输出哈夫曼树,及各字符对应的编码。(3)编码:利用建好的哈夫曼树,对输入的待发送电文进行编码。同时输入原文及编码串。(4)译码:利用建好的哈夫曼树,对输入的已接收电文进行译码。同时输入编码串及原文。五、概要设计#include#include#include#include#incl
3、ude//typedefintTElemType;constintUINT_MAX=1000;charstr[50];typedefstruct{intweight,K;intparent,lchild,rchild;}HTNode,HuffmanTree;typedefcharHuffmanCode;//-----------全局变量-----------------------HuffmanTreeHT;HuffmanCodeHC;intw[50],i,j,n;charz[50];intflag=0;intnum
4、b=0//-----------------求哈夫曼编码-----------------------structcou{chardata;intcount;}cou[50];intmin(HuffmanTreet,inti){//函数voidselect()调用intj,flag;intk=UINT_MAX;//取k为不小于可能的值,即k为最大的权值1000for(j=1;j<=i;j++)if(t[j].weight5、eturnflag;}//--------------------slect函数----------------------voidselect(HuffmanTreet,inti,int&s1,int&s2){//s1为最小的两个值中序号小的那个intj;s1=min(t,i);s2=min(t,i);if(s1>s2){j=s1;s1=s2;s2=j;}}//--------------算法6.12--------------------------voidHuffmanCoding(HuffmanTree&HT,HuffmanC
6、ode&HC,intw,intn){//w存放n个字符的权值(均>0),构造哈夫曼树HT,并求出n个字符的哈夫曼编码HCintm,i,s1,s2,start;//unsignedc,f;intc,f;HuffmanTreep;charcd;if(n<=1)return;//检测结点数是否可以构成树m=2n-1;HT=(HuffmanTree)malloc((m+1)sizeof(HTNode));//0号单元未用for(p=HT+1,i=1;i<=n;++i,++p,++w){p->weight=w;p->parent=0;p->lc
7、hild=0;p->rchild=0;}for(;i<=m;++i,++p)p->parent=0;for(i=n+1;i<=m;++i)//建哈夫曼树{//在HT[1~i-1]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2select(HT,i-1,s1,s2);HT[s1].parent=HT[s2].parent=i;HT[i].lchild=s1;HT[i].rchild=s2;HT[i].weight=HT[s1].weight+HT[s2].weight;}//从叶子到根逆向求每个字符的哈夫曼编
8、码HC=(HuffmanCode)malloc((n+1)sizeof(char));//分配n个字符编码的头指针向量([0]不用)cd=(char)malloc(nsizeof(char));//分配求编码的工作空间c