哈夫曼編碼演算法實現

2021-06-19 06:15:58 字數 1184 閱讀 9441

/*哈夫曼編碼實現huffmantree.c*/

#include#include#includetypedef struct

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

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

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

else

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

void crthuffmantree(huffmantree *ht,huffmancode *hc,float *w,int n)

for(i=n+1;i<=m;i++) //非葉子節點初始化

for(i=n+1;i<=m;i++) //建立非葉子節點,建造哈夫曼樹

/*哈夫曼樹建造完畢*/

/*從葉子到根,逆向求每個葉子節點對應的哈夫曼編碼*/

*hc=(huffmancode)malloc((n+1)*sizeof(char *));//分配乙個指標陣列儲存n個編碼(1~n)的頭指標

cd=(char *)malloc(n*sizeof(char)); //分配求當前編碼的臨時空間

cd[n-1]='\0'; //從右向左逐位存放編碼,首先存放編碼結束符

for(i=1;i<=n;i++) /*求n個葉子節點對應的哈夫曼編碼*/

free(cd);

}int main()

n=n-1;

printf("請輸入%d個字母: ",n);

fflush(stdin);

fgets(word+1,n+1,stdin);

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

printf("對應的哈夫曼編碼依次是: \n");

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

printf("%s\n",hc[i]);

printf("請輸入要解碼的0,1序列:");

scanf("%s",ch);

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

if(strcmp(ch,hc[i])==0)

break;

printf("該字母是:%c\n",word[i]);

return 0;

}

演算法 哈夫曼編碼

計算機中使用二進位制編碼字元 哈夫曼編碼是通過構造哈夫曼樹得到的,哈夫曼樹是通過貪心演算法得到的 貪心演算法構造哈夫曼樹 將字元出現的次數作為哈夫曼樹的權值,按照貪心演算法,選擇權值最小的兩個結點,成為乙個數的左右結點 左右子結點的權值變為子樹根的權值 然後在餘下的結點中遞迴選用最小的兩個結點 根據...

哈夫曼編碼實現

define huffmancode char typedef struct node huffmantree struct node 葉節點為n的哈夫曼樹有2 n 1個節點 用 1表示當前parent未被訪問 huffmantree createhuffmantree int wet,int n ...

實現哈夫曼編碼

include include include include include using namespace std typedef struct node vector nodes 表示結點的指標組 double char number 0 每個字元平均花費的編碼長度 const int cha...