哈夫曼编码译码系统.docx
哈夫曼编码译码系统自己用c+写的哈夫曼编码/译码系统,经过反复测试,绝对没问题,请放心使用。 3、哈夫曼编码/译码系统 问题描述 利用哈夫曼编码进行通信,可以压缩通信的数据量,提高传输效率,缩短信息的传输时间,还有一定的保密性。现在要求编写一程序模拟传输过程,实现在发送前将要发送的字符信息进行编码,然后进行发送,接收后将传来的数据进行译码,即将信息还原成发送前的字符信息。 实现提示 在本例中设置发送者和接受者两个功能, 发送者的功能包括: 输入待传送的字符信息; 统计字符信息中出现的字符种类数和各字符出现的次数; 根据字符的种类数和各自出现的次数建立哈夫曼树; 利用以上哈夫曼树求出各字符的哈夫曼编码; 将字符信息转换成对应的编码信息进行传送。 接受者的功能包括: 接收发送者传送来的编码信息; 利用上述哈夫曼树对编码信息进行翻译,即将编码信息还原成发送前的字符信息。 从以上分析可发现,在本例中的主要算法有三个: 哈夫曼树的建立; 哈夫曼编码的生成; 对编码信息的翻译。 测试结果 源代码 #include<iostream.h> #include<iomanip.h> #include<string.h> #include <windows.h> typedef struct int weight; int parent,lchild,rchild; char data; HTNode,*HuffmanTree; typedef char *HuffmanCode; void tongji(char *a,int *w,char *d,int &n) int j=0; for(int i=0;i<100&&ai!='0'i+) for(int k=0;k<j;k+) if(ai=dk) wk+; break; if(k=j) dj=ai; wj+; j+; n=j; dj='0' void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n,char *d) if(n<=1)return; int m=2*n-1; HT=new HTNodem+1; HuffmanTree p; int i; for(p=HT+1,i=1;i<=n;i+,+p) p->data=di-1; p->lchild=p->parent=p->rchild=0; p->weight=wi-1; for(;i<=m;+i,+p) p->lchild=p->parent=p->rchild=0; p->weight=0; for(i=n+1;i<=m;+i) int s1,s2,u,t; for (u=1;u<=i-1;u+)if(HTu.parent=0)s1=u;break; for(u=u+1;u<=i-1;u+) if(HTs1.weight>HTu.weight&&HTu.parent=0) s1=u; for(t=1;t<=i-1;t+) if(HTt.parent=0&&t!=s1)s2=t;break; for(t=t+1;t<=i-1;t+) if(HTs2.weight>HTt.weight&&HTt.parent=0&&t!=s1) s2=t; HTs1.parent=i;HTs2.parent=i; HTi.lchild=s1;HTi.rchild=s2; HTi.weight=HTs1.weight+HTs2.weight; HC=new char*n+1; char *cd=new charn; cdn-1='0' int start,c,f; for(i=1;i<=n;+i) start=n-1; for(c=i,f=HTi.parent;f!=0;c=f,f=HTf.parent) if(HTf.lchild=c) cd-start='0' else cd-start='1' HCi=new charn-start; strcpy(HCi,&cdstart); delete(cd); void bianma(HuffmanCode HC,char *a,char *d,char *bc) int m1=0,m2=0; int i=0,j; while(ai!='0') j=0; while(dj!='0') if (ai=dj) m1=0; while(HCj+1m1!='0') bcm2+=HCj+1m1+; break; j+; i+; bcm2='0' void yima(HuffmanTree HT,int n,char*bc) int m=2*n-1; for (int i=0;bci!='0'+i) if (HTm.lchild=0) cout<<HTm.data; m=2*n-1; if(bci='0') m=HTm.lchild; else m=HTm.rchild; cout<<HTm.data<<endl; void main char a100; char d100;char bc1000; int w100,n=0; HuffmanTree HT; HuffmanCode HC; cout<<"请输入字符:n" cin>>a; for(int ak=0;ak<100;ak+)wak=0; tongji(a,w,d,n); HuffmanCoding(HT,HC,w,n,d); cout<<"霍夫曼编码为:"<<endl; cout<<"原码 "<<"权值 "<<"二进制码"<<endl; for(int s=0;s<n;s+)cout<<ds<<" "<<ws<<" "<<HCs+1<<endl; bianma(HC,a,d,bc); cout<<"密文为:" cout<<bc<<endl; cout<<"开始译码:"<<endl; yima(HT,n,bc);