哈弗曼树,哈弗曼编码,及其翻译

#include<iostream>

using namespace std;

static char* r;

static int v;

typedef struct{

int weight;

int lch,rch,par;

}HTNode,*HuffmanTree;

typedef char** HuffmanCode;

int select( HuffmanTree &T,int m,int &s1,int &s2){

for(int i=1;i<=m;i++)

{if(T[i].par==0)break;}

int min3;

int min1=T[i].weight;

int q=i;

int p;

i++;

for(i;i<=m;i++)

{

if(T[i].par==0&&T[i].weight<min1)

{q=i;min1=T[i].weight;}

}

for(int j=1;j<=m;j++)

if(T[j].par==0&&j!=q)break;

p=j;

min3=T[j].weight;

j++;

for(j;j<=m;j++)

{

if(T[j].par==0&&T[j].weight<min3&&j!=q)

{

p=j;

min3=T[j].weight;

}

}

s1=q;

s2=p;

return 0;

}

int strcpy(char*a,char*b,int n){

int i=0;

while(b[n])

{

a[i]=b[n];

i++;

n++;

}

a[i]=’\0′;

return 0;

}

void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n){

int m=2*n-1;

HuffmanTree p=HT;

p++;

int s1,s2;

HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));

for(int i=1;i<=n;++i,++w) 

{

HT[i].lch=0;

HT[i].rch=0;

HT[i].par=0;

HT[i].weight=*w;

}

for(;i<=m;++i) 

{

HT[i].lch=0;

HT[i].rch=0;

HT[i].par=0;

HT[i].weight=0;

}

for(i=n+1;i<=m;++i){

select(HT,i-1,s1,s2);

HT[s1].par=i;

HT[s2].par=i;

HT[i].lch=s1;

HT[i].rch=s2;

HT[i].weight=HT[s1].weight+HT[s2].weight;

}

HC=(HuffmanCode)malloc((n+1)*sizeof(char *));

char*cd;

cd=(char*)malloc(n*sizeof(char));

cd[n-1]=’\0′;

for( i=1;i<=n;i++)

{

int z=i;

  int start=n-1;

  while(HT[z].par)

  {

 int j=HT[z].par;

 if(HT[j].lch==z)

  cd[–start]=’1′;

 else

 cd[–start]=’0′;

z=j;

  }

  HC[i]=(char*)malloc((n-start)*sizeof(char));

  strcpy(HC[i],cd,start);

 }

free(cd);

}

int compare(char*a,char*b){

int i=0;

while(a[i]!=’\0’||b[i]!=’\0′)

{

if(a[i]!=b[i]) return 0;

i++;

}

return 1;

}

int translate(HuffmanTree &HT,HuffmanCode &HC,char *a,int m)

{ int z=m;

int i=0,j=0;

char b[20];

while(HT[z].lch&&a[i]!=’\0′){

  if(HT[z].lch!=0&&a[i]==’1′)

  {

  b[j]=’1′;

  i++;

  j++;

  z=HT[z].lch;

  }

  else if(HT[z].lch!=0&&a[i]==’0′)

  {

  b[j]=’0′;

  i++;

  j++;

  z=HT[z].rch;

  }

  if(HT[z].lch==0)

  {

  b[j]=’\0′;

  for(int p=1;p<=v;p++)
 

  if(compare(HC[p],b)) break;

  cout<<r[p-1];

 

  j=0;

  z=m;

  }

  }

return 0;

  

}

 

int main(){

cout<<“请输入字符个数:”;

cin>>v;

r=(char*)malloc(v*sizeof(char));

int *a;

a=(int *)malloc(v*sizeof(int));

for(int x=0;x<v;x++)

{

cout<<“输入字符”<<x+1<<‘:’;

cin>>r[x];

cout<<r[x]<<“的权值:”;

cin>>a[x];

}

int m=v*2-1;

HuffmanTree HT;

HuffmanCode HC;

HuffmanCoding(HT,HC,a,v);

for(int i=1;i<=v;i++)

cout<<r[i-1]<<“:”<<HC[i]<<endl;

char *u=(char*)malloc(50*sizeof(char));

cin.ignore();

cout<<“请输入代码(小于50个,按回车结束)”<<endl;

char c;

c=getchar();

int k=0;

while(c!=’\n’){

u[k]=c;

k++;

c=getchar();

}

u[k]=’\0′;

cout<<“您输入的代码是:”<<u<<endl;

cout<<“翻译后:”;

translate(HT,HC,u,m);

cout<<endl;

return 0;

}
《哈弗曼树,哈弗曼编码,及其翻译》

    原文作者:哈夫曼树
    原文地址: https://blog.csdn.net/LLXLQY/article/details/51325079
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