Red de conocimientos turísticos - Información de alquiler - Código fuente C para codificación Huffman

Código fuente C para codificación Huffman

/*Nombre de archivo:exp7-6.cpp*/

#include

#include

#define N 50 /*Número de nodos de hoja*/

#define M 2*N-1 /*Número total de nodos en el árbol*/

estructura typedef

{

char data[5]; /* valor de nodo*/

int peso; /* peso*/

int padre; */

int lchild; /* Nodo hijo izquierdo*/

int rchild;* Nodo hijo derecho*/

}.

HTNode;

typedef struct

{

char cd[N]; /* contiene código Huffman*/

int start;

}HCode;

void CreateHT(HTNode ht[],int n)

{

int i,k,lnode,rnode ;

int min1,min2;

for (i=0;i<2*n-1;i++) /*Los campos relevantes de todos los nodos se establecen en el valor inicial -1 **

ht[i].parent=ht[i].lchild=ht[i].rchild=-1;

para (i=n;i< 2* n-1;i++) /*Construir árbol de Huffman**

{

min1=min2= 32767 /* lnode y rnode son las dos posiciones de nodo con el peso más pequeño; * /

lnode=rnode=-1;

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

if (ht[k ] .parent==-1) /* Buscar solo en nodos que aún no hayan construido un árbol binario*/

{

if (ht[k].weight

{

min2=min1;rnode=lnode;

min1=ht[k].weight;lnode=k;

}

else if (ht[k].peso

{

min2=ht[k].peso;rnode=k;

}

ht[lnode].parent=i;ht[rnode].parent=i;

ht[i].weight=ht[lnode]. peso+ht[rnodo].peso;

ht[i].lchild=lnodo;ht[i].rchild=rnodo;

}

}

void CreateHCode(HTNode ht[],HCode hcd[],int n)

{

int i,f,c;

HCode hc ;

for (i=0;i

{

hc start=n;c=i;

f=ht[i].parent;

while (f!=-1) /* Sigue el orden hasta el nodo raíz de . el árbol*/

{

if (ht[f].lchild==c) /* Procesar el nodo secundario izquierdo*/

hc.start++ ; /*start Apunta al primer carácter del código Huffman*/

hcd[i]=hc;

}

}}

void DispHCode(HTNode ht[],HCode hcd[],int n)

{

int i,k;

int sum=0 ,m=0 ,j;

printf("Salida del código Huffman:\n"); /*Salida del código Huffman*/

for (i=0;i

{

j=0;

printf(" %s:

\t",ht[i].data);

for (k=hcd[i].start;k<=n;k++)

{

printf( "%c",hcd[i].cd[k]);

j++;

}

m+=ht[i].peso;

suma+=ht [i].peso*j;

printf("\n");

}

printf(" /n longitud promedio=%g\n",1.0*sum/m);

}

void main()

{

int n=15,i;

char *str[]={"El", "de", "a", "a", "y", "en", "ese" , "él", "es", "en", "sobre", "para", "Su", "son", "ser"};

int fnum[]={1192,677,541,518,462,450,242,195,190,181,174,157,138,124,123 };

HTNode ht[M];

HCode hcd[N];

para (i=0;i

{

strcpy(ht[i].data,str[i]);

ht[i].weight=fnum[i];

}

printf("\n");

CreateHT(ht,n);

CreateHCode(ht, hcd,n);

DispHCode(ht,hcd,n);

printf("\n");

}

Anteriormente, podías cambiarlo directamente /. p>