Huffman編碼與解碼的實現

2021-06-21 20:09:32 字數 2920 閱讀 4904

huffman編碼相信學過資料結構這麼課的都知道,概念也比較好理解,但是一般好理解的演算法,在實際實現的過程中總是會遇到各種問題,一方面個人認為是對演算法的實現過程不熟,另一方面在實際實現的過程中可以提公升自己實現演算法的能力,將自己的想法實現後還是比較滿足的。下面是本人親自實現的huffman編碼與解碼的c語言實現,主要是記錄一下自己當時的想法,供以後備忘吧。

資料結構定義如下:

typedef structhtnode, * huffmantree;

typedef char * * huffmancode;

建huffman樹的過程是使用順序結構陣列儲存樹,由於沒有度為一的節點,因此總數為2*n - 1個節點,n為葉子節點個數,也是待編碼的字元個數。

建樹的關鍵**如下:

//建立huffman樹,初始化1到n號元素的parent都為0,每次從parent為0的元素中

//挑選最小的兩個建樹之後,將它們的parent都置為對應號碼

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

for(j = 1; j <= i - 1; j++)

ht[min1].parent = i;

for(j = 1; j <= i - 1; j++)

if(ht[j].parent == 0)

for(j = 1; j <= i - 1; j++)

ht[min2].parent = i;

ht[i].lchild = min1;

ht[i].rchild = min2;

ht[i].weight = ht[min1].weight + ht[min2].weight;

}

編碼過程是更加樹的結構,對每個非葉子節點的左子樹為『0』,右子樹為『1』。實現如下:

//編碼

huffmancode hc = (huffmancode)malloc(n*sizeof(char *));

char * cd = (char *)malloc(n*sizeof(char));

cd[n-1] = '\0';

for(i = 0; i < n; i++)

hc[i] = (char*)malloc((n-end)*sizeof(char));

strcpy(hc[i], &cd[end]);

} free(cd);

全部實現,封裝在乙個huffmanencode函式中。

huffmancode huffmanencode(huffmantree & ht, unsigned int * w, int n) 

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

//建立huffman樹,初始化1到n號元素的parent都為0,每次從parent為0的元素中

//挑選最小的兩個建樹之後,將它們的parent都置為對應號碼

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

for(j = 1; j <= i - 1; j++)

ht[min1].parent = i;

for(j = 1; j <= i - 1; j++)

if(ht[j].parent == 0)

for(j = 1; j <= i - 1; j++)

ht[min2].parent = i;

ht[i].lchild = min1;

ht[i].rchild = min2;

ht[i].weight = ht[min1].weight + ht[min2].weight; }

//編碼

huffmancode hc = (huffmancode)malloc(n*sizeof(char *));

char * cd = (char *)malloc(n*sizeof(char));

cd[n-1] = '\0';

for(i = 0; i < n; i++)

hc[i] = (char*)malloc((n-end)*sizeof(char));

strcpy(hc[i], &cd[end]);

} free(cd);

return hc;

}

對於編碼後得到的編碼字串行hc,結果過程只需找到對應的下標即可。如下:

int huffmandecode(huffmantree ht,char* code, int n)

while(code[i] == '0' || code[i] == '1')

return r;

}

最後,主函式中的呼叫如下,整個實現起來後比較方便。

int main()

huffmantree ht;

huffmancode hc = huffmanencode(ht, weight, n);

printf("\n構建的赫夫曼樹如下(權重-左孩子-右孩子-父親):\n");

for(int i = 1; i <= 2*n-1; i++)

printf("\n每個字元對應的編碼如下:\n");

for(int i = 0; i < n; i++)

printf("\n請輸入待解碼的編碼字串:");

char str[n];

scanf("%s", str);

int hcindex = huffmandecode(ht, str, n);

printf("%s編碼的字元是:%c\n", str, codechar[hcindex-1]);

return 0;

}

結果如下:

Huffman編碼與解碼

近期學習資料結構碰到huffman編碼與解碼問題,自己動手寫了一些,注釋比較全,ok,下面直接貼 include include define telemtype char define wtype int define leafnumber 5 預設權重集合大小 define totalnumbe...

huffman編碼和解碼實現

寫資料結構的實驗確實是蠻麻煩的,下面提供乙個還可以執行的源程式給大家參考,應付實驗老師是綽綽有餘的了 link.h檔案內容 pragma once class link link的實現檔案什麼內容也沒有,所以就不寫啦 huffman.h內容 pragma once include link.h cl...

C 實現Huffman編碼和解碼

using system using system.collections using system.collections.generic using system.linq using system.text namespace stringcompresser public huffman c...