#include #includeview code#include
#include
#define hfmlenth 999
#define maxcode 10
//待輸入字串
char
str[hfmlenth];
//編碼
intcode[hfmlenth];
//哈夫曼樹的葉子數 其他節點數 根節點 最大深度
int orilenth = 0, addlenth = 0
, root, maxlayer;
void
getstr()
typedef
struct
code;
//節點
typedef struct
node;
//哈夫曼樹
node *hfmtree;
//字串轉哈夫曼編碼
void
strtohfm()
for (int i = 0; str[i] != '
\0'; i++)
for (int j = 0; j < strlen(str); j++)
if (hfmtree[j].cr == '\0'
)
else
if (hfmtree[j].cr ==str[i])
//構造樹
int finish = 0
;
while (!finish)
for (int i = 0; i <= orilenth + addlenth; i++)
if (index1 !=index2)
else
}else
}}//
設定哈夫曼編碼並列印哈夫曼樹
//isprinting為0時僅僅設定哈夫曼編碼 不列印
void printhfm(int index, int layer, int
isprinting)
if (hfmtree[index].cr != '\0'
)
}code[layer] = 0
; printhfm(hfmtree[index].leftchild, layer + 1
, isprinting);
code[layer] = 1
; printhfm(hfmtree[index].rightchild, layer + 1
, isprinting);}//
讀入檔案
void
readfile()
fseek(fp,
0, seek_end);
int filelen =ftell(fp);
fseek(fp,
0, seek_set);
fread(str, filelen,
sizeof(char
), fp);
fclose(fp);
}void
writehfmfile()
for (int i = 0; i < strlen(str); i++)
for (int j = 0; j <= orilenth; j++)
if (str[i] ==hfmtree[j].cr)
fclose(fp);
}int
main()
return0;
}
這讓我想到高中的時候記筆記,有些字筆畫多,就用簡單的符號代替了。
實際上哈夫曼檔案應該是按位輸出的,開啟之後可能是一堆亂碼。為了方便觀察,我就按照字元輸出了。
結構體節點node來組成哈夫曼樹,結構體編碼code來表示哈夫曼編碼。
用字元陣列str讀入輸入;哈夫曼樹的葉子數、其他節點數、根節點、最大深度分別為orilenth, addlenth, root, maxlayer。
提供使用者輸入選擇功能1.輸入字串,輸出字串的哈夫曼編碼;2.輸入文字檔案(英文),輸出哈夫曼編碼檔案。為此還重溫了檔案操作**。
首先使用getstr()或者readfile()獲得字串。
然後用strtohfm()生成哈夫曼樹。
接著用printhfm(root, 0, x)來生成編碼。當x為1時順帶列印編碼。
writehfmfile()用來輸入哈夫曼壓縮檔案。
哈夫曼編碼 C
我是從 資料結構與演算法 c 語言描述 這本書裡面抄的 程式可以正常執行 using system using system.collections.generic using system.linq using system.text namespace 哈夫曼編碼1 public huffman...
c 哈夫曼編碼
哈夫曼編碼的基本步驟 1 把概率最小的兩個符號組成乙個新的節點 2 重複步驟,直到概率和為1 3 總根節點開始到相應於每個符號的 樹葉 概率大的標 1 概率小的標 0 4 從根節點開始,對符號進行編碼 1 定義結構體 typedef struct htnode typedef struct htno...
哈夫曼編碼 哈夫曼樹
1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....