哈夫曼编码算法实现完整版Word文件下载.docx

上传人:b****5 文档编号:18701354 上传时间:2022-12-31 格式:DOCX 页数:9 大小:50.98KB
下载 相关 举报
哈夫曼编码算法实现完整版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

=m;

j++)

{inttag1,tag2,s1,s2;

tag1=tag2=32767;

for(intx=1;

x<

=j-1;

x++)

{if(p[x].parent==0&

&

p[x].weight<

tag1)

{tag1=p[x].weight;

s1=x;

}

for(inty=1;

y<

y++)

{if(p[y].parent==0&

y!

=s1&

p[y].weight<

tag2)

{tag2=p[y].weight;

s2=y;

if(s1>

s2)//将选出的两个节点中的序号较小的始终赋给s1

{tmp=s1;

s1=s2;

s2=tmp;

p[s1].parent=j;

p[s2].parent=j;

p[j].lchild=s1;

p[j].rchild=s2;

p[j].weight=p[s1].weight+p[s2].weight;

voidHuffmanCoding(HuffmanTree&

HT,intn,char*w1,int*w2)

{

intm=2*n-1;

if(n<

=1)return;

HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));

HuffmanTreep=HT;

for(inti=1;

i<

=n;

i++)

{p[i].data=w1[i-1];

p[i].weight=w2[i];

p[i].parent=p[i].lchild=p[i].rchild=0;

for(;

{p[i].weight=p[i].parent=p[i].lchild=p[i].rchild=0;

}

Select(HT,n,m);

ofstreamoutfile;

//生成hfmTree文件

outfile.open("

hfmTree.txt"

ios:

:

out);

for(i=1;

{outfile<

<

HT[i].weight<

"

\t"

HT[i].parent<

HT[i].lchild

HT[i].rchild<

endl;

outfile.close();

cout<

初始化结果已保存在hfmTree文件中\n"

;

voidToBeTree()//将正文写入文件ToBeTree中

ToBeTree.txt"

outfile<

THISPROGRAMISMYFAVORITE"

voidEncoding(HuffmanTree&

HT,intn)//编码

HuffmanCodeHC;

HC=(HuffmanCode)malloc((n+1)*sizeof(char*));

char*cd;

cd=(char*)malloc(n*sizeof(char));

cd[n-1]='

\0'

for(intk=1;

k<

k++)

{intstart=n-1;

for(intc=k,f=HT[k].parent;

f!

=0;

c=f,f=HT[f].parent)

{if(HT[f].lchild==c)cd[--start]='

0'

elsecd[--start]='

1'

HC[k]=(char*)malloc((n-start)*sizeof(char));

strcpy(HC[k],&

cd[start]);

输出哈夫曼编码:

for(inth=1;

h<

h++)//输出编码

{cout<

HT[h].data<

HC[h];

"

if(h%8==0)cout<

endl<

输出正文编码:

ToBeTree();

//读取TOBETREE文件里的正文,并进行编码

fstreaminfile;

infile.open("

in);

chars[80];

while(!

infile.eof())

{infile.getline(s,sizeof(s));

infile.close();

fstreamoutfile;

CodeFile.txt"

intcount=0;

for(h=0;

s[h]!

='

h++)

{for(k=1;

if(s[h]==HT[k].data)

HC[k];

count++;

break;

if(count%9==0)cout<

//每输出7个换行

\n编码结果已保存在文件CodeFile中."

voidDecoding(HuffmanTree&

HT,intn)//译码

intf=2*n-1;

chars[1000];

inti=0;

intj=0;

TextFile.txt"

while(s[i]!

{f=2*n-1;

while(HT[f].lchild!

=0)//以f对应的节点的左孩子的值==0作为结束

{if(s[j]=='

)f=HT[f].lchild;

elsef=HT[f].rchild;

j++;

i=j;

HT[f].data;

\n译码结果已保存在文件TextFile中."

voidPrint()//印代码文件

{intcount=0;

for(inti=0;

s[i]!

s[i];

if(count%50==0)cout<

//在终端上每行显示50个代码

charmenu()//菜单函数

功能菜单如下:

*********************"

I:

初始化(Initialization)"

E:

编码(Encoding)"

D:

译码(Decoding)"

P:

印代码文件(Print)"

Q:

退出(Exit)"

请输入功能字符:

charch;

cin>

>

ch;

returnch;

voidmain()

{intn;

intArray[100];

charcArray[100];

HuffmanTreeHT;

输入n个字符:

cin.getline(cArray,100);

n=strlen(cArray);

一共"

n<

个字符.\n"

依次输入各个字符的权值:

for(inti=1;

i++)cin>

Array[i];

inttag;

charx=menu();

while

(1)

{switch(x)

case'

I'

HuffmanCoding(HT,n,cArray,Array);

E'

Encoding(HT,n);

D'

Decoding(HT,n);

P'

Print();

Q'

tag=0;

结束"

default:

你输入错误!

if(tag==0)break;

y(继续)orn(退出)"

if(ch=='

y'

charc;

c;

x=c;

elseexit

(1);

测试数据:

用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的译码和编码:

THISPROGRAMISMYFAVORITE"

.

字符空格ABCDEFGHIJKLM

频度1866413223210321154757153220

字符NOPQRSTUVWXYZ

频度5763151485180238181161

四.测试结果:

如图一所示

五.实验体会

通过本次实验,尤其在自己对程序的调试过程中,感觉对树的存储结构,终结状态,还有编码,译码的过程都有了比较清晰的认识。

在做本次实验时,其他的都没什么问题,以前很少进行文件操作,刚开始有点手生,但是在实验作完后,文件操作已经用的比较熟练了。

最近几次实验,感到自己对本题实验的运行机理和过程掌握的最为透彻。

收获不小。

在实验过程中,遇到的一个主要问题是在C++里面输入单个空格字符的问题。

最终通过用cin.getline()来解决,但是还不是很理想。

为了察看方便,把有些文件的内容直接显示在终端上了,没有列出生成的文件里的结果。

 

图一

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

当前位置:首页 > 党团工作 > 其它

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

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