1 / 12
文档名称:

霍夫曼编码实验报告(C ).doc

格式:doc   大小:421KB   页数:12页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

霍夫曼编码实验报告(C ).doc

上传人:rdwiirh 2019/9/24 文件大小:421 KB

下载得到文件列表

霍夫曼编码实验报告(C ).doc

文档介绍

文档介绍:实验名称:霍夫曼编码实验环境软件环境:Windows2000,MicrosoftVisualC++:P4,,256内存,IBM-PC及兼容机实验目的掌握霍夫曼编码、译码原理,并能够通过程序模拟其编码、译码功能。实验原理消息按其出现的概率由大到小地排成一个概率序列;把概率最小两个消息分成一组,其中一个消息编为0,另一个编为1,然后求其概率和,并把这个新概率与其他尚未处理过的概率重新按概率由大到小排成一个新的概率序列;重复步骤,直到所有概率都已联合处理完为止。 实验过程与实验结果源程序:#include<iostream>#include<string>usingnamespacestd;#include<>typedefstruct{//霍夫曼树的结构体 charch; doubleweight;//权值,此处为概率 intparent,lchild,rchild;}htnode,*hfmtree;typedefchar**hfmcode;/*****************************全局变量*****************************/hfmtreeHT;hfmcodeHC;intn=0;//霍夫曼树叶节点个数intm=0;//霍夫曼树所有节点个数int*code_length;//用于记录每个消息字符的码长/*****************************霍夫曼编码模块*****************************///对输入的字符进行检验intInput_Char_Check(){ intflag=1; intj; for(inti=1;i<n&&flag;i++) { for(j=i+1;j<=n;j++) if(HT[j].ch==HT[i].ch) { flag=0; break; } } returnflag;}//对输入的概率进行检测intInput_Weight_Check(){ intflag=0; doublesum=; for(inti=1;i<=n;i++) { if(!(HT[i].weight>0&&HT[i].weight<1))//概率越界{ flag=1; returnflag; } else{ sum+=HT[i].weight; continue; } } if(sum>1)//概率之和超过1 { flag=2; } returnflag;}voidSelect(inta,int*p1,int*p2)/*Select函数,选出HT树到a为止,权值最小和次小且parent为0的2个节点*/{ inti,j,x,y; for(j=1;j<=a;++j){ if(HT[j].parent==0){ x=j; break; } } for(i=j+1;i<=a;++i){ if(HT[i].weight<HT[x].weight&&HT[i].parent==0){ x=i;//选出权值最小的节点} } for(j=1;j<=a;++j) { if(HT[j].parent==0&&x!=j) { y=j; break; } } for(i=j+1;i<=a;++i) { if(HT[i].weight<HT[y].weight&&HT[i].parent==0&&x!=i) { y=i;//选出权值次小的节点} } if(x>y){ *p1=y; *p2=x; } else { *p1=x; *p2=y; }}/*初始化n个叶子节点及其余节点*/voidInit_htnode(){ inti; chartemp_ch; doubletemp_w;I: cout<<"请输入信源发出的消息字符个数:"; cin>>n; if(sizeof(n)!=sizeof(int)||n<=1)//若输入的不是整数,则报错 { cout<<"您输入的数据有误,程序终止!"<<endl; exit(0); } code_length=newint[n+1]; for(i=1;i<=n;i++){ code_length[i]=0;//初始化码长为0 } m=2*n-1; HT=(hfmtree)malloc((m+1)*sizeof(htnode)); for(i=1;i<=n;++i)//初始化n个叶子结点 { printf("请输入第%d个字符信息:",i);cin>>temp_ch; printf("请输入第%d个字符对应的概率:",i); cin>>temp_w; HT[i].ch=temp_ch; HT[i].weight=temp_w; HT[i].parent=0; HT[i].lchild=0; HT[i