哈夫曼编码器
#include <stdio.h>
#define MAXVALUE 32767
typedef struct {
int weight;
int parent, lchild, rchild;
} HNodeType;
typedef struct {
int bit[ 8 ] ;
int start;
} HCodeType;
HNodeType HuffNode[ 8 ] ;
HCodeType HuffCode[ 8 ] ;
int n;
void CreateHuffTree ( void ) ;
void PrintHuffTree ( void ) ;
void CreateHuffCode ( void ) ;
void PrintHuffcode ( void ) ;
void CreateHuffTree ( void ) {
int i, j, a, b, x1, x2;
scanf ( "%d" , & n) ;
for ( i= 1 ; i< 2 * n; i++ )
{
HuffNode[ i] . weight= 0 ;
HuffNode[ i] . parent= - 1 ;
HuffNode[ i] . lchild= - 1 ;
HuffNode[ i] . rchild= - 1 ;
}
printf ( "输入%d个节点的权值\n" , n) ;
for ( i= 1 ; i<= n; i++ )
scanf ( "%d" , & HuffNode[ i] . weight) ;
for ( i= 1 ; i< n; i++ ) {
a= MAXVALUE;
b= MAXVALUE;
x1= 0 ;
x2= 0 ;
for ( j= 1 ; j< n+ i; j++ ) {
if ( HuffNode[ j] . parent== - 1 && HuffNode[ j] . weight< a) {
b= a;
x2= x1;
a= HuffNode[ j] . weight;
x1= j;
}
else
if ( HuffNode[ j] . parent== - 1 && HuffNode[ j] . weight< b) {
b= HuffNode[ j] . weight;
x2= j;
}
}
HuffNode[ x1] . parent= n+ i;
HuffNode[ x2] . parent= n+ i;
HuffNode[ n+ i] . weight= HuffNode[ x1] . weight+ HuffNode[ x2] . weight;
HuffNode[ n+ i] . lchild= x1;
HuffNode[ n+ i] . rchild= x2;
}
}
void PrintHuffTree ( ) {
int i;
printf ( "\n哈夫曼树各项数据如下表所示:\n" ) ;
printf ( " 结点i weight parent lchid rchild\n" ) ;
for ( i= 1 ; i< 2 * n; i++ )
printf ( "\t%d\t%d\t%d\t%d\t%d\n" , i, HuffNode[ i] . weight, HuffNode[ i] . parent, HuffNode[ i] . lchild, HuffNode[ i] . rchild) ;
printf ( "\n" ) ;
}
void CreateHuffCode ( void ) {
HCodeType cd;
int i, j, c, p;
for ( i= 1 ; i<= n; i++ ) {
cd. start= n;
c= i;
p= HuffNode[ c] . parent;
while ( p!= - 1 ) {
if ( HuffNode[ p] . lchild== c)
cd. bit[ cd. start] = 0 ;
else
cd. bit[ cd. start] = 1 ;
cd. start-- ;
c= p;
p= HuffNode[ c] . parent;
}
for ( j= cd. start+ 1 ; j<= n; j++ )
HuffCode[ i] . bit[ j] = cd. bit[ j] ;
HuffCode[ i] . start= cd. start;
}
}
void PrintHuffcode ( void ) {
int i, j;
printf ( "每个叶子结点的哈夫曼编码为:\n" ) ;
for ( i= 1 ; i<= n; i++ )
{ for ( j= HuffCode[ i] . start+ 1 ; j<= n; j++ )
printf ( "%d" , HuffCode[ i] . bit[ j] ) ;
printf ( "\n" ) ;
}
}
int main ( void ) {
printf ( "输入叶子节点个数\n" ) ;
CreateHuffTree ( ) ;
PrintHuffTree ( ) ;
CreateHuffCode ( ) ;
PrintHuffcode ( ) ;
return 0 ;
}