Código fuente del programa de codificación Huffman adaptativo en C.
# incluir ltstring.h gt
# incluir ltstdlib.h gt
# incluir ltconio.h gt
Encabezado de estructura
{
Carácter sin firmar b;
Cuenta larga;
padre largo, lch, rch
Bits de carácter [256];
}
Encabezado [512], tmp
Compresión no válida ()
{
nombre de archivo char[255], archivo de salida[255], buf[512];
carácter sin signo c;
long i, j, m, n, f;
long min1, pt1, length
FILE *ifp, * ofp
Printf ("Nombre del archivo fuente (en el directorio actual): ")
Obtener (nombre de archivo);
ifp=fopen (nombre de archivo, "Rb"); >
{
printf("¡Error! \ n ");
Regresar
}
Printf ("Generar; nombre de archivo:");
Obtener (archivo de salida);
ofp=fopen(archivo de salida, "WB");
if(ofp ==NULL )
{
printf("¡Error! \ n ");
Devolver
}
f longitud = 0;
mientras(!asociación de inversores extranjeros
{
fred(ampc,1,1,ifp);
Título[c];
f longitud;
}
f longitud-;
encabezado[c].count-;
for(I = 0;ilt512;i)
{
if(encabezado[i].count ! =0) encabezado[i]. =(carácter sin firmar)I;
else encabezado[i].
encabezado[i].
lch=encabezado[i].rch=. -1;
}
for(I = 0; ilt256; i )
{
for(j = I 1; j lt256; j )
{
if(encabezado[i] . Cuente ltTítulo[j]. recuento)
{
tmp = encabezado[I];
Encabezado[I]=encabezado[j];
encabezado[ j]= tmp;
}
}
}
for(I = 0;ilt256;i) if(encabezado [ i].
contar = = 0)romper;
n = I;
m = 2 * n-1;
for(I = n;iltm;i )
{
min 1 = 99999999;
for(j = 0; j lt i; j )
{ p >
if(head[j].parent!=-1)continue;
if(min 1 gt;title[j].count)
{ p >
pt 1 = j;
min1=encabezado[j]. Contar;
Continuar;
}
}
Título [i]. recuento=encabezado[pt1]. Recuento;
Título[pt1]. padre = I;
Título[i]. lch = pt 1;
min 1 = 99999999;
for(j = 0;j lti;j)
{
if(head[j].parent!=-1)continue;
if(min 1 gt;title[j].count)
{
pt 1 = j;
min1=encabezado[j]. Contar;
Continuar;
}
}
Título [i]. recuento =encabezado[pt1]. Recuento;
Título[i]. rch = pt 1;
Título[pt1]. padre = I;
}
for(I = 0;iltn;i)
{
f = I;< / p>
Título[i]. Bit[0]=0;
mientras(título[f].Parent!=-1)
{
j = f;
f = título[f]. Padre;
if(header[f].lch==j)
{
j=strlen(header[i].bit); p>
p>
memmove(encabezado[i].bit 1, título[i].bit,j 1);
encabezado[i]. bit[0]="0";
}
Otro
{
j=strlen(encabezado[i].bit );
memmove(encabezado[i].bit 1, título[i].bit,j 1);
encabezado[i]. bit[0]= ' 1 ';
}
}
}
fseek(ifp, 0, SEEK_SET) ;
fwrite(amp;flength,sizeof(int),1,ofp);
fseek(ofp,8,SEEK_SET);
buf [0]= 0;
f = 0;
pt 1 = 8;
Y (! Asociación de Inversores Extranjeros
{
c = fgetc(ifp);
f ;
for(I = 0; iltn; i )
{
if(c==encabezado[i].
b) Romper;
}
strcat(buf, encabezado[i].bit
j = strlen(buf); p>c = 0;
mientras(j gt;=8)
{
for(I = 0;ilt8;i)
{
if(buf[I]= = ' 1 ')c =(c lt; lt1)|1;
si no c = c lt lt1;
p>}
fwrite( amp; c, 1, 1, ofp);
pt 1;
strcpy(buf, buf 8 ) ;
j = strlen(buf);
}
if(f = = f longitud)break;
}< / p>
if(j gt; 0)
{
strcat(buf, " 00000000 ");
for(I = 0; i lt8;i)
{
if(buf[I]= = ' 1 ')c =(c lt; lt1)|1;
else c = c lt lt1;
}
fwrite( amp; c, 1, 1, ofp);
pt 1; >}
fseek(ofp, 4, SEEK _ SET);
fwrite( amp; pt1, tamaño de (largo), 1,
); fseek(ofp,pt1,SEEK_SET);
fwrite(amp;n,sizeof(long),1,ofp);
for(I = 0;i ltn ;i )
{
fwrite( amp; (título[i].b),1,1,ofp);
c=strlen(encabezado [i] .bit);
fwrite(amp;c,1,1,ofp);
j=strlen(header[i].bit);
if(j8!=0)
{
for(f = j 8; f lt8; f )
strcat(header[i] .bit, "0");
}
mientras(encabezado[i]. bit[0]! =0)
{
c = 0;
for(j = 0; j lt8; j )
{ p>
if(encabezado[i].bits[j]= = ' 1 ')c =(c lt; lt1)|1;
else c = c lt lt1;
}
strcpy(encabezado[i]. bit, encabezado[i].
bit 8);
fwrite(amp;c,1,1,ofp);
}
}
fclose(ifp
fclose(ofp);
Printf("Compresión completa\ n ");
}
descompresión vacía ()
{
nombre de archivo char[255], archivo de salida[255], buf[255], bx[255];
carácter sin signo c
p>
longitud i, j, m, n, f, p, l;
Longitud de fibra larga
ARCHIVO *ifp, *ofp
Printf("Nombre del archivo fuente (en el directorio actual):");
Obtener (nombre del archivo);
ifp=fopen(nombre del archivo, "Rb") ;
if(ifp==NULL)
{
printf("¡Error!\ n ");
Regresar;
}
Printf("Generar nombre de archivo: ");
Obtener (archivo de salida);
ofp=fopen(archivo de salida, "WB); ");
if(ofp==NULL)
{
printf("¡Error!\n ");
regresar
}
fred(ampflength,tamañode(largo),1,ifp);
fred(ampf,tamañode(largo) ), 1, ifp; );
fseek(ifp, f, SEEK_SET);
fred(ampn, sizeof(long), 1, ifp);
p>
for(I = 0;iltn;i)
{
fred(amp título[i].b,1,1,ifp
); fred(ampc,1,1,ifp);
p = (long)c;
Título[i]. cuenta = p;
Título[i]. bit[0]=0;
si(p 8 gt; 0)m = p/8 1;
si no m = p/8;
for(j = 0; j ltm; j )
{
fred(ampc,1,1,ifp);
f = c p>
itoa(f,buf,2);
f = strlen(buf);
for(l = 8;l gtf;l -)
{
strcat(encabezado[i].bit, "0");
}
strcat(encabezado[i]. bits, buf);
}
Título[i].
Bit[p] = 0;
}
para(I = 0; i ltn; i )
{
para( j = I 1; j ltn; j )
{
if(strlen(encabezado[i].bit)>;strlen(encabezado[j].bit)) p>
{
tmp = encabezado[I];
Encabezado[I]=encabezado[j];
encabezado[j]= tmp ;
}
}
}
p=strlen(encabezado[n-1]). bit);
fseek(ifp, 8, SEEK _ SET);
m = 0;
bx[0] = 0;
mientras(1)
{
mientras(strlen(bx) lt; (entero sin signo)p)
{
fred(ampc,1,1,ifp);
f = c;
itoa(f,buf,2);
f = strlen( buf);
for(l = 8; l gtf; l -)
{
strcat(bx, " 0 ");
}
strcat(bx,buf);
}
for(I = 0;iltn;i)
{
if(memcmp(encabezado[i].bit,bx,encabezado[i].count)== 0)break;
}
strcpy (bx, bx encabezado[i].count);
c = encabezado[i]. b;
fwrite(amp;c,1,1,ofp);
m;
if(m = = f longitud)break; p>
p>
}
fclose(ifp);
fclose(ofp);
Printf("¡Decodificando correctamente!\n ");
fclose(ofp); p>
}
int main()
{
int c;
while (1) {
Printf("Presione 1 para seleccionar codificación\n ");
Printf("Presione 2 para seleccionar decodificación\n" );
Printf("Por favor seleccione 1 o 2: ");
c = getch()
printf("c\n ",c
if(c == ' 1 ' )comprimir();
si no (c = = ' 2 ')descomprimir();
}
Devuelve 0;
}