h[N+i].lchild = h[j].suffix ;

h[N+i].rchild = h[j+1].suffix;
h[j].parent = h[j+1].parent = h[N+i].suffix ;
}
}
// 创建一个code数组,储存每个字符对应的编码和编码长度 。2.哈夫曼编码规定哈夫曼编码的左分支代表0,右分支代表1,则从根节点到每个叶子结点所经过的路径组成的0和1的序列便为该叶子结点对应字符的编码,称为哈夫曼编码。,构造一棵哈夫曼编码树,规定哈夫曼编码树的左分支代表0,右分支代表1,则从根结点到每个叶子结点所经过的路径组成的0-1序列便是该叶子结点对应字符的编码,称为哈夫曼编码。
{
int i ,j,k,len;
char t[N]; //用一个字符数组存储编码
for ( i = 1 ; i <= N ; i++ )
{
len = 0 ;
for( j = i ,k = h[i].parent ; k != 0 ; j = k ,k = h[k].parent )
{
if( h[k].lchild == j )
t[len++] = '0';
else
t[len++] = '1' ;
}
c[i].suffix = i ;
c[i].length = len ;
c[i].weight = h[i].weight ;
c[i].code = ( char * )malloc ( sizeof(len+1) ); //给编码结点的编码字符串分配内存
a、开始符 b、结束符 c、任意字符 d、英文字符。如果文件中存在'/0'字符(或者说0x00字节),调用fgets之后就无法判断缓冲区中的'/0'究竟是从文件读上来的字符还是由fgets自动添加的结束符,所以fgets只适合读文本文件而不适合读二进制文件,并且文本文件中的所有字符都应该是可见字符,不能有'/0'。如果文件中存在'\0'字符(或者0x00字节),调用fgets之后就无法判断缓冲区中的'\0'究竟是从文件读上来的字符还是由fgets自动添加的结束符,所以fgets只适合读文本文件而不适合读二进制文件,并且文本文件中的所有字符都应该是可见字符,不能有'\0'。
len -- ;
j = 0 ;
while ( len >= 0 )
{
c[i].code [j++] = t[len--] ;
}
}
}
void Output( hNode h[] )//输出数组
{
int i ;
printf("哈弗曼数组输出为:\n");
for( i = 1 ; i < 2*N ; i++ )
{
printf("%3d%7d%7d%7d%7d \n",h[i].suffix ,h[i].weight ,h[i].parent ,h[i].lchild ,h[i].rchild );
}
printf("\n");

}
void Output( cNode c[] )//输出编码
{
int i ;
printf("输出哈弗曼编码为:\n");
for( i = 1 ; i <= N ; i++ )
{
printf("%3d%7d%7d%7s\n",c[i].suffix ,c[i].weight ,c[i].length ,c[i].code );
}
printf("\n");
}
void main()
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-95077-3.html
儿子不听话了
终于回归了
每个造型都好看啊啊啊