Código fuente C para codificación Huffman
#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
{ p>
char data[5]; /* valor de nodo*/
int peso; /* peso*/
int padre; */ p>
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; p> } 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>