?? huffman.txt
字號:
/Huffman編碼的實現,僅供學習、交流
//2009.3.23
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50
typedef struct{
char c; //輸入的元素;
int w; //元素權值;
char code[MaxSize]; //元素的Huffman編碼;
}HuffCode[MaxSize];
typedef struct{
int Weight; //權值;
int LChild,RChild,Parent;
}HTNode,HuffTree[MaxSize];
//====================================================================
void HuffmanTree(HuffTree HT,int length,HuffCode hc); //生成Huffman樹;
void SelectHTNode(HuffTree HT,int n,int *min1,int *min2); //查找最小和次小序號;
void HuffmanCode(HuffTree HT,int len,HuffCode hc); //生成Huffman編碼;
//====================================================================
int main(void)
{
HuffTree HT; //Huffman樹;
HuffCode HC; //Huffman編碼;
int i,len;
printf("——Huffman編碼的實現——\n\n請同學們理解Huffman編碼的思想和程序實現的方法\n\n");
printf("\n輸入代碼數量:");
scanf("%d",&len); system("cls");printf("代碼數量:%2d\n\n",len);
printf("輸入代碼及權值(例如: \"a16[回車]\" ):\n");
for(i=1;i <= len;i++)
{
while(getchar() != '\n') NULL;
printf("No.%2d: ",i);
HC[i].c = getchar();
scanf("%d",&HC[i].w);
}
HuffmanTree(HT,len,HC);
HuffmanCode(HT,len,HC);
printf("\n輸出Huffman編碼:\n");
for(i = 1;i<=len;i++)
{
printf("\n %c :",HC[i].c);
puts(HC[i].code);
}
//測試Huffman樹結構;
printf("\n\n輸出Huffman樹結構:");system("pause");
printf("\nHT[i]:\t權值\t雙親\t左孩子\t右孩子\n");
for(i = 1;i<2*len;i++)
{
if(i <= len)
printf("(%c)",HC[i].c);
printf("%2d:\t %2d;\t%2d,\t %2d,\t %2d.\n",\
i,HT[i].Weight,HT[i].Parent,HT[i].LChild,HT[i].RChild);
}
return 0;
}
//====================================================================
//生成Huffman樹
void HuffmanTree(HuffTree HT,int length,HuffCode hc) //Huffman樹初始化;
{
int i,min1,min2;
HT[0].Weight = 65535;
for(i = 1;i <= length;i++)
{
HT[i].Weight = hc[i].w;
HT[i].LChild = HT[i].RChild = HT[i].Parent = -1;
}
for(;i < 2*length;i++) //i初值 = length+1;
{
HT[i].LChild = HT[i].RChild = HT[i].Parent = -1;
}
for(i = length+1;i < 2*length;i++)
{
SelectHTNode(HT,i,&min1,&min2);
HT[min1].Parent = i;
HT[min2].Parent = i;
HT[i].LChild = min1;
HT[i].RChild = min2;
HT[i].Weight = HT[min1].Weight + HT[min2].Weight;
}
}
//====================================================================
void SelectHTNode(HuffTree HT,int n,int *min1,int *min2) //查找最小和次小序號;
{
int i;
*min1 = *min2 = 0;
for(i = 1;i < n;i++)
{
if(HT[i].Parent == -1)
{
if(HT[*min1].Weight >= HT[i].Weight)
{
*min2 = *min1;
*min1 = i;
}
else if(HT[*min2].Weight > HT[i].Weight) *min2 = i;
}
}
}
//==================================================================
void HuffmanCode(HuffTree HT,int len,HuffCode hc) //生成Huffman編碼;
{
int i,j,tc,Stack[MaxSize],top = -1;
char flag[MaxSize];
HTNode th;
for(i = 1;i <= len;i++)
{
top = -1; //棧初始化;
j = 0; //hc[i].code串首位置偏移;
th = HT[i]; //當前結點th;
tc = i; //當前結點標記tc;
while(th.Parent != -1)
{ //當前結點th雙親P入棧,由P的孩子是th,確定flag;確定下次結點標記tc;
Stack[++top] = th.Parent;
if(HT[th.Parent].LChild == tc) {flag[top] = 'L'; tc = th.Parent;}
if(HT[th.Parent].RChild == tc) {flag[top] = 'R'; tc = th.Parent;}
th = HT[Stack[top]]; //下一結點;
}
while(top != -1)
{
if(flag[top] == 'L') hc[i].code[j++] ='0';
else hc[i].code[j++] ='1';
Stack[top--]; //出棧;
}
hc[i].code[j] ='\0'; //當前串結束;
}
}
//===================================================================
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -