當前位置:編程學習大全網 - 源碼下載 - 用哈夫曼樹算法設計對文件文件的壓縮和解壓縮的程序怎麽寫?

用哈夫曼樹算法設計對文件文件的壓縮和解壓縮的程序怎麽寫?

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <conio.h>

struct head

{

unsigned char b; /*the charactor*/

long count; /*the frequency*/

long parent,lch,rch; /*make a tree*/

char bits[256]; /*the haffuman code*/

}

header[512],tmp;

void compress()

{

char filename[255],outputfile[255],buf[512];

unsigned char c;

long i,j,m,n,f;

long min1,pt1,flength;

FILE *ifp,*ofp;

printf("source filename:");

gets(filename);

ifp=fopen(filename,"rb");

if(ifp==NULL)

{

printf("source file open error!\n");

return;

}

printf("destination filename:");

gets(outputfile);

ofp=fopen(outputfile,"wb");

if(ofp==NULL)

{

printf("destination file open error!\n");

return;

}

flength=0;

while(!feof(ifp))

{

fread(&c,1,1,ifp);

header[c].count++;

flength++;

}

flength--;

header[c].count--;

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

{

if(header[i].count!=0) header[i].b=(unsigned char)i;

else header[i].b=0;

header[i].parent=-1;

header[i].lch=header[i].rch=-1;

}

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

{

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

{

if(header[i].count<header[j].count)

{

tmp=header[i];

header[i]=header[j];

header[j]=tmp;

}

}

}

for(i=0;i<256;i++) if(header[i].count==0) break;

n=i;

m=2*n-1;

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

{

min1=999999999;

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

{

if(header[j].parent!=-1) continue;

if(min1>header[j].count)

{

pt1=j;

min1=header[j].count;

continue;

}

}

header[i].count=header[pt1].count;

header[pt1].parent=i;

header[i].lch=pt1;

min1=999999999;

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

{

if(header[j].parent!=-1) continue;

if(min1>header[j].count)

{

pt1=j;

min1=header[j].count;

continue;

}

}

header[i].count+=header[pt1].count;

header[i].rch=pt1;

header[pt1].parent=i;

}

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

{

f=i;

header[i].bits[0]=0;

while(header[f].parent!=-1)

{

j=f;

f=header[f].parent;

if(header[f].lch==j)

{

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

memmove(header[i].bits+1,header[i].bits,j+1);

header[i].bits[0]='0';

}

else

{

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

memmove(header[i].bits+1,header[i].bits,j+1);

header[i].bits[0]='1';

}

}

}

fseek(ifp,0,SEEK_SET);

fwrite(&flength,sizeof(int),1,ofp);

fseek(ofp,8,SEEK_SET);

buf[0]=0;

f=0;

pt1=8;

while(!feof(ifp))

{

c=fgetc(ifp);

f++;

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

{

if(c==header[i].b) break;

}

strcat(buf,header[i].bits);

j=strlen(buf);

c=0;

while(j>=8)

{

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

{

if(buf[i]=='1') c=(c<<1)|1;

else c=c<<1;

}

fwrite(&c,1,1,ofp);

pt1++;

strcpy(buf,buf+8);

j=strlen(buf);

}

if(f==flength) break;

}

if(j>0)

{

strcat(buf,"00000000");

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

{

if(buf[i]=='1') c=(c<<1)|1;

else c=c<<1;

}

fwrite(&c,1,1,ofp);

pt1++;

}

fseek(ofp,4,SEEK_SET);

fwrite(&pt1,sizeof(long),1,ofp);

fseek(ofp,pt1,SEEK_SET);

fwrite(&n,sizeof(long),1,ofp);

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

{

fwrite(&(header[i].b),1,1,ofp);

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

fwrite(&c,1,1,ofp);

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

if(j%8!=0)

{

for(f=j%8;f<8;f++)

strcat(header[i].bits,"0");

}

while(header[i].bits[0]!=0)

{

c=0;

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

{

if(header[i].bits[j]=='1') c=(c<<1)|1;

else c=c<<1;

}

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

fwrite(&c,1,1,ofp);

}

}

fclose(ifp);

fclose(ofp);

printf("compress successfully!\n");

return;

}

void uncompress()

{

char filename[255],outputfile[255],buf[255],bx[255];

unsigned char c;

long i,j,m,n,f,p,l;

long flength;

FILE *ifp,*ofp;

printf("source filename:");

gets(filename);

ifp=fopen(filename,"rb");

if(ifp==NULL)

{

printf("source file open error!\n");

return;

}

printf("destination filename:");

gets(outputfile);

ofp=fopen(outputfile,"wb");

if(ofp==NULL)

{

printf("destination file open error!\n");

return;

}

fread(&flength,sizeof(long),1,ifp);

fread(&f,sizeof(long),1,ifp);

fseek(ifp,f,SEEK_SET);

fread(&n,sizeof(long),1,ifp);

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

{

fread(&header[i].b,1,1,ifp);

fread(&c,1,1,ifp);

p=(long)c;

header[i].count=p;

header[i].bits[0]=0;

if(p%8>0) m=p/8+1;

else m=p/8;

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

{

fread(&c,1,1,ifp);

f=c;

itoa(f,buf,2);

f=strlen(buf);

for(l=8;l>f;l--)

{

strcat(header[i].bits,"0");

}

strcat(header[i].bits,buf);

}

header[i].bits[p]=0;

}

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

{

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

{

if(strlen(header[i].bits)>strlen(header[j].bits))

{

tmp=header[i];

header[i]=header[j];

header[j]=tmp;

}

}

}

p=strlen(header[n-1].bits);

fseek(ifp,8,SEEK_SET);

m=0;

bx[0]=0;

while(1)

{

while(strlen(bx)<(unsigned int)p)

{

fread(&c,1,1,ifp);

f=c;

itoa(f,buf,2);

f=strlen(buf);

for(l=8;l>f;l--)

{

strcat(bx,"0");

}

strcat(bx,buf);

}

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

{

if(memcmp(header[i].bits,bx,header[i].count)==0) break;

}

strcpy(bx,bx+header[i].count);

c=header[i].b;

fwrite(&c,1,1,ofp);

m++;

if(m==flength) break;

}

fclose(ifp);

fclose(ofp);

printf("Uncompress successfully!\n");

return;

}

int main()

{

int c;

printf("1--Compress file\n");

printf("2--Uncompress file\n");

printf("Select 1 or 2:");

c=getch();

printf("%c\n",c);

if(c=='1') compress();

else if(c=='2') uncompress();

return 0;

}

  • 上一篇:c語言 輸入壹個字符串,將該字符串中從第m個字符開始的全部字符復制到另壹個字符串,m由用戶輸入
  • 下一篇:做壹個視頻通話給自己用吧
  • copyright 2024編程學習大全網