完整word版C语言哈夫曼编码译码器.docx

上传人:b****8 文档编号:28142059 上传时间:2023-07-08 格式:DOCX 页数:21 大小:18.37KB
下载 相关 举报
完整word版C语言哈夫曼编码译码器.docx_第1页
第1页 / 共21页
完整word版C语言哈夫曼编码译码器.docx_第2页
第2页 / 共21页
完整word版C语言哈夫曼编码译码器.docx_第3页
第3页 / 共21页
完整word版C语言哈夫曼编码译码器.docx_第4页
第4页 / 共21页
完整word版C语言哈夫曼编码译码器.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

完整word版C语言哈夫曼编码译码器.docx

《完整word版C语言哈夫曼编码译码器.docx》由会员分享,可在线阅读,更多相关《完整word版C语言哈夫曼编码译码器.docx(21页珍藏版)》请在冰豆网上搜索。

完整word版C语言哈夫曼编码译码器.docx

完整word版C语言哈夫曼编码译码器

#include

#include

#include

#include

#include

//typedefintTElemType;

constintUINT_MAX=1000;

typedefstruct

{

intweight;

intparent,lchild,rchild;

}HTNode,*HuffmanTree;

typedefchar**HuffmanCode;

//-----------全局变量-----------------------

HuffmanTreeHT;

HuffmanCodeHC;

int*w,i,j,n;

char*z;

intflag=0;

intnumb=0;

//-----------------求赫夫曼编码-----------------------

intmin(HuffmanTreet,inti)

{

//函数voidselect()调用

intj,flag;

intk=UINT_MAX;//取k为不小于可能的值

for(j=1;j<=i;j++)

if(t[j].weight

k=t[j].weight,flag=j;

t[flag].parent=1;

returnflag;

}

//--------------------slect函数----------------------

voidselect(HuffmanTreet,inti,int&s1,int&s2)

{

//s1为最小的两个值中序号小的那个

intj;

s1=min(t,i);

s2=min(t,i);

if(s1>s2)

{

j=s1;

s1=s2;

s2=j;

}

}

//--------------算法6.12--------------------------

voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,intn)

