本學期資料結構課程使用的教材為清華大學出版社的《 資料結構(c語言版)》,由於書中採用了很多偽碼,使得對c語言掌握不是很熟悉的同學有學習上的困難。所以二叉樹章節中,我嘗試編寫出更適合新手的哈夫曼編碼的c語言程式,一方面幫助像我一樣的新手,一方面也積累自己的經驗。
本人第一次寫部落格,如果有錯誤的地方,歡迎各位大佬指出。
typedef
struct
htnode;
//定義哈夫曼樹儲存結構
//構造具有n個結點的哈夫曼樹
void
createht
(htnode ht,
int n)
;int fnum=
;//待編碼字元出現的頻率
int i,k,lnode,rnode;
int min1,min2;
//設定葉子結點,將其儲存在陣列的前n位
for(i=
0;i)for
(i=0
;i<
2*n-
1;i++
)for
(i=n;i<
2*n-
1;i++
)else}}
}//設定雙親結點和權值
ht[rnode]
.parent=i;
ht[lnode]
.parent=i;
//最小和次小權重結點的雙親
ht[i]
.weight=ht[rnode]
.weight+ht[lnode]
.weight;
// 最小和次小權重結點雙親的權值
//設定雙親結點的lchild和rchild。位序小的放在左子樹上,位序大的放在右子樹上
if(lnode>rnode)
else
}}
//構造哈夫曼編碼hcd
void
createhcode
(htnode ht[
], huffmancode hcd,
int n)
hcd[i]=(
char*)
malloc
((n-temp)
*sizeof
(char))
;//給第i個字元編碼分配空間
strcpy
(hcd[i]
,hc+temp+1)
;}}
//輸出哈夫曼編碼
void
disphcode
(htnode ht[
], huffmancode hcd,
int n)
m+=ht[i]
.weight;
//計算碼長,求路徑長。
sum+
=ht[i]
.weight*j;
printf
("\n");
}printf
("\n平均長度=%g\n"
,1.0
*sum/m)
;}
int
main()
#include
#include
#include
#define n 50
//葉子結點數目的最大數
#define m 2*n-1
//樹中結點總數。完全二叉樹中n2=n0-1,n=n0+n2=2n0-1
typedef
struct
htnode;
//定義哈夫曼樹儲存結構
typedef
char
**huffmancode;
//定義哈夫曼編碼儲存結構
//構造具有n個結點的哈夫曼樹
void
createht
(htnode ht,
int n)
;//待編碼字元,這是乙個字串陣列
int fnum=
;//待編碼字元出現的頻率
int i,k,lnode,rnode;
int min1,min2;
for(i=
0;i)for
(i=0
;i<
2*n-
1;i++
)for
(i=n;i<
2*n-
1;i++
)else}}
}//設定雙親結點和權值
ht[rnode]
.parent=i;
ht[lnode]
.parent=i;
//最小和次小權重結點的雙親
ht[i]
.weight=ht[rnode]
.weight+ht[lnode]
.weight;
// 最小和次小權重結點雙親的權值
//設定雙親結點的lchild和rchild。位序小的放在左子樹上,位序大的放在右子樹上
if(lnode>rnode)
else}}
//構造哈夫曼編碼hcd
void
createhcode
(htnode ht[
], huffmancode hcd,
int n)
hcd[i]=(
char*)
malloc
((n-temp)
*sizeof
(char))
;//給第i個字元編碼分配空間
strcpy
(hcd[i]
,hc+temp+1)
;}}//輸出哈夫曼編碼
void
disphcode
(htnode ht[
], huffmancode hcd,
int n)
m+=ht[i]
.weight;
//計算碼長,求路徑長。
sum+
=ht[i]
.weight*j;
printf
("\n");
}printf
("\n平均長度=%g\n"
,1.0
*sum/m);}
intmain()
如有問題,可以與我聯絡。 哈夫曼樹與哈夫曼編碼
在一般的資料結構的書中,樹的那章後面,著者一般都會介紹一下哈夫曼 huffman 樹和哈夫曼編碼。哈夫曼編碼是哈夫曼樹的乙個應用。哈夫曼編碼應用廣泛,如 jpeg中就應用了哈夫曼編碼。首先介紹什麼是哈夫曼樹。哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的...
哈夫曼樹與哈夫曼編碼
1.哈夫曼 huffman 編碼是哈夫曼樹的乙個應用。2.哈夫曼樹又稱為最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的相對值乘上其到根結點的路徑和權值。3.影象jpg就是利用了哈夫曼編碼。4.哈夫曼樹是最優二叉樹,子樹有左右次序之分。5.哈夫曼樹的形態不是唯...
哈夫曼樹與哈夫曼編碼
哈夫曼樹是一種簡單的樹結構,建樹過程如下 給出一組資料,不斷選擇最小的兩個數,並用兩個數的和作為它們的parent節點,再從資料中刪除這兩個數,將兩個數的和加入資料中,直到所有的資料都被加入樹結構,形成一顆樹。這顆樹的所有非葉子節點都有兩個child,兩個child的值的和則是這個節點的值,根節點是...