Estoy buscando urgentemente orientación de un experto en lenguaje C o C++. . . Es necesario construir un árbol de Huffman. Por favor ayúdenme con el código de programación real. .
¡Muchas gracias! ! !
void hfmtree ( huffnode ht[] ) se utiliza para construir un árbol Huffman. Se pueden eliminar otras funciones según sea necesario
#include
#include
#define maxsize 10000 /*La longitud máxima de la cadena compilada en la función de codificación*/
#define max 10000 /*Número máximo de caracteres*/
typedef struct /*Definir un nodo huffnode*/
{
char data /*Campo de datos* /
int peso,parent,izquierda,derecha;
}huffnode;
typedef struct /*Definir un nodo huffnode*/
{
char cd[max]; /*array cd almacena el código Huffman*/
int start
}huffcode
huffcode; hcd[max];
huffnode ht[2*max];
huffnode a[2*max]
void hfmtree ( huffnode ht[] ) /*Crear un árbol de Huffman*/
{
int i,k,x1,x2,n,m1,m2; ].peso;
para ( i=1; i<=2*n-1; i++ )
ht[i].parent = ht[i].left = ht [i].right = 0; /*Inicialización*/
for ( i=n+1; i<=2*n-1; i++ )
{
m1 = m2 = 200000000;
x1 = x2 = 0;
para ( k=1; k<=i-1 ; k++ ) /*k es el subíndice del nodo que se puede comparar*/
if ( ht[k].parent == 0 ) /*Cuando el nodo padre del nodo actual no existe* /
if ( ht[k].weight < m1 ) /*El peso del nodo actual es menor que el peso mínimo*/
{
m2 = m1; >
x2 = x1;
m1 = ht[k].peso
x1 = k
}
; else if ( ht[k].weight < m2 ) /*El peso del nodo actual es mayor que el peso mínimo pero menor que el segundo peso mínimo*/
{
>
m2 = ht[k].peso
x2 = k
}
ht[x1].padre = ht[x2] .parent = i;
ht[i].peso = ht[x1].peso + ht[x2].peso
ht[i].left = x1; /p>
ht[i].right = x2;
}
}
salida nula ( huffnode ht[] ) /*salida ha Codificación Huffman*/
{
huffcode d
int i,n,c,f,k,x
n; = ht[0].peso;
for ( i=1; i<=n; i++ )
{
d.start = n+ 1; /*d.start es el elemento de la pila*/
c = i; /*c almacena el nodo actual*/
f = ht[i].parent;/* f almacena el nodo padre del nodo actual*/
while ( f != 0 )
{
if ( ht[f].left == c ) /*Si el nodo actual está a la izquierda de su nodo padre*/
d.cd[--d.start] = '0'
else
p>
d.cd[--d.start] = '1'; /*Cuando el nodo actual está a la derecha de su nodo padre*/
c = f ; /*El nodo actual El nodo padre del punto está asignado a c*/
f = ht[f].parent /*El nodo padre de c está asignado a f*/
;}
hcd[i] = d; /*Asigna el código Huffman del nodo actual a la matriz hcd[i]*/
}
printf ( "Código Huffman: \n"
for ( i=1; i<=n; i++ ) /*Generar el código Huffman de cada nodo*/
{
if ( ht[i].data == ' ' )
printf ( "' ' "
else
<); p> printf ( "% c ",ht[i].datax = hcd[i].start; ; k++ ) /*Pasar codificación de Huffman de salida de pila*/
p>
printf( "%c",hcd[i].cd[k]
printf( "\n"
}
);printf ( "* * * * * * * * * * * * * * * * * * * \n\n"
}
codificación nula); (huffcode hcd[],huffnode ht[]) /*Función de codificación, dada una cadena, genera su código Huffman correspondiente*/
{
int i, j,n,m ,k,x;
char in[maxsize],out[2*maxsize];/*in almacena la cadena a compilar y out almacena el código compilado*/ p>
m = 0;
printf ( "Ingrese una cadena:"
getchar()
gets(in
<); p> n = strlen(in); para ( i=0; i { para ( j=1; j <=ht[0].weight; j++ ) /*ht[0].weight almacena el número de nodos ponderados*/ if ( in[i ] == ht[j].data ) / *Si el carácter de entrada es el mismo que un nodo ponderado*/ { x = hcd[j].start for ( k =x; k<=ht[0].peso; k++ ) salida[m++] = hcd[j].cd[k] } } printf ( "El resultado de la codificación es:\n" for ( i=0; i printf ( "%c",out[i] ); printf ( "\n" } decodificación nula (huffcode hcd[]); huffnode ht[])/*Función de decodificación, ingresa un flujo de código y genera sus caracteres correspondientes*/ { int i,j, n,k,x,m,w ; char in[maxsize*2],out[maxsize];/*La matriz in almacena el flujo de código y la matriz out almacena la matriz correspondiente*/ printf ( "Ingrese una cadena que consta de 0 y 1:\n" scanf ( "%s",in n = strlen(in i = m = 0; /*i es el subíndice de la matriz de entrada, m es el subíndice de la matriz de salida*/ while ( i { para ( j=1; j<=ht[ 0].weight; j++ )/*ht[0].weight es el número de nodos ponderados*/ { x = hcd[j].start < /p; > for ( k=x,w=i; k<=ht[0].weight; k++,w++) /*k es el subíndice de hcd[j].cd[]*/ if ( in[w] != hcd[j].cd[k] ) break if ( k > ht[0].peso ) { salida[m++] = ht[j].data; descanso } } i = w; } printf ( "El resultado de la decodificación es:\n" ); ; i printf ( "%c",out[i] printf ( "\n" ); p> } int main() { int select,index,i,k,len ; char str[10000]; printf ( "Ingrese un artículo para codificar:\n" get (str); =0; index<=200; index++){//Inicialización a[index].data = '#'; p> } len = strlen(str); k = 27; para ( índice=0; índice if ( str[index]>='A' && str[index]<='Z' ){ a[str[index]- 'A '+1].data = cadena[índice]; a[cadena[índice]-'A'+1].peso++ } else{ a[k].data = str[index]; a[k].weight++; > } } > k = 1; para ( i=0; i<200; i++ ) si ( a[i].data != '#' ){ ht[k].data = a[i].data ht[k].peso = a[i].peso k++; > } ht[0].weight = k-1; hfmtree (ht); //Crea un árbol salida (ht); hacer { printf ( "******************\n" ); ; printf ( "0.Salir\n" ); printf ( "1.Codificación\n" printf ( "2.Decodificar); \n" ); printf ( "3. Traverse\n" ); printf ( "Ingrese su elección:" ); scanf ( "%d",&select ); if ( select == 0 ) { printf ( "¡Gracias por usar!\n" ) ; devuelve 0; } si (seleccione == 1) codificación (hcd,ht); > else if ( select = = 2 ) decodificación ( hcd,ht } while(1); /p> }