哈夫曼樹編碼並解碼(加強版)

2022-05-05 07:09:14 字數 3108 閱讀 3519

本**流程:

隨機輸入一段字串--->根據輸入字串得到每個字元權重(頻數)並輸出--->得到每個字元對應哈夫曼編碼並輸出--->輸入一段哈夫曼編碼--->利用每個字元對應的哈夫曼編碼來解碼

技術支援:

這裡是**:

main.cpp

1 #include 2 #include "

哈夫曼樹.h

"3 #include 4 #include

5 #include

6using

namespace

std;

7int

main()

21for (auto &i : m)

2226 wei = (int *)malloc((n + 1) * sizeof(int

));27 ch = (char*)malloc((n + 1) * sizeof(char

));28

for (auto &i : m)

2934 createhuffmantree(&ht, n, wei, ch);

35 createhuffmancode(&ht, &hc, n);

36return0;

37 }

哈夫曼樹.h(其實decode解碼函式可以用void型別的,但是我懶得改了)

1 #include 2

using

namespace

std;

3 typedef struct

node, *huffmantree;

8 typedef char *huffmancode;

9void

select(huffmantree *huffmantree, int n, int *s1, int *s2);

10void createhuffmantree(huffmantree *huffmantree, int n, int w, char

cha);

11void createhuffmancode(huffmantree *huffmantree, huffmancode *huffmancode, int

n);12

string decode(huffmantree *huffmantree, huffmancode *huffmancode, int n, string s);

哈夫曼樹.cpp

1 #include 2 #include "

哈夫曼樹.h

"3 #include

4using

namespace

std;5//

找權值最小的結點

6void

select(huffmantree *huffmantree,int n,int *s1,int *s2)

19else

if (min2 > (*huffmantree)[i].weight) 23}

24}25 *s1 =m1;

26 *s2 =m2;27}

28//

初始化節點,構造哈夫曼樹

29void createhuffmantree(huffmantree *huffmantree,int n,int w,char

cha)

41//

非葉子節點的初始化

42for (i = n + 1; i <= m; i++)

48//

開始構建哈夫曼樹

49 cout << "

哈夫曼樹:

"<

50 cout << "

父節點權值 (左孩子權值 右孩子權值)

"<

51int s1, s2;//

這是兩個權值最小的結點所在位置

52for (i = n + 1; i <= m; i++) 62}

63//

初始化哈夫曼編碼?!生成哈夫曼編碼

64void createhuffmancode(huffmantree *huffmantree,huffmancode *huffmancode,int

n) 77

//為第i個字元編碼分配空間

78 huffmancode[i] = (char*)malloc((n - start) * sizeof(char

));79 strcpy(huffmancode[i], &cd[start]);80}

81free(cd);

82//

開始列印編碼

83 cout << "

哈夫曼字元 權值 對應編碼

"<

84for (i = 1; i <= n; i++)

87//

在這裡解碼,一定要成功!!!

88string

s;89 cout << "

請輸入待解碼的哈夫曼編碼:";

90 cin >>s;

91decode(huffmantree, huffmancode, n, s);92}

9394

string decode(huffmantree *huffmantree,huffmancode *huffmancode,int n,string

s) 101 c = (char*)malloc(s.size() * sizeof(char));//

c的記憶體空間

102for (i = 0; i < s.size(); i++)

112else

if ((i == s.size() - 1) && j == n && c[0] != '

\0') cout << "

error!!!

"<

113}

114 k++;

115}

116return0;

117 }

除錯結果如下:

真的真的是經歷了九九八十一難才完成!!!

哈夫曼編碼解碼

簡單實現編碼解碼功能 列印哈夫曼樹形 該怎麼做呢 求教!實現初始化,建立huffman樹,並完成字元的編碼 之前解碼用for迴圈不能夠重新復位遍歷 while更好用 include stdio.h include string.h define n 10 待編碼字元的個數,即樹中葉結點的最大個數 d...

構建哈夫曼樹,並輸出哈夫曼編碼

輸入條件 輸入從小到大排列的n個正整數,作為葉子的權值,共同完成構建具有n片葉的,根指標為hroot的哈夫曼樹 1 程式前部的定義 include include include define max 999 監督元 define n 6 n個葉子節點 char s 6 存放哈夫曼編碼的陣列,初始化...

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....