霍夫曼编码c语言流程图,发个刚写的霍夫曼编码/解码C程序

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

编码:

#include 

void main(int argc,char **args)

{

FILE *fin,*fout;

short left[511],right[511];

unsigned char c;

long len;

int parent[511],value[511],lr[511];

char code[256][256];

for(long i=0;i<511;i++)

{

parent[i]=-1;

value[i]=0;

lr[i]=-1;

left[i]=-1;

right[i]=-1;

}

for(i=0;i<256;i++)

for(int j=0;j<256;j++)

code[i][j]='\0';

fin=fopen(args[1],"rb");

fout=fopen(args[2],"wb");

fseek(fin,0,SEEK_END);

len=ftell(fin);

rewind(fin);

for(i=0;i

{

c=fgetc(fin);

value[c]++;

}

for(i=256;i<511;i++)

{

int m1,m2;

for(m1=0;m1

if(parent[m1]==-1)

break;

for(int j=0;j

if(value[m1]>value[j]&&parent[j]==-1)

m1=j;

for(m2=0;m2

if(parent[m2]==-1&&m2!=m1)

break;

for(j=0;j

if(value[m2]>value[j]&&j!=m1&&parent[j]==-1)

m2=j;

parent[m1]=i;

parent[m2]=i;

left[i]=m1;

right[i]=m2;

lr[m1]=0;

lr[m2]=1;

value[i]=value[m1]+value[m2];

}

for(i=0;i<256;i++)

{

int pos=i,j=0;

char tempCode[256];

while(lr[pos]!=-1)

{

if(lr[pos]==0)

tempCode[j]='0';

if(lr[pos]==1)

tempCode[j]='1';

j++;

pos=parent[pos];

}

tempCode[j]='\0';

for(int k=j-1;k>=0;k--)

code[i][j-1-k] = tempCode[k];

}

fwrite((char*)&len,4,1,fout);

for(i=256;i<511;i++)

{

fwrite((char*)&left[i],2,1,fout);

fwrite((char*)&right[i],2,1,fout);

}

rewind(fin);

char tempByte=0;

int  posBit=7;

for(i=0;i

{

c=fgetc(fin);

int j=0;

while(code[c][j]!='\0')

{

if(code[c][j]=='1')

tempByte=tempByte|(1<

posBit--;

if(posBit==-1)

{fputc(tempByte,fout);posBit=7;tempByte=0;}

j++;

}

}

if(posBit!=-1)

fputc(tempByte,fout);

fclose(fout);

fclose(fin);

}

解码:

#include 

void main(int argc,char **args)

{

FILE *fin,*fout;

unsigned short pos=510;

long len,l;

unsigned char c;

short left[255],right[255];

fin=fopen(args[1],"rb");

fout=fopen(args[2],"wb");

fseek(fin,0,SEEK_END);

len=ftell(fin)-1024;

rewind(fin);

fread((char*)&l,4,1,fin);

for(long i=0;i<255;i++)

{

fread((char*)&left[i],2,1,fin);

fread((char*)&right[i],2,1,fin);

}

for(i=0;i

{

c=fgetc(fin);

for(int j=7;j>-1;j--)

{

if((c&(1<>j==0) pos=left[pos-256];

if((c&(1<>j==1) pos=right[pos-256];

if(pos<256&&l>0)

{

fputc((char)pos,fout);

l--;

pos=510;

}

}

}

fclose(fin);

fclose(fout);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值