#include<iostream.h>
#include "type.h"
void main()
{
int a[]={5,29,7,8,14,23,3,11};
HuffmanTree HT;
HuffmanCode HC;
HuffmanCoding(HT,HC,a,8);
}#include "type.h"
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)
{ int m,i,s1,s2;
HuffmanTree p;
char *cd;
int q,cdlen;
int start,c,f,j;
if(n<1) return;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(p=HT+1,i=1;i<=n;++i,++p,++w)
{ p->weight=*w;
p->parent=0;
p->lchild=0;
p->rchilcd=0;
}
for(;i<=m;++i,++p)
{p->weight=0;
p->parent=0;
p->lchild=0;
p->rchilcd=0;
}
for(i=n+1;i<=m;++i)
{ s1=Select(HT,i-1);
HT[s1].parent=i;
s2=Select(HT,i-1);
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchilcd=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
HT[i].parent=0;
}
for(j=1;j<=15;j++)
{ cout<<HT[j].weight<<" ";
cout<<HT[j].parent<<" ";
cout<<HT[j].lchild<<" ";
cout<<HT[j].rchilcd<<" ";
cout<<endl;
}
HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
cd=(char *)malloc(n*sizeof(char));
q=m; cdlen=0;
for(i=0;i<=m;i++)
HT[i].weight=0;
while(q)
{ if(HT[q].weight==0)
{
HT[q].weight=1;
if(HT[q].lchild!=0)
{
q=HT[q].lchild;
cd[cdlen++]='0';
}
else if(HT[q].rchilcd==0)
{ HC[q]=(char *)malloc((cdlen+1)*sizeof(char));
cd[cdlen]='0';
for(j=1;j<cdlen;j++)
cout<<cd[j];
cout<<endl;
}
}
else if(HT[q].weight==1)
{ HT[q].weight=2;
if(HT[q].rchilcd!=0)
{
q=HT[q].rchilcd;
cd[cdlen++]='1';
}
}
else
{ HT[q].weight=0;
q=HT[q].parent;
--cdlen;
}//else
}//while
}
/* 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));
for(m=3;m<=n-start+1;m++)
cout<<cd[m];
cout<<endl;
}*/
int Select(HuffmanTree HT,int a)
{ int j,exp;
int min=100;
for (j=1;j<=a;j++)
{
if(HT[j].parent==0&&min>HT[j].weight)
{
min=HT[j].weight;
exp=j;
}
}
return exp;
}
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define FALSE 0
#define TRUE 1
#define ERROR 0
#define OK 1
typedef struct{
int weight;
int parent,lchild,rchilcd;
}HTNode, *HuffmanTree;
typedef char * *HuffmanCode;
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n);
int Select(HuffmanTree HT,int a);