可能编译时会有些语法小错误(比如分号,->,等),很容易就自己纠正了哦,思路绝对是完全正确的,所以用的话就自己试着改改吧,直接复制粘贴,就正确,岂不是太没写代码体验了,自己改改才印象更加深刻的呢(▽)~~~~;
//根据赫夫曼树求赫夫曼编码
#include<iostream>
using namespace std;
typedef struct{
int weight;
int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
void Select(HuffmanTree HT,int len,int&s1,int &s2){
int i,min1=0x3f3f3f3f,min2=0x3f3f3f3f;
for(i=1;i<len;i++){
if(HT[i].weight<min1&&HT[i].parent==0){
min1=HT[i].weight
s1=i;
}
}
int temp=HT[s1].weight
HT[s1].weight=0x3f3f3f3f;
for(i=1;i<=len;i++){
if(HT[i].weight<min2&&HT[i]parent==0){
min2=HT[i].weight;
s2=i;
}
}
HT[s1].weight=temp;
}
void CreateHuffmanTree(HuffmanTree &HT,int n){
int m,s1,s2,i;
if(n<=1) 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;
}
cout<<"please input the weigth of leaf child:
";
for(i=1;i<=n;++i){
cin>>HT[i].weight;
}
for(i=m+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;
}
}
void CreateHuffmanCode(HuffmanTree HT,HuffmanCode &HC,int n){
int i,start,c,f;
HC=new char*[n+1];
char *cd=new char[n];
cd[n-1]=' ';
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;
}
void show(HuffmanTree,HuffmanCode HC){
for(int i=1;i<=sizeof(HC)+1;i++){
cout<<HT[i].weight<<"result is:
"<<HC[i]<<endl;
}
}
void main(){
HuffmanTree HT;
HuffmanCode HC;
int n;
cout<<"please input the number of leaf child:
";
CreateHuffmanTree(HT,n);
CreateHuffmanCode(HT,HC,n);
show(HT,HC);
}