C语言哈夫曼编码代码Word下载.docx
《C语言哈夫曼编码代码Word下载.docx》由会员分享,可在线阅读,更多相关《C语言哈夫曼编码代码Word下载.docx(3页珍藏版)》请在冰豆网上搜索。
HT,int
n)
i,j;
for(i
=
1;
i
<
n;
i++)
if(!
HT[i].parent){s1
i;
break;
}
for(j
i+1;
j
j++)
HT[j].parent){s2
j;
if((HT[s1].weight>
HT[i].weight)&
&
(!
HT[i].parent)&
(s2!
=i))s1=i;
if((HT[s2].weight>
HT[j].weight)&
HT[j].parent)&
(s1!
=j))s2=j;
HuffmanCoding(HuffmanTree
HT,
HuffmanCode
HC[],
*w,
//
算法6.13
w存放n个字符的权值(均>
0),构造哈夫曼树HT,
并求出n个字符的哈夫曼编码HC
i,
*cd;
p;
cdlen;
if
(n<
=1)
return;
m
2
*
n
-
HT
(HuffmanTree)malloc((m+1)
sizeof(HTNode));
0号单元未用
for
(i=1;
i<
=n;
i++)
{
//初始化
HT[i].weight=w[i-1];
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
(i=n+1;
=m;
HT[i].weight=0;
puts("
\n哈夫曼树的构造过程如下所示:
"
);
printf("
HT初态:
\n
结点
weight
parent
lchild
rchild"
\n%4d%8d%8d%8d%8d"
i,HT[i].weight,
HT[i].parent,HT[i].lchild,
HT[i].rchild);
按任意键,继续
..."
getchar();
建哈夫曼树
在HT[1..i-1]中选择parent为0且weight最小的两个结点,
其序号分别为s1和s2。
Select(HT,
i-1);
HT[s1].parent
HT[s2].parent
HT[i].lchild
s1;
HT[i].rchild
s2;
HT[i].weight
HT[s1].weight
+
HT[s2].weight;
\nselect:
s1=%d
s2=%d\n"
s1,
s2);
(j=1;
j<
=i;
j,HT[j].weight,
HT[j].parent,HT[j].lchild,
HT[j].rchild);
//------无栈非递归遍历哈夫曼树,求哈夫曼编码
cd
(char
*)malloc(n*sizeof(char));
分配求编码的工作空间
p
m;
cdlen
0;
++i)
遍历哈夫曼树时用作结点状态标志
while
(p)
(HT[p].weight==0)
向左
HT[p].weight
(HT[p].lchild
!
0)
HT[p].lchild;
cd[cdlen++]
='
0'
;
else
(HT[p].rchild
==
登记叶子结点的字符的编码
HC[p]
*)malloc((cdlen+1)
sizeof(char));
cd[cdlen]
\0'
strcpy(HC[p],
cd);
复制编码(串)
}
(HT[p].weight==1)
向右
2;
HT[p].rchild;
1'
HT[p].weight==2,退回退到父结点,编码长度减1
HT[p].parent;
--cdlen;
HuffmanCoding
main()
HuffmanTree
HT;
*HC;
*w,n,i;
输入结点数:
scanf("
%d"
&
n);
HC
(HuffmanCode
*)malloc(n*sizeof(HuffmanCode));
w
(int
*)malloc(n*sizeof(int));
输入%d个结点的权值\n"
n);
w[i]);
HuffmanCoding(HT,HC,w,n);
\n各结点的哈夫曼编码:
%2d(%4d):
%s\n"
i,w[i-1],HC[i]);