C 哈夫曼編碼

2022-07-18 02:36:12 字數 2193 閱讀 3735

#include #include 

#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;

}

view code

這讓我想到高中的時候記筆記,有些字筆畫多,就用簡單的符號代替了。

實際上哈夫曼檔案應該是按位輸出的,開啟之後可能是一堆亂碼。為了方便觀察,我就按照字元輸出了。

結構體節點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....