以后上课要好好听,这落下的花了好几个小时才搞懂,以前学的指针也忘了,
不知不觉的都快五点了赶快睡觉
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct n
{
int w;
int parent, lchild, rchild;
} HTNode, *HuffmanTree; //动态分配数组存储哈夫曼树
typedef char * * HuffmanCode; //动态分配数组存储哈夫曼编码表
HuffmanTree HT;
HuffmanCode HC;
int *w;
char *z;
int flag=0;
int numb=0;
int cmp(const void *a,const void *b)
{
struct n *aa=(struct n *)a;
struct n *bb=(struct n *)b;
return aa->w-bb->w;
}
void select(int i,int *a,int *b)//查找两个最小的点
{
int n,t,m;
qsort(HT,i,sizeof(HT[1]),cmp);
for(t=1;t<=i;t++)
{
if(HT[t].parent==0)
{
*a=t;
break;
}
}
for(t=t+1;t<=i;t++)
{
if(HT[t].parent==0)
{
*b=t;
break;
}
}
return ;
}
void HTree(int *w,int n)
{
int m,i,j,k,s1,s2;
if(n<=1)return ;
m=2*n;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
HuffmanTree p;
for(p=HT+1,i=1;i<=n;++p,i++)
{
p->w=w[i];p->parent=0;
p->lchild=0;p->rchild=0;
}
for(;i<m;++p,i++)
{
p->w=0;p->parent=0;
p->lchild=0;p->rchild=0;
}
for(i=n+1;i<m;i++)
{
select(i-1,&s1,&s2);
// printf("%d %d\n",s1,s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].w=HT[s1].w+HT[s2].w;
}
}
void GetHCood(int n)
{
int i,j,k,start,c,f;
char *cd;
HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
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));
strcpy(HC[i],&cd[start]);
}
free(cd);
return ;
}
int main()
{
int i,n,j;
int a[22222];
printf("请输入n(代表有n个权值):");
while(scanf("%d",&i),i!=0)
{
printf("请输入n个权值:\n");
for(j=1;j<=i;j++)
scanf("%d",&a[j]);
HTree(a,i);
GetHCood(i);
for(j=1;j<=i;j++)
printf("%d的哈夫曼编码是%s\n",j,HC[j]);
printf("请输入n(代表有n个权值):");
}
return 0;
}