哈夫曼编码与译码附源码Word下载.docx
- 文档编号:14831147
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:30
- 大小:386.92KB
哈夫曼编码与译码附源码Word下载.docx
《哈夫曼编码与译码附源码Word下载.docx》由会员分享,可在线阅读,更多相关《哈夫曼编码与译码附源码Word下载.docx(30页珍藏版)》请在冰豆网上搜索。
操作4:
对文章进行译码,显示并保存。
操作5:
对文件进行压缩,每7位二进制序列对应一个ASCII码。
操作6:
对文件进行解压缩。
(2)流程图
2.哈夫曼编码信息
3.文件编码
(1)显示文件编码
(2)保存文件编码
4.文件译码
(1)显示文章编码的译码
(2)保存文章编码的译码
5.文件压缩
6.文件解压缩
附:
程序源代码
/*
*File:
HUFFMANFUNCTION.h
*Author:
Administrator
*
*Createdon2011年12月19日,下午6:
19
*/
#ifndefHUFFMANFUNCTION_H
#defineHUFFMANFUNCTION_H
#include<
cstdlib>
#include<
iostream>
fstream>
math.h>
#definemax1150
#definemax250
#definemax3256
usingnamespacestd;
classHtnote{
public:
charname;
//字符名
doubleweight;
//权重
intlchild;
//左孩子
intrchild;
//右孩子
intparent;
//父亲
Htnote(){
weight=0;
lchild=-1;
parent=-1;
rchild=-1;
}
};
className{
intnum;
//字符出现的次数
charpname;
doublelweight;
//权值
Name(){
num=0;
lweight=0;
classGetName{
charnamef[max2];
intn;
//字符的种类
intsum;
//字符的总数
Nameletter[max1];
//存储字符信息的类的数组
GetName(){
sum=0;
n=0;
voidGetWeight()//得到字符的权值
{
for(inti=0;
i<
n;
i++){
letter[i].lweight=(double)letter[i].num/sum;
//出现的次数除总数得到权值
intReadLetter(){
ifstreaminput;
cout<
<
"
请输入文件名:
<
endl;
cin>
>
namef;
input.open(namef);
//打开文件
if(input.fail()){
该文件不存在!
"
return0;
charch;
ch=input.get();
letter[0].pname=ch;
letter[0].num++;
sum++;
while(!
input.eof()){//读取文件中的所有字符
inttag=0;
n+1;
if(letter[i].pname==ch){
letter[i].num++;
tag=1;
if(tag==0){
n++;
letter[n].pname=ch;
letter[n].num++;
sum--;
input.close();
GetWeight();
//得到字符权值
classCodeNode//编码类
{
//存储字符
charbits[max1];
//存储编码
classFunction{
GetNameL;
intfn;
//定义哈夫曼数组大小
HtnoteHuffmanT[max3];
//哈夫曼数组
CodeNodeCode[max1];
//字符编码数组
Function(){
fn=0;
voidCharHuffmanTCoding()//编码功能实现
inti,f,c;
charcd[L.n+1];
//暂时存储编码的数组
intstart;
//编码读取起始位置
cd[L.n]='
\0'
;
for(i=0;
L.n;
Code[i].ch=HuffmanT[i].name;
//字符信息
start=L.n;
//起始位置
c=i;
while((f=HuffmanT[c].parent)>
=0){
if(HuffmanT[f].lchild==c)//如果为左孩子,为‘0’
cd[--start]='
0'
}else//如果为右孩子,为‘1’
1'
c=f;
strcpy(Code[i].bits,&
cd[start]);
//将结果存入对应的编码数组中
voidOutputHuffmanTCode(){
哈夫曼编码:
——————————————————————"
字符\t权值\t\t哈夫曼编码"
i++)//输出字符,权值,哈夫曼编码
HuffmanT[i].name<
\t"
HuffmanT[i].weight<
Code[i].bits;
voidInitHT()//哈夫曼初始化
L.ReadLetter();
fn=(L.n)*2-1;
fn;
if(i<
L.n){
HuffmanT[i].name=L.letter[i].pname;
HuffmanT[i].weight=L.letter[i].lweight;
voidSelectMin(intm,int&
p1,int&
p2)//选择最小的两个节点
inti,j;
doublem1,m2;
m1=m2=1;
p1=p2=-1;
m;
if(HuffmanT[i].parent==-1&
&
m1)//找出为访问过的最小权值节点
m2=m1;
p2=p1;
m1=HuffmanT[i].weight;
p1=i;
}elseif(HuffmanT[i].parent==-1&
m2)//找出为访问的权值第二小结点
m2=HuffmanT[i].weight;
p2=i;
voidCreatHT()//建立哈夫曼树
inti,p1,p2;
InitHT();
for(i=L.n;
SelectMin(i,p1,p2);
HuffmanT[p1].parent=HuffmanT[p2].parent=i;
HuffmanT[i].lchild=p1;
HuffmanT[i].rchild=p2;
HuffmanT[i].weight=HuffmanT[p1].weight+HuffmanT[p2].weight;
intOutArticleCode()//显示文章编码
{//文章编码操作
input.open(L.namef);
文件不存在!
文章编码如下:
input.eof()){
if(Code[i].ch==ch)
intSaveArticleCode()//保存文章编码
ofstreamoutput;
charnamef1[max2];
请输入保存文章编码的文件名:
namef1;
output.open(namef1);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼 编码 译码 源码