1、实验报告实验课名称:数据结构实验实验名称:文件压缩问题班级:203212学号:姓名:时间:2015-9一、问题描述 哈夫曼编码就是一种常用得数据压缩技术,对数据文件进行哈夫曼编码可大大缩短文件得传输长度,提高信道利用率及传输效率.要求采用哈夫曼编码原理,统计文本文件中字符出现得词频,以词频作为权值,对文件进行哈夫曼编码以达到压缩文件得目得,再用哈夫曼编码进行译码解压缩。二、数据结构设计首先定义一个结构体: uct eunsiged car ; /记录字符long count; /权重inpaent,,c; /定义双亲,左孩子,右孩子har bts26; /存放哈夫曼编码得数组her51,tmp
2、; /头部一要定设置至少51个,因为结点最多可达,所有结点数最多可达511三、算法设计输入要压缩得文件读文件并计算字符频率根据字符得频率,利用Hffman编码思想创建Huffmn树由创建得Huffmn树来决定字符对应得编码,进行文件得压缩解码压缩即根据uffma树进行译码设计流程图如图1、1所示.建立哈夫曼树根据哈夫曼树解码对二进制文件进行解码统计字符,得出统计出字符得权值n根据哈夫曼树编码对编码进行压缩生成哈夫曼树生成对应文件生成二进制文件图1、1 设计流程图(1)压缩文件输入一个待压缩得文本文件名称(可带路径)如:D:lu、txt统计文本文件中各字符得个数作为权值,生成哈夫曼树;将文本文件
3、利用哈夫曼树进行编码,生成压缩文件。压缩文件名称=文本文件名、CO 如:D:ulu、D压缩文件内容=哈夫曼树得核心内容+编码序列fo(it;i256;i+) headri、coun=0; /初始化权重 haeri、b=(unignedchr); /初始化字符fstrmin);whle(in()!=EO) n((char )emp,sizeof(unigd cr); /读入一个字符 herep、ount+; /统计对应结点字符权重 fengt+; /统计文件长度n(); /关闭文件for(i=0;i6-1;i+) /对结点进行冒泡排序,权重大得放在上面,编码时效率高 fo(it j=;j261-
4、i;) i(headej、otheadr1、unt) tp=adej; headrjeaderj+1; edej+tp; for(i=0;i25;i+) if(eae、cont=0) brak;eanm=i; /取得哈夫曼树中叶子结点数pintnumeanm1; /取得哈夫曼树中总结点数目i(in); /打开待压缩得文件i();in(0);srm out); /打开压缩后将生成得文件t((char *)&flegth,size()); /写入原文件长度()哈夫曼编码fr(=;ileafnu;i+) ot(char *)&eaei、,izf(usigned char)); /写入字符 eadi、
5、cont=srl(heeri、b); /不再设置其她变量,权值这时已无使用价值,可以用相应结点得权值变量记录长度 t(har )&eadei、count,sizeo(unsigned cha);/写入长度得ASCI码 if(hei、ount=) ytlen=eader、coun8; ee ytlen=hdri、cout/81; strct(hederi、its,”000”); /在编码后面补,使其最后凑满8得倍数, /超过无妨,可以用bteln控制好写入字节得长度 (in j=;jbyelen;j+) tepoa(headei、bits); ou((har )&t,siof(uige cha)
6、); tpy(headeri、bis,hedri、it8); cou该文件得哈夫曼得编码为:end; for(=0;ileth;i+) couthaderi、bitsfleh) break; /如果写入或者读入编码完毕,退出/退出此循环后,还有未解码完成得buf/对buf缓冲得善后处理whle(rlenflngt) or(=0;strln(uf);+) str1(f1,buf,+1); i(scmp1(buf1,heaer,n,temp)=1) o((cha )emp,sizof(unsigned car); write+; strcpy(bu,buf+i); bek; /orn(); /关闭
7、文件out();四、界面设计 程序包含压缩功能,解压功能,输出功能,帮助,终止程序功能。五、运行测试与分析()运行程序,显示提示,如图1、2所示。图1、2启动界面(2) 编码操作. 图、3在盘中建立一个文本文档,并命名为23、txt图、4文件压缩,输出哈弗曼编码界面图1、5在D盘中生成一个。OD得文档,并且名为12、CD: ()解码操作。根据实验要求输出实验结果。如图、所示。图1、4数据结果输出界面() 显示数据内容 若用户想知道文本输入得内容,可输入“”,然后界面提示输入文本文件得路径与文件名,完成输入后按回车键,界面会出现文本得内容。 六、实验收获与思考在完成实验得过程中,使我明白了面向对象与面向对象得差别.在面向对象过程中,类得设计就是至关重要得,类设计好了等于程序就成功了一半,所以这次得课程帮助我复习了这一学期面向对象课程得学习,刚好可以弥补这一学期面向对象学习得不足。同时,也使我对数据结构与算法得知识有了一定得了解,帮我在大二学习数据结构与算法得课程中奠定了一定得基础,使我以后学习数据结构与算法得时候可以更加轻松.教师评分:教师签字: