分析設計如下功能的哈夫曼編譯碼系統:
初始化:從終端讀入字符集大小為n,以及n個字元和n個權值,建立哈夫曼樹。
編碼:利用已建好的哈夫曼樹,通過計算權重值計算輸出對應字符集的哈夫曼編碼。
解碼:利用已建立好的哈夫曼樹,將使用者輸入電文中的**進行解碼,解碼結果進行輸出。
已經完美執行,話不多說先上**!(建議儲存為cpp執行)
#include
//建議儲存為cpp執行
#define maxleaf 20
//最大葉子數目
#define maxnode maxleaf*2-1
//結點總數
#define maxval 10000
#define maxsize 100
//哈夫曼編碼的最大位數
typedef
struct
hufmtree;
typedef
struct
codetype;
//huffman
void
huffman
(hufmtree tree,
int n)
//建立哈夫曼樹
for(i=
0;i)//讀入前n個結點的字元及權值
for(i=n;i
)//進行n-1次合併,產生n-1個新結點
else
if(tree[j]
.weight
tree[p1]
.parent=i;
tree[p2]
.parent=i;
tree[i]
.lchild=p1;
//最小權根結點是新結點的左孩子
tree[i]
.rchild=p2;
//次小權根結點是新結點的右孩子
tree[i]
.weight=tree[p1]
.weight+tree[p2]
.weight;}}
//huffmancode
void
huffmancode
(codetype code[
],hufmtree tree,
int n)
//根據哈夫曼樹求出哈夫曼編碼
code[i]
=cd;
//第i+1個字元的編碼存入code[i]}}
//decode
void
decode
(hufmtree tree,
int m)
//依次讀入電文,根據哈夫曼樹解碼
j++;}
printf
("\n");
if(tree[i]
.lchild!=-1
&&b[j]
!='#'
)//電文讀完,但尚未到葉子結點
printf
("\nerror\n");
//輸入電文有錯
}//主函式--程式入口
intmain()
break
;case3:
m=2*n-1;
printf
("請輸入電文(0 or 1),以#為結束標誌:\n");
decode
(tree,m)
;//依次讀入電文,根據哈夫曼樹解碼
break
;case4:
return0;
}}return0;
}
(1)功能介紹
利用寫好的huffman函式來生成哈夫曼樹。若已知n個字元的出現概率的「權值」,構造出具有2n-1個結點的哈夫曼樹(採用靜態鍊錶儲存結構)。
(2)流程圖
定義hufmtree陣列後將所有的2n-1個節點的左右節點置為-1,迴圈遍歷進行n-1次合併,產生n-1個新結點,改變最小權、次小權及對應的位置,最小權根結點是新結點的左孩子,次小權根結點是新結點的右孩子。哈夫曼樹的構造流程圖如圖1所示。
圖1 哈夫曼樹的構造流程圖
(3)實現結果
哈夫曼編碼解碼器
總結一下這次的課程設計,遇到的問題是如何解決的。功能 將權值資料存放在資料檔案data.txt中。鍵盤輸入字符集大小n n個字元和n個權值,建立哈夫曼樹。利用建好的哈夫曼樹生成哈夫曼編碼。使用data.txt中的權值資料生成的哈夫曼編碼,將檔案text.txt中的字串編碼儲存到huffmancode...
c 實驗8 哈夫曼編碼 解碼器
此次實驗的注釋解析多加不少 若對小夥伴們有幫助 希望各位麻煩點個關注 多謝 1 由給定的n個權值構造n棵只有根結點的二叉樹,從而得到乙個二叉樹森林f 2 在二叉樹森林f中選取根結點的權值最小和次小的兩棵二叉樹作為新的二叉樹的左右子樹構造新的二叉樹,新的二叉樹的根結點權值為左右子樹根結點權值之和。3 ...
哈夫曼編碼與解碼 C語言實現
include include include include define maxnum 60 typedef struct huffnode typedef struct huffcode huffnode ht maxnum 2 存放哈夫曼樹 huffcode hcd maxnum 存放ht陣...