哈夫曼編碼的基本步驟:
(1)把概率最小的兩個符號組成乙個新的節點
(2)重複步驟,直到概率和為1
(3)總根節點開始到相應於每個符號的「樹葉」,概率大的標「1」,概率小的標「0」
(4)從根節點開始,對符號進行編碼
1、定義結構體
typedef
struct
htnode;
typedef
struct
htnode;
2、mian函式,呼叫huffman函式進行編碼,並計算編碼的平均長度
void
main()
printf
("\n 哈夫曼編碼的平均碼長是:%f\n"
,l);
getchar()
;等待使用者按任意鍵返回,阻止執行黑框閃退問題
for(i=
1;i<=n;i++
)printf
("\n %c的編碼結果是:%s"
,hc[i]
.data,hc[i]
.code)
; l=0;
for(i=
1;i<=n;i++
) l+
=strlen
(hc[i]
.code)
*hc[i]
.weight;
printf
("\n 赫夫曼編碼的平均碼長是: %f\n"
,l);
}
3、建立init,用於初始化待編碼項的名稱和權值
void
init
(htcode hc,
int*n)
printf
("\n 注意:各項帶編碼數的權重之和應該為1 \n"
,*n)
;for
(i=1
;i<=
*n;i++
)}
4、建立huffmancoding函式,其主要的功能是:先構造二叉樹,然後再根據構造的二叉樹,進行哈夫曼編碼
void
huffmancoding
(htnode ht[
],htcode hc,
int n)
for(i=n+
1;i<=m;i++
)for
(i=1
;i<=m;i++
)for
(i=0
;i) cd[n-1]
='\0'
;for
(i=1
;i<=n;i++
)strcpy
(hc[i]
.code,
&cd[start]);
}}
5、建立select函式,用於在剩餘二叉樹根節點和新產生的根節點中選出權值最小的兩項
void
select
(htnode ht,
int k,
int*s1,
int*s2)
}for
(i=1
;i<=k;i++
)for
(i=1
;i<=k;i++)}
for(i=
1;i<=k;i++
)printf
("\n 這是 *s1:%d\n"
,*s1)
;printf
("\n 這是 *s2:%d\n"
,*s2)
;}
哈夫曼編碼 C
我是從 資料結構與演算法 c 語言描述 這本書裡面抄的 程式可以正常執行 using system using system.collections.generic using system.linq using system.text namespace 哈夫曼編碼1 public huffman...
C 哈夫曼編碼
include include include include define hfmlenth 999 define maxcode 10 待輸入字串 char str hfmlenth 編碼 intcode hfmlenth 哈夫曼樹的葉子數 其他節點數 根節點 最大深度 int orilenth...
哈夫曼編碼 哈夫曼樹
1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....