{

//w存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC

intm,i,s1,s2,start;

//unsignedc,f;

intc,f;

HuffmanTreep;

char*cd;

if(n<=1)

return;

//检测结点数是否可以构成树

m=2*n-1;

HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//0号单元未用

for(p=HT+1,i=1;i<=n;++i,++p,++w)

{

p->weight=*w;

p->parent=0;

p->lchild=0;

p->rchild=0;

}

for(;i<=m;++i,++p)

p->parent=0;

for(i=n+1;i<=m;++i)

//建赫夫曼树

{

//在HT[1~i-1]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2

select(HT,i-1,s1,s2);

HT[s1].parent=HT[s2].parent=i;

HT[i].lchild=s1;

HT[i].rchild=s2;

HT[i].weight=HT[s1].weight+HT[s2].weight;

}

//从叶子到根逆向求每个字符的赫夫曼编码

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

//分配n个字符编码的头指针向量([0]不用)

cd=(char*)malloc(n*sizeof(char));//分配求编码的工作空间

cd[n-1]='\0';//编码结束符

for(i=1;i<=n;i++)

{

//逐个字符求赫夫曼编码

start=n-1;//编码结束符位置

for(c=i,f=HT[i].parent;f!

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

//从叶子到根逆向求编码

if(HT[f].lchild==c)

cd[--start]='0';

else

cd[--start]='1';

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

//为第i个字符编码分配空间

strcpy(HC[i],&cd[start]);//从cd复制编码(串)到HC

}

free(cd);//释放工作空间

}

//--------------初始化赫夫曼链表---------------------------------

voidInitialization()

{

flag=1;

intnum;

intnum2;

cout<<"下面初始化赫夫曼链表"<

";

cin>>num;

n=num;

w=(int*)malloc(n*sizeof(int));

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

cout<<"\n请依次输入"<

必须以回车结束:

"<<

endl;

charbase[2];

for(i=0;i

{

cout<<"第"<

"<

gets(base);

*(z+i)=*base;

}

for(i=0;i<=n-1;i++)

{

cout<

}

cout<<"\n请依次输入"<

必须以回车结束):

"<

for(i=0;i<=n-1;i++)

{

cout<

";

cin>>num2;

*(w+i)=num2;

}

HuffmanCoding(HT,HC,w,n);

//------------------------打印编码-------------------------------------------

cout<<"字符对应的编码为:

"<

for(i=1;i<=n;i++)

{

//cout<<"字符"<<*(z+i-1)<<"的编码";

puts(HC[i]);

}

//--------------------------将赫夫曼编码写入文件------------------------

cout<<"下面将赫夫曼编码写入文件"<

FILE*htmTree;

charr[]=

{

'','\0'

};

if((htmTree=fopen("htmTree.txt","w"))==NULL)

{

cout<<"cannotopenfile"<

return;

}

fputs(z,htmTree);

for(i=0;i

{

fprintf(htmTree,"%6d",*(w+i));

fputs(r,htmTree);

}

for(i=1;i<=n;i++)

{

fputs(HC[i],htmTree);

fputs(r,htmTree);

}

fclose(htmTree);

cout<<"已将字符与对应编码写入根目录下文件htmTree.txt中"<

}

//---------------------获取报文并写入文件---------------------------------

voidInputCode()

{

//cout<<"请输入你想要编码的字符"<

FILE*tobetran;

charstr[100];

if((tobetran=fopen("tobetran.txt","w"))==NULL)

{

cout<<"不能打开文件"<

return;

}

cout<<"请输入你想要编码的字符"<

gets(str);

fputs(str,tobetran);

cout<<"获取报文成功"<

fclose(tobetran);

}

//---------------------编码函数---------------------------------

voidEncoding()

{

cout<<"下面对目录下文件tobetran.txt中的字符进行编码"<

FILE*tobetran,*codefile;

if((tobetran=fopen("tobetran.txt","rb"))==NULL)

{

cout<<"不能打开文件"<

}

if((codefile=fopen("codefile.txt","wb"))==NULL)

{

cout<<"不能打开文件"<

}

char*tran;

i=99;

tran=(char*)malloc(100*sizeof(char));

while(i==99)

{

if(fgets(tran,100,tobetran)==NULL)

{

cout<<"不能打开文件"<

break;

}

for(i=0;*(tran+i)!

='\0';i++)

{

for(j=0;j<=n;j++)

{

if(*(z+j-1)==*(tran+i))

{

fputs(HC[j],codefile);

if(j>n)

{

cout<<"字符错误,无法编码!

"<

break;

}

}

}

}

}

cout<<"编码工作完成"<

endl;

fclose(tobetran);

fclose(codefile);

free(tran);

}

//-----------------译码函数---------------------------------

voidDecoding()

{

cout<<"下面对根目录下文件codefile.txt中的字符进行译码"<

FILE*codef,*txtfile;

if((txtfile=fopen("Textfile.txt","w"))==NULL)

{

cout<<"不能打开文件"<

}

//txtfile=fopen("Textfile.txt","w");

if((codef=fopen("codefile.txt","r"))==NULL)

{

cout<<"不能打开文件"<

}

//codef=fopen("codefile.txt","r");

char*work,*work2,i2;

inti4=0,i,i3;

unsignedlonglength=10000;

work=(char*)malloc(length*sizeof(char));

fgets(work,length,codef);

work2=(char*)malloc(length*sizeof(char));

i3=2*n-1;

for(i=0;*(work+i-1)!

='\0';i++)

{

i2=*(work+i);

if(HT[i3].lchild==0)

{

*(work2+i4)=*(z+i3-1);

i4++;

i3=2*n-1;

i--;

}

elseif(i2=='0')

i3=HT[i3].lchild;

elseif(i2=='1')

i3=HT[i3].rchild;

}

*(work2+i4)='\0';

fputs(work2,txtfile);

cout<<"译码完成"<

<

cout<

free(work);

free(work2);

fclose(txtfile);

fclose(codef);

}

//------------------------打印赫夫曼树的函数-----------------------

voidcoprint(HuffmanTreestart,HuffmanTreeHT)

{

if(start!

=HT)

{

FILE*TreePrint;

if((TreePrint=fopen("TreePrint.txt","a"))==NULL)

{

cout<<"创建文件失败"<

return;

}

numb++;//该变量为已被声明为全局变量

coprint(HT+start->rchild,HT);

cout<weight<

fprintf(TreePrint,"%d\n",start->weight);

coprint(HT+start->lchild,HT);

numb--;

fclose(TreePrint);

}

}

voidTree_printing(HuffmanTreeHT,intw)

{

HuffmanTreep;

p=HT+w;

cout<<"下面打印赫夫曼树"<

coprint(p,HT);

cout<<"打印工作结束"<

}

//------------------------主函数------------------------------------

voidmain()

{

charchoice;

while(choice!

='q')

{

cout<<"赫夫曼编码解码系统"<

cout<<"1.要初始化赫夫曼链表请输入'i'"<

cout<<"2.要编码请输入'e'"<

cout<<"3.要译码请输入'd'"<

cout<<"4.要打印编码请输入'p'"<

cout<<"5.要打印赫夫曼树请输入't'"<

cout<<"6.要离开请输入'q'"<

//if(flag==0)cout<<"\n请先初始化赫夫曼链表,输入'i'"<

cin>>choice;

switch(choice)

{

case'i':

Initialization();

break;

case'w':

InputCode();

break;

case'e':

Encoding();

break;

case'd':

Decoding();

break;

case't':

Tree_printing(HT,2*n-1);

break;

case'q':

default:

cout<<"inputerror"<

}

}

free(z);

free(w);

free(HT);

}

运行结果:

赫夫曼编码解码系统

1.要初始化赫夫曼链表请输入'i'

2.要编码请输入'e'

3.要译码请输入'd'

4.要打印编码请输入'p'

5.要打印赫夫曼树请输入't'

6.要离开请输入'q'

i

下面初始化赫夫曼链表

数请输入结点的个n:

8

请依次输入8个字符(字符型)

注意:

必须以回车结束:

第1个字符:

a

第2个字符:

b

第3个字符:

c

第4个字符:

d

第5个字符:

e

第6个字符:

f

第7个字符:

g

第8个字符:

h

abcdefgh

请依次输入8个权值(

注意:

必须以回车结束):

第1个字符的权值:

5

第2个字符的权值:

29

第3个字符的权值:

7

第4个字符的权值:

8

第5个字符的权值:

14

第6个字符的权值:

23

第7个字符的权值:

3

第8个字符的权值:

11

字符对应的编码为:

0110

10

1110

1111

110

00

0111

010

下面将赫夫曼编码写入文件

....................

已将字符与对应编码写入根目录下文件htmTree.txt中

赫夫曼编码解码系统

1.要初始化赫夫曼链表请输入'i'

2.要编码请输入'e'

3.要译码请输入'd'

4.要打印编码请输入'p'

5.要打印赫夫曼树请输入't'

6.要离开请输入'q'

i

下面初始化赫夫曼链表

数请输入结点的个n:

27

请依次输入27个字符(字符型)

注意:

必须以回车结束:

第1个字符:

第2个字符:

a

第3个字符:

b

第4个字符:

c

第5个字符:

d

第6个字符:

e

第7个字符:

f

第8个字符:

g

第9个字符:

h

第10个字符:

i

第11个字符:

j

第12个字符:

k

第13个字符:

l

第14个字符:

m

第15个字符:

n

第16个字符:

o

第17个字符:

p

第18个字符:

q

第19个字符:

r

第20个字符:

s

第21个字符:

t

第22个字符:

u

第23个字符:

v

第24个字符:

w

第25个字符:

x

第26个字符:

y

第27个字符:

z

abcdefg

mnopqrst

z

请依次输入27个权值(

注意:

必须以回车结束):

第1个字符的权值:

186

第2个字符的权值:

64

第3个字符的权值:

13

第4个字符的权值:

22

第5个字符的权值:

32

第6个字符的权值:

103

第7个字符的权值:

21

第8个字符的权值:

15

第9个字符的权值:

47

第10个字符的权值:

57

第11个字符的权值:

1

第12个字符的权值:

5

第13个字符的权值:

32

第14个字符的权值:

20

第15个字符的权值:

57

第16个字符的权值:

63

第17个字符的权值:

15

第18个字符的权值:

1

第19个字符的权值:

48

第20个字符的权值:

51

第21个字符的权值:

80

第22个字符的权值:

23

第23个字符的权值:

8

第24个字符的权值:

18

第25个字符的权值:

1

第26个字符的权值:

16

第27个字符的权值:

1

字符对应的编码为:

110

1010

100100

00010

10110

010

111110

100101

0000

0110

1111011100

11110110

10111

111111

0111

1000

100110

1111011101

0010

0011

1110

00011

1111010

111100

1111011110

100111

1111011111

下面将赫夫曼编码写入文件

....................

已将字符与对应编码写入根目录下文件htmTree.txt中

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

当前位置:首页 > 小学教育 > 数学

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

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