数据结构哈夫曼编码实验报告Word文件下载.docx

上传人:b****5 文档编号:18673004 上传时间:2022-12-31 格式:DOCX 页数:9 大小:123.48KB
下载 相关 举报
数据结构哈夫曼编码实验报告Word文件下载.docx_第1页
第1页 / 共9页
数据结构哈夫曼编码实验报告Word文件下载.docx_第2页
第2页 / 共9页
数据结构哈夫曼编码实验报告Word文件下载.docx_第3页
第3页 / 共9页
数据结构哈夫曼编码实验报告Word文件下载.docx_第4页
第4页 / 共9页
数据结构哈夫曼编码实验报告Word文件下载.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

数据结构哈夫曼编码实验报告Word文件下载.docx

《数据结构哈夫曼编码实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构哈夫曼编码实验报告Word文件下载.docx(9页珍藏版)》请在冰豆网上搜索。

数据结构哈夫曼编码实验报告Word文件下载.docx

{

unsignedcharb;

//记录字符

longcount;

//权重

intparent,lch,rch;

//定义双亲,左孩子,右孩子

charbits[256];

//存放哈夫曼编码的数组

}

header[512],tmp;

//头部一要定设置至少512个,因为结点最多可达256,所有结点数最多可达511

三、算法设计

输入要压缩的文件读文件并计算字符频率根据字符的频率,利用Huffman编码思想创建Huffman树由创建的Huffman树来决定字符对应的编码,进行文件的压缩解码压缩即根据Huffman树进行译码

设计流程图如图1.1所示。

 

图1.1设计流程图

(1)压缩文件

输入一个待压缩的文本文件名称(可带路径)如:

D:

\lu\lu.txt统计文本文件中各字符的个数作为权值,生成哈夫曼树;

将文本文件利用哈夫曼树进行编码,生成压缩文件。

压缩文件名称=文本文件名.COD如:

\lu\lu.COD压缩文件内容=哈夫曼树的核心内容+编码序列

for(inti=0;

i<

256;

i++)

header[i].count=0;

//初始化权重

header[i].b=(unsignedchar)i;

//初始化字符

ifstreaminfile(infilename,ios:

:

in|ios:

binary);

while(infile.peek()!

=EOF)

infile.read((char*)&

temp,sizeof(unsignedchar));

//读入一个字符

header[temp].count++;

//统计对应结点字符权重

flength++;

//统计文件长度

infile.close();

//关闭文件

for(i=0;

256-1;

i++)//对结点进行冒泡排序,权重大的放在上面,编码时效率高

for(intj=0;

j<

256-1-i;

j++)

if(header[j].count<

header[j+1].count)

{

tmp=header[j];

header[j]=header[j+1];

header[j+1]=tmp;

}

if(header[i].count==0)break;

leafnum=i;

//取得哈夫曼树中叶子结点数

pointnum=2*leafnum-1;

//取得哈夫曼树中总结点数目

infile.open(infilename,ios:

//打开待压缩的文件

infile.clear();

infile.seekg(0);

ofstreamoutfile(outfilename,ios:

out|ios:

//打开压缩后将生成的文件

outfile.write((char*)&

flength,sizeof(long));

//写入原文件长度

(2)哈夫曼编码

leafnum;

outfile.write((char*)&

header[i].b,sizeof(unsignedchar));

//写入字符

header[i].count=strlen(header[i].bits);

//不再设置其他变量,权值这时已无使用价值,可以用相应结点的权值变量记录长度

header[i].count,sizeof(unsignedchar));

//写入长度的ASCII码

if(header[i].count%8==0)

bytelen=header[i].count/8;

else

bytelen=header[i].count/8+1;

strcat(header[i].bits,"

0000000"

);

//在编码后面补0,使其最后凑满8的倍数,

//超过无妨,可以用bytelen控制好写入字节的长度

bytelen;

temp=ctoa(header[i].bits);

strcpy(header[i].bits,header[i].bits+8);

cout<

<

"

该文件的哈夫曼的编码为:

endl;

for(i=0;

flength;

header[i].bits<

}//此循环结束后就完成了编码对照表的写入

(3)解压文件

输入一个待解压的压缩文件名称(可带路径)如:

\lu\lu.COD从文件中读出哈夫曼树,并利用哈夫曼树将编码序列解码;

生成(还原)文本文件。

文件文件名称=压缩文件名+"

_new.txt"

如:

\lu\lu_new.txt

while

(1)

while(readlen<

(clength-8)&

&

strlen(buf)<

=256)//读满缓冲区

temp,sizeof(temp));

ctoa(temp,code);

//将字节转为数组

strcat(buf,code);

readlen++;

}//while

while(strlen(buf)>

=256)//处理缓冲区,直到少于256位,再读满它

strlen(buf);

strcpy1(buf1,buf,i+1);

//逐渐增多取,放入buf1,进行匹配

if(strcmp1(buf1,header,n,temp)==1)

writelen++;

strcpy(buf,buf+i+1);

//缓冲区前移

break;

}//for

if(writelen>

=flength)break;

//如果写入达到原文件长度,退出

if(readlen>

=(clength-8)/*编码长度*/||writelen>

//如果写入或者读入编码完毕,退出

}//退出此循环后,还有未解码完成的buf[]

//对buf[]缓冲的善后处理

while(writelen<

flength)

outfile.close();

四、界面设计

程序包含压缩功能,解压功能,输出功能,帮助,终止程序功能。

五、运行测试与分析

(1)运行程序,显示提示,如图1.2所示。

图1.2启动界面

(2)编码操作。

图1.3在D盘中建立一个文本文档,并命名为123.txt

图1.4文件压缩,输出哈弗曼编码界面

图1.5在D盘中生成一个.COD的文档,并且名为12.COD:

(3)解码操作。

根据实验要求输出实验结果。

如图1.4所示。

图1.4数据结果输出界面

(4)显示数据内容

若用户想知道文本输入的内容,可输入“L”,然后界面提示输入文本文件的路径和文件名,完成输入后按回车键,界面会出现文本的内容。

六、实验收获与思考

在完成实验的过程中,使我明白了面向对象与面向对象的差别。

在面向对象过程中,类的设计是至关重要的,类设计好了等于程序就成功了一半,所以这次的课程帮助我复习了这一学期面向对象课程的学习,刚好可以弥补这一学期面向对象学习的不足。

同时,也使我对数据结构与算法的知识有了一定的了解,帮我在大二学习数据结构与算法的课程中奠定了一定的基础,使我以后学习数据结构与算法的时候可以更加轻松。

教师评分:

教师签字:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 机械仪表

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1