#include<iostream>
#include<cmath>
#include<string.h>
using namespace std;
#define MAX_NODE 200
typedef char** Huffmancode;
typedef struct HTNode
{
unsigned int Weight;
unsigned int Parent, Lchild, Rchild;
} HTNode;
void Create_Huffman(unsigned n, HTNode HT[], unsigned m)
{
unsigned int w; int k, j;
for (k = 1; k <m; k++)
{
if (k <= n)
{
printf("\n Please Input Weight : w = ? ");
cin >> w; HT[k].Weight = w;
}
else HT[k].Weight = 0;
HT[k].Parent = HT[k].Lchild = HT[k].Rchild = 0;
}
for (k = n + 1; k < m; k++)
{
unsigned w1 = 32767, w2 = w1;
int p1 = 0, p2 = 0;
for (j = 1; j <= k - 1; j++)
{
if (HT[k].Parent == 0)
{
if (HT[j].Weight < w1)
{
w2 = w1; p2 = p1;
w1 = HT[j].Weight; p1 = j;
}
else if (HT[j].Weight<w2)
{
w2 = HT[j].Weight; p2 = j;
}
}
}
HT[k].Lchild = p1; HT[k].Rchild = p2;
HT[k].Weight = w1 + w2;
HT[p1].Parent = k; HT[p2].Parent = k;
}
}
void Huff_coding(unsigned n, HTNode HT[], unsigned m)
{
int k, sp, fp, p;
char *cd;
Huffmancode HC;
HC = (Huffmancode)malloc((n + 1) * sizeof(char *));
cd = (char *)malloc(m * sizeof(char));
cd[n] = '\0';
for (k = 1; k<n + 1; k++)
{
sp = n; p = k; fp = HT[k].Parent;
for (; fp != 0; p = fp, fp = HT[p].Parent) {
if (HT[fp].Lchild == p) cd[--sp] = '0';
else cd[--sp] = '1';
}
HC[k] = (char *)malloc((n - sp) * sizeof(char));
strcpy(HC[k], &cd[sp]);
}
free(cd);
}