typedef struct
{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree; /* å¨æåé
æ°ç»åå¨èµ«å¤«æ¼æ */
typedef char **HuffmanCode; /* å¨æåé
æ°ç»åå¨èµ«å¤«æ¼ç¼ç 表 */
/* æ±èµ«å¤«æ¼ç¼ç */
#include"c1.h"
#include"c6-7.h"
#include"func6-1.c"
void HuffmanCoding(HuffmanTree *HT,HuffmanCode *HC,int *w,int n) /* ç®æ³6.12 */
{ /* wåæ¾n个å符çæå¼(å>0)ï¼æé 赫夫æ¼æ HTï¼å¹¶æ±åºn个å符ç赫夫æ¼ç¼ç HC */
int m,i,s1,s2,start;
unsigned c,f;
HuffmanTree p;
char *cd;
if(n<=1)
return;
m=2*n-1;
*HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); /* 0å·åå
æªç¨ */
for(p=*HT+1,i=1;i<=n;++i,++p,++w)
{
(*p).weight=*w;
(*p).parent=0;
(*p).lchild=0;
(*p).rchild=0;
}
for(;i<=m;++i,++p)
(*p).parent=0;
for(i=n+1;i<=m;++i) /* 建赫夫æ¼æ */
{ /* å¨HT[1ï½i-1]ä¸éæ©parent为0ä¸weightæå°ç两个ç»ç¹ï¼å
¶åºå·åå«ä¸ºs1ås2 */
select(*HT,i-1,&s1,&s2);
(*HT)[s1].parent=(*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+1)*sizeof(char*));
/* åé
n个å符ç¼ç ç头æéåé([0]ä¸ç¨) */
cd=(char*)malloc(n*sizeof(char)); /* åé
æ±ç¼ç çå·¥ä½ç©ºé´ */
cd[n-1]='\0'; /* ç¼ç ç»æ符 */
for(i=1;i<=n;i++)
{ /* é个å符æ±èµ«å¤«æ¼ç¼ç */
start=n-1; /* ç¼ç ç»æ符ä½ç½® */
for(c=i,f=(*HT)[i].parent;f!=0;c=f,f=(*HT)[f].parent)
/* ä»å¶åå°æ ¹éåæ±ç¼ç */
if((*HT)[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
(*HC)[i]=(char*)malloc((n-start)*sizeof(char));
/* 为第i个å符ç¼ç åé
ç©ºé´ */
strcpy((*HC)[i],&cd[start]); /* ä»cdå¤å¶ç¼ç (串)å°HC */
}
free(cd); /* éæ¾å·¥ä½ç©ºé´ */
}
void main()
{
HuffmanTree HT;
HuffmanCode HC;
int *w,n,i;
printf("请è¾å
¥æå¼ç个æ°(>1): ");
scanf("%d",&n);
w=(int*)malloc(n*sizeof(int));
printf("请ä¾æ¬¡è¾å
¥%d个æå¼(æ´å):\n",n);
for(i=0;i<=n-1;i++)
scanf("%d",w+i);
HuffmanCoding(&HT,&HC,w,n);
for(i=1;i<=n;i++)
puts(HC[i]);
}
/*æ æ ééå½éå赫夫æ¼æ ï¼æ±èµ«å¤«æ¼ç¼ç */
#include"c1.h"
#include"c6-7.h"
#include"func6-1.c"
void HuffmanCoding(HuffmanTree *HT,HuffmanCode *HC,int *w,int n) */
{ /* wåæ¾n个å符çæå¼(å>0)ï¼æé 赫夫æ¼æ HTï¼å¹¶æ±åºn个å符ç赫夫æ¼ç¼ç HC */
int m,i,s1,s2; /* æ¤å¥ä¸algo6-1.cä¸å */
unsigned c,cdlen; /* æ¤å¥ä¸algo6-1.cä¸å */
HuffmanTree p;
char *cd;
if(n<=1)
return;
m=2*n-1;
*HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); /* 0å·åå
æªç¨ */
for(p=*HT+1,i=1;i<=n;++i,++p,++w)
{
(*p).weight=*w;
(*p).parent=0;
(*p).lchild=0;
(*p).rchild=0;
}
for(;i<=m;++i,++p)
(*p).parent=0;
for(i=n+1;i<=m;++i) /* 建赫夫æ¼æ */
{ /* å¨HT[1ï½i-1]ä¸éæ©parent为0ä¸weightæå°ç两个ç»ç¹ï¼å
¶åºå·åå«ä¸ºs1ås2 */
select(*HT,i-1,&s1,&s2);
(*HT)[s1].parent=(*HT)[s2].parent=i;
(*HT)[i].lchild=s1;
(*HT)[i].rchild=s2;
(*HT)[i].weight=(*HT)[s1].weight+(*HT)[s2].weight;
}
/* 以ä¸ä¸ºç®æ³6.13ï¼æ æ ééå½éå赫夫æ¼æ ï¼æ±èµ«å¤«æ¼ç¼ç ï¼ä»¥ä¸åç®æ³6.12 */
*HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
/* åé
n个å符ç¼ç ç头æéåé([0]ä¸ç¨) */
cd=(char*)malloc(n*sizeof(char)); /* åé
æ±ç¼ç çå·¥ä½ç©ºé´ */
c=m;
cdlen=0;
for(i=1;i<=m;++i)
(*HT)[i].weight=0; /* éå赫夫æ¼æ æ¶ç¨ä½ç»ç¹ç¶ææ å¿ */
while(c)
{
if((*HT)[c].weight==0)
{ /* åå·¦ */
(*HT)[c].weight=1;
if((*HT)[c].lchild!=0)
{
c=(*HT)[c].lchild;
cd[cdlen++]='0';
}
else if((*HT)[c].rchild==0)
{ /* ç»è®°å¶åç»ç¹çå符çç¼ç */
(*HC)[c]=(char *)malloc((cdlen+1)*sizeof(char));
cd[cdlen]='\0';
strcpy((*HC)[c],cd); /* å¤å¶ç¼ç (串) */
}
}
else if((*HT)[c].weight==1)
{ /* åå³ */
(*HT)[c].weight=2;
if((*HT)[c].rchild!=0)
{
c=(*HT)[c].rchild;
cd[cdlen++]='1';
}
}
else
{ /* HT[c].weight==2ï¼éå */
(*HT)[c].weight=0;
c=(*HT)[c].parent;
--cdlen; /* éå°ç¶ç»ç¹ï¼ç¼ç é¿åº¦å1 */
}
}
free(cd);
}
void main()
{ /* 主ç¨åºåalgo6-1.c */
HuffmanTree HT;
HuffmanCode HC;
int *w,n,i;
printf("请è¾å
¥æå¼ç个æ°(>1): ");
scanf("%d",&n);
w=(int *)malloc(n*sizeof(int));
printf("请ä¾æ¬¡è¾å
¥%d个æå¼(æ´å):\n",n);
for(i=0;i<=n-1;i++)
scanf("%d",w+i);
HuffmanCoding(&HT,&HC,w,n);
for(i=1;i<=n;i++)
puts(HC[i]);
}
温馨提示:答案为网友推荐,仅供参考