64,654
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include<stdio.h>
#include<string.h>
typedef char **HuffmanCode;
typedef struct
{
int weight;
int parent;
int lchild;
int rchild;
}HTNode,*HuffmanTree;
void select(HuffmanTree &HT,int m,int &S1,int &S2)
{
int j;
S1=0;
S2=0;
for(j=1;j<=m;j++)
{
while(HT[j].parent==0)
{
if(HT[j].weight<HT[S1].weight)
S1=j;
}
}
for(j=1;j<=m;j++)
{
while(HT[j].parent==0&&j!=S1)
{
if(HT[j].weight<HT[S2].weight)
S2=j;
}
}
}
void CreateHuffmanTree(HuffmanTree &HT,int n,int &S1,int &S2)
{
int m;
int i;
if(n<=1)
{printf("叶子结点不足2个\n");
return;}
m=2*n-1;
HT=new HTNode[m+1];
for(i=1;i<m;i++)
{
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for(i=1;i<=n;i++)
{
printf("请输入第%d个叶子结点的权值(频率*100)\n",i);
scanf("%d",&HT[i].weight);
}
/*初始化结束*/
for(i=n+1;i<=m;i++)
{
select(HT,i-1,S1,S2);
HT[S1].parent=i;
HT[S2].parent=i;
HT[i].lchild=S1;
HT[i].rchild=S2;
HT[i].weight=HT[S1].weight+HT[S2].weight;
}
printf("哈夫曼树创建完成\n");
}
void CreateHuffmanCode(HuffmanTree HT,HuffmanCode &HC,int n)
{
int i,c,f;
int start;
char cd[n];
HC=new char*[n+1];
cd[n-1]='\0';
for(i=1;i<n;i++)
{
start=n-1;
c=i;f=HT[i].parent;
while(f!=0)
{
--start;
if(HT[f].lchild==c)
cd[start]='0';
else
cd[start]='1';
c=f;f=HT[f].parent;
}
HC[i]=new char[n-start];
strcpy(HC[i],&cd[start]);
}
delete cd;
}
int main()
{
int S1,S2;
int n;
HuffmanTree HT;
HuffmanCode HC;
printf("请输入叶子结点个数\n");
scanf("%d",&n);
CreateHuffmanTree(HT,n,S1,S2);
CreateHuffmanCode(HT,HC,n);
}