資料結構之赫夫曼編碼和解碼(C實現)

2021-08-20 05:31:35 字數 1881 閱讀 6014

資料結構之赫夫曼編碼和解碼(c實現)

編譯器:dev-c++ 5.11

執行環境:win10 64bit

by:wain

at:stu

*/#include

#include

#include

typedef

struct htnode, *huffmantree; //動態分配陣列儲存哈夫曼樹

typedef

char **huffmancode; //動態分配陣列儲存哈夫曼編碼表

void select(huffmantree ht, int i, int *s1, int *s2) else

if(j==1)

}else; //c語言貌似不能這樣賦值呢

p->weight = *w;

p->parent = 0; p->lchild = -1; p->rchild = -1;

}for (; i//*p = ;

p->weight = 0;

p->parent = 0; p->lchild = 0; p->rchild = 0;

}for (i=n; i//建哈夫曼樹

//在ht[0..i-1]選擇parent為0且weight最小的兩個結點,其序號分別為s1和s2

unsigned

int s1, s2;

select((*ht), i, &s1, &s2);

(*ht)[s1].parent = i; (*ht)[s2].parent = i;

(*ht)[i].lchild = s1; (*ht)[i].rchild = s2;

(*ht)[i].weight = (*ht)[s1].weight + (*ht)[s2].weight;

}//---從葉子到根逆向求每個字元的哈夫曼編碼---

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

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

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

int start, f, c;

for (i=0; i1;

for (c = i, f = (*ht)[i].parent; f != 0; c = f, f = (*ht)[f].parent)

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

strcpy((*hc)[i], &cd[start]);

}free(cd);

}int main()

huffmantree ht;

huffmancode hc;

huffmancoding(&ht, &hc, w, n);

printf("\n各字元對應的編碼為:\n");

for(i=0; iprintf("%c %s\n",c[i],hc[i]);

} char str[1000]; //存01二進位製流

printf("\n請輸入一串01二進位製流:\n");

scanf("%s",&str);

char *s = str;

int p;

printf("解碼為:\n");

while(*s!='\0')

printf("%c",c[p]);

}free(c);

free(w);

return

0;}《資料結構(c語言版)》嚴蔚敏、吳偉民 ———演算法 6.

資料結構C語言版之赫夫曼編碼

此部落格 思想參考了嚴蔚敏老師的教材,特此宣告 說明 這裡以8個葉子結點為例.ht和hc的具體轉變過程見書本p149頁 有些結點左右孩子的順序稍有不同,但是不影響 輸出 ht 1 0 0 0 1 ht 2 1 0 ht 3 1 1 1 0 ht 4 1 1 1 1 ht 5 1 1 0 ht 6 0...

資料結構學習日誌之十六 赫夫曼編碼

赫夫曼編碼可以很有效的壓縮資料。我們先來看幾個名詞 1.定長編碼 像ascii編碼,每個字元8位。2.變長編碼 單個編碼的長度不一致,可以根據整體出現頻率來調節 3.字首編碼 任意乙個字元的編碼都不是另乙個字元的編碼的字首。我們可以利用二叉樹來設計二進位制的字首編碼。假設有一棵如上圖的二叉樹,其4個...

資料結構Huffman編碼解碼

1 需求分析 1.1問題描述 問題描述 利用哈夫曼編碼進行通訊可以大大提高通道利用率,縮短資訊傳輸時間,降低傳輸成本。但是,這要求在傳送端通過乙個編碼系統對待傳資料預先編碼,在接收端將傳來的資料進行解碼 解碼 對於雙工通道 即可以雙向傳輸資訊的通道 每端都需要乙個完整的編 解碼系統。試為這樣的資訊收...