全球旧事资料 分类
建哈夫曼树r
i
tir
HFMTreepHT1HT2HT1,HT2分别存放权值最小和次小的节点的位置r
pHTHFMTreemallocsizeofHFMNoder
p
extpLChildpRChildpPare
tNULL初始化哈夫曼链表且有2
1个节点r
fori1i2
1ir
r
p
extHFMTreemallocsizeofHFMNoder
pp
extr
p
extpLChildpRChildpPare
tNULLr
r
r
fori0pHTi
i将各个字符出现的次数作为权值r
存入哈夫曼链表的前
个单元中r
pweightcou
tir
pp
extr
r
r
fori
i2
1i将后
1个节点赋权值,建树r
r
SelectMi
HTiHT1HT2每次从前i个节点中选取权值最小的两个节点r
HT1Pare
tHT2Pare
tpr
pLChildHT1r
pRChildHT2r
pweightHT1weightHT2weight将两个节点的权值相加存入最后一个节点中r
pp
extp指向下一个没有存储权值的节点r
r
r
r
r
r
voidHFMCodeHFMTreeHTCodeNodeHCcharstrr
r
从每个叶子节点开始,利用哈夫曼树对每个字符进行编码,最终建立一个哈夫曼表r
i
tir
HFMTreeqpHTr
fori0i
i将字符存入哈夫曼编码结构体数组的字符单元中r
r
HCichstrir
HCicode
10初始化编码的最后一位r
r
fori0i
ir
r
HCistart
1r
forqpqPare
tqqPare
t判断q所指向的节点,左孩子置0,右孩子置1r
ifqqPare
tLChildr
HCicodeHCistart0r
elseHCicodeHCistart1r
pp
ext判断下一个叶子节点r
r
r
r
r
r
r
voidTotalCodi
gcharsCodeNodeHCcharcoder
r
利用哈夫曼编码表对整个字符串进行编码r
i
tijr
code00编码数组初始化r
fori0sii将每个字符在哈夫曼编码表中对应的编码存入存放总编码的数组中r
forj0j
jr
ifsiHCjchr
strcpycodestrle
codeHCjcodeHCjstartr
r
r
voidDeCodi
gcharcodeHFMTreeHTcharstrcharsr
r
对哈夫曼编码进行解码,放入字符串s中r
i
tijk0r
HFMTreerootpqr
forrootHTrootPare
trootrootPare
t用root指向哈夫曼树的根结点r
fori0prootcodeii从根结点开始按编码顺序访问树r
r
ifcodei0r
ppLChildr
elseppRChildr
ifpLChildNULLpRChildNULL到根节点时将该节点对应的字符输出r
r
forj0qHTqpqq
extjr
skstrjr
proot回溯到根结点r
r
r
sk0解码完毕,在字符串最后一个单元存入0r
r
r
r
voidCodi
gcharscharstrcharcodei
tcou
tHFMTreeHTCoder
好听全球资料 返回顶部