1、search(k,j,p) 搜索二叉树 6:Print_tree() 打印二叉树 7:menu() 主菜单 9:main() 主函数4、实验结果与分析(1)大致个人测试案例:主界面:初始化:Huofuman.txt初始化存入文件结果如下:编码结果如下:codefile.txt编码存入文件如下:译码结果如下:textfile.txt译码存入文件如下:打印结果如下:打印树结果如下:treeprint.txt存入文件结果如下:(2)本例测试案例_1 已知某系统在通信联络中只可能出现八种字符,其频率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计哈夫曼编码。
2、解: 假设八种字符为ABCDEFGH,将各个概率乘以100可得权值为5 29 7 8 14 23 3 11启动程序,测试得:编码:译码打印结束:(3)本例测试案例_2用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAME IS MY FAVORITE”。字符ABCDEFGHIJKLM频度18864132232103211547571520NOPQRSTUVWXYZ634851802381816 先假设空格为#,所以输入字符时,将空格变为#。输入如下:先将从空格到Z输入权值然后对字符进行编码:空格到Z译码然后输入字符串并编码:保存到Codef
3、ile.txt中然后将开始译码并结束将译码结果保存到Textfile.txt中5、实验总结 从这个课程设计中,我发现了很多问题,包括文件存储,字符串输入等等,最主要的是经历了一次找BUG的过程,当把自己写的代码里的错误一个一个找出来时,是非常非常兴奋的。还是希望能有多这个经历。不喜欢copy,如果copy了,就缺少了一次挑战自己的经历。六、主要代码/ Huffman_2.cpp : Defines the entry point for the console application./#include stdafx.h#include stdlib.hstring.hmath.h#defin
4、e maxsize 1000#define len 20#define rowsize 20/-初始化-/struct int parent; int lchild,rchild; int weight;HFM_treemaxsize; char hfstr;HFM_nummaxsize; int start; int bitlen;HFM_hf;struct char hfch; int length;HFM_codemaxsize;int leaves;void Initialization() int i,j; FILE* HFM_f; HFM_f = fopen(HuofumanTre
5、e.txt,w); if(HFM_f = NULL) printf(create file error!n printf( 请输入字符集大小: scanf(%d,&leaves); fprintf(HFM_f,-输入的值-n 字符大小%4dn,leaves); 字符 权值n for(i=0;ileaves;i+) 请输入第%d个字符和其权值:,i+1); scanf( %c HFM_numi.hfstr);HFM_numi.weight); fprintf(HFM_f,%4c,HFM_numi.hfstr);%4dn,HFM_numi.weight); /存储字符和权值 /-建立哈夫曼树-/m
6、axsize;i+) /哈夫曼树初始化 HFM_treei.parent = -1; HFM_treei.lchild = -1; HFM_treei.rchild = -1; HFM_treei.weight = 0; HFM_treei.weight = HFM_numi.weight;leaves-1; int m1,m2; int m1_pos,m2_pos; m1=m2=65536; m1_pos=m2_pos=0; for(j=0;jleaves+i;j+) if(HFM_treej.weightm1&HFM_treej.parent = -1) m2 = m1; m1 = HFM
7、_treej.weight; m2_pos = m1_pos; m1_pos = j; else if(HFM_treej.weightm2& m2 = HFM_treej.weight; m2_pos = j; HFM_treeleaves+i.parent = -1; HFM_treeleaves+i.lchild = m1_pos; HFM_treeleaves+i.rchild = m2_pos; HFM_treem1_pos.parent = leaves+i; HFM_treem2_pos.parent = leaves+i; HFM_treeleaves+i.weight = m
8、2+m1; /-输出哈夫曼树-/ -哈夫曼编码-n parent lchild rchild weightn-哈夫曼编码-nleaves*2-1; %8d%8d%8d%8dn,HFM_treei.parent,HFM_treei.lchild,HFM_treei.rchild,HFM_treei.weight);%8d%8d%8d%8dn fclose(HFM_f);/-编码-/void Encoding() int i,j,p,c,k; FILE* HFM_f = fopen(CodeFile.txtopen file error! c = i; p = HFM_treei.parent;
9、HFM_hf.start = len-1; while(p!=-1) if(HFM_treep.lchild = c) HFM_hf.bitHFM_hf.start = 0; HFM_hf.bitHFM_hf.start = 1; -HFM_hf.start; c = p; p = HFM_treec.parent; for(j=HFM_hf.start+1,k=0;len;j+,k+) HFM_codei.bitk = HFM_hf.bitj; HFM_codei.length = len-HFM_hf.start-1; HFM_codei.start = HFM_hf.start+1; H
10、FM_codei.hfch = HFM_numi.hfstr; character:%c start:%d length:%d Code:,HFM_codei.hfch,HFM_codei.start,HFM_codei.length);HFM_codei.length; printf(,HFM_codei.bitj); fprintf(HFM_f,/-译码-/void Decoding() char amaxsize; char HFM_dcmaxsize; int i,j,k,p;Textfile.txt FILE* hf = fopen(r if(HFM_f=NULL) fscanf(h
11、f,%s,a); j=0;p=0; k = 2*leaves-2; while(HFM_treek.lchild!=-1 & HFM_treek.rchild! if(aj=0) k = HFM_treek.lchild;1 k = HFM_treek.rchild; j+; HFM_dcp = HFM_codek.hfch; p+;p; if(HFM_dci = #) HFM_dci = ;%c,HFM_dci); fclose(hf);/-打印代码文件-/void Print_file() FILE* hc = fopen(CodePrint.txt char strmaxsize; in
12、t s,i;,str); s = strlen(str);s;,stri); fprintf(hc, if(i+1)%50=0) fprintf(hc, fclose(hc);/-打印哈夫曼树-/int fprowsizerowsize;int f=5;void search(int k,int j,int p) int c; int d; int b; if(HFM_treek.lchild! c=HFM_treek.lchild; d=j+1; b=p-2; if(fpdb) b=b+1; fpdb=HFM_treec.weight; search(c,d,b); if(HFM_treek
13、.rchild! c=HFM_treek.rchild; b=p+2; b=b-1;void Print_tree() int i,j,k,s,p,c;TreePrint.txtfile open error! memset(fp,0,sizeof(fp); fp010 = HFM_treeleaves*2-2.weight; search(leaves*2-2,0,10); p =(int)log(leaves*2-1)/log(2)+1;p+2;rowsize; if(fpij=0) printf( fprintf(HFM_f,%3d,fpij);nn/-输入字符串-/void input
14、code()please input your character stringn char hfman_strmaxsize; int i,j,k,s; FILE* fp = fopen( if(fp = NULL) getchar(); gets(hfman_str); k=strlen(hfman_str);k; if(hfman_stri = for(j=0;HFM_code0.length;,HFM_code0.bitj); fprintf(fp, else s=hfman_stri-A+1;HFM_codes.length;,HFM_codes.bitj); fclose(fp);
15、/-将字符译码-/void reoutstr() Decoding();/-主界面-/void menu()*班级:10电信实验班 学号:Q10600132 姓名:王彬彬*nn *哈夫曼编码和译码*nn *n *1:初始化- I*n *2:编码- E*n *3:译码- D*n *4:打印代码文件- P*n *5:打印哈夫曼树- T*n *6:输入字符串并编码- C*n *8:输入译码- Y*n *nn/-主函数-/int main() char choice; menu(); while(choice!=Q please input your choice here: %cchoice); switch(choice) case I:i Initialization(); /初始化 break;Ee Encoding(); /编码Cc inputcode(); /输入字符串Yy reoutstr();Dd Decoding(); /译码Pp Print_file(); /打印代码文件Tt Print_tree(); /打印哈夫曼树qn *n * 程序终止! */停止n *nn default:input errorn system(pause return 0;成绩评定表平时成绩答辩成绩最终成绩
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1