赫夫曼樹和赫夫曼編碼

2021-07-06 03:57:42 字數 1599 閱讀 3879

#include 

#define maxsize 128

//字元表

typedef struct table;

//哈夫曼樹節點

typedef struct hfmtree;

//哈夫曼編碼

typedef struct hfmcode;

hfmtree hdata[2*maxsize-1];

hfmcode code[maxsize];

intcount = 0;

void insrtch(char

str,char ch)

str[len+1] = '\0';

while(len!=0)

str[0] = ch;

}int length(char *str)

return len;

}int getext();

fopen_s(&fp,"d:\\text.txt","r");

while(fread(&buf,1,1,fp))

fclose(fp);

//赫夫曼森林種樹

for(i=0;iif(tb[i].repeat !=0)

}//列印字元表

printf_s("\nnow,output the text table......\n");

getchar();

for(i=0;ireturn0;}

int buildtree()

}if (reset == 0)

else

if (tnum<2) break;

tnum=0;

small = 65636;

}printf_s("\nnow,output the huffman tree......\n");

getchar();

for(i=0;i<2*count-1;i++)

printf("%d: %c,%u,%d,%d,%d\n",i,hdata[i].data,hdata[i].weight,hdata[i].parent , hdata[i].lchild,hdata[i].rchild );

return0;}

int code()

}for (i = 0; i < count; i++)

return0;}

int encode()}}

printf("\n");

fclose(fpr);

fclose(fpw);

return0;}

int decode()

}fclose(fp);

printf_s("\ncongratulations! we success !\n");

return0;}

int main()

getext();//獲得字元重複次數

buildtree();//建立赫夫曼二叉樹,陣列儲存

code();//字首編碼

encode();//對一串文字進行編碼,儲存到文字檔案

decode();//對輸入的乙個或一串編碼進行解碼

getchar();

return

0;}

赫夫曼樹和赫夫曼編碼

赫夫曼樹 1 先把有權值的葉子節點按照從小到大的順序排成乙個有序序列,即 a 5 e 10 b 15 d 30 c 40 2 取前兩個權值最小的結點即a 5 和e 10 作為乙個新的結點n1的兩個子節點,結點權值較小的作為左結點,即a為左結點,e為右結點,n1的權值為兩個結點權值的和,即5 10 1...

赫夫曼樹和赫夫曼編碼

以下內容主要參考了嚴蔚敏版的資料結構教材。赫夫曼樹又叫做最優樹,是一類帶權路徑長度最短的樹,這裡討論的是最優二叉樹。假設現在有n個權值w1,w2,w nw 1,w 2,w n w1 w2 wn 如何構造一顆有n個葉子節點的二叉樹使得二叉樹的帶權路徑長度 k 1nwk lk sum n w k l k...

赫夫曼樹與赫夫曼編碼

問題描述 利用huffman編碼進行通訊可以大大提高通道利用率,縮短資訊傳輸時間,降低傳輸成本。但是,這要求在傳送端通過乙個編碼系統對待傳資料預先編碼,在接受端將傳來的資料編碼進行解碼 復原 對於有些通道,每端都需要乙個完整的編 解碼系統。試為這樣的資訊收發站編寫乙個huffman的編 解碼系統。給...