#include <stdio.h>
#inlucde <stlib.h>
//定義結構體數組類型
typedef struct
{
char word;//字符域;
int weight;//字符對應的權值域;
int left,right,parent;//分別是左子女,右子女,雙親結點域;
int * code;//編碼域;
}HuffNode;
//CreateHuffmanTree
oid CreateHuffmanTree(HuffNode * F,int n)
{
int loop;
int k1,k2;
int i;
for(loop=0;loop<n-1;loop++)
{
for(k1=0;k1<n+loop&&F[k1].parent!=-1;k1++);//找第一個還未掛上去的結點;
for(k2=k1+1;k2<n+loop&&F[k2].parent!=-1;k2++);//找第二個還未掛上去的結點;
//for循環,出來k1指weight最小,k2指weight次小;
for(i=k2;i<n+loop;i++)
{
if(F[i].parent==-1)
{
if(F[i].weight<F[k1].weight)
{
k2=k1;
k1=i;
}
else if(F[i].weight<F[k2].weight)
k2=i;
}
}
//初始化新生成的雙親結點;
F[i].word='x';
F[i].weight=F[k1].weight+F[k2].weight;
F[i].left=k1;
F[i].right=k2;
F[i].parent=-1;
//初始化k1,k2的雙親域;
F[k1].parent=F[k2].parent=i;
}
}
//CreateHuffmanCode
void CreateHuffmanCode(HuffNode * F,int n)
{
int c,pa,i;
int * p;
for(i=0;i<n;i++)
{
F[i].code=p=(int *)malloc(n*sizeof(int));//初始化code域;
p[0]=0;//p[0]作編碼數組的崗哨,永遠指向最後一位碼,因此初始化0;
c=i;//c表示當前結點下標;
while(F[c].parent!=-1)//循環終止條件:當前結點爲根結點;
{
pa=F[c].parent;
//左子女賦0,右子女賦1;
if(F[pa].left==c)
p[++p[0]]=0;
else
p[++p[0]]=1;
c=pa;
}
}
}
//PrintHuffmanCode
void PrintHuffmanCode(HuffNode * F,int n)
{
int i,j;
for(i=0;i<n;i++)
{
printf("%s",F[i].word);
printf("-----");
for(j=F[i].code[0];j>0;j--)
printf("%d",F[i].code[j]);
printf("\n");
}
}
//main函數體
int main(void)
{
HuffNode * F;
int n,w,i;
char ch;
printf("請輸入葉子結點個數n:");
scanf("%d",&n);
//創建森林
F=(HuffNode *)malloc((2*n+1)*sizeof(HuffNode));
for(i=0;i<n;i++)
{
printf("請輸入word的值:");
scanf("%s",&ch);
F[i].word=ch;
printf("請輸入weight的值:");
scanf("%d",&w);
F[i].weight=w;
F[i].left=F[i].right=F[i].parent=-1;
}
//創建HuffmanTree
CreateHuffmanTree(F,n);
//創建HuffmanCode
CreateHuffmanCode(F,n);
//輸出
PrintHuffmanCode(F,n);
return 0;
}
希望能幫到大家!
我的希望是:世界和平!
嘻嘻!