69,382
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <string.h>
#include <malloc.h>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef struct
{
int weight;
int parent, lchild, rchild;
}HTNode, *HuffmanTree;
typedef char **HuffmanCode;
Status Select(HuffmanTree HT, int m, int &s1, int &s2)
{
int i, min1, min2;
min1 = min2 = 32767;
s1 = s2 = -1;
for (i=0; i<m; i++)
{
if (HT[i].parent == -1)
{
if (min1 >= HT[i].weight)
{
min2 = min1;
s2 = s1;
min1 = HT[i].weight;
s1 = i;
}
else
{
if (min2 >= HT[i].weight)
{
min2 = HT[i].weight;
s2 = i;
}
}
}
}
return OK;
}
Status HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n)
{
int m, i, s1, s2;
HTNode *p;
if (n <= 1)
return ERROR;
m = 2 * n - 1;
HT = (HuffmanTree)malloc((m + 1) * sizeof(HTNode));
for (p=HT, i=0; i<n; i++, p++, w++)
{
p->weight = *w;
p->parent = -1;
p->lchild = -1;
p->rchild = -1;
}
for (; i<m; i++, p++)
{
p->weight = 0;
p->parent = -1;
p->lchild = -1;
p->rchild = -1;
}
for (i=n; i<m; i++)
{
Select(HT, i, 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;
}
return OK;
}
void OutCode(HuffmanTree &HT, int leaf, int child)
{
HTNode Tmp;
if (leaf == -1)
{
cout << endl;
return;
}
Tmp = HT[leaf];
if((Tmp.lchild == -1) && (Tmp.rchild == -1))
{
cout << Tmp.weight << ":";
}
else
{
if(Tmp.lchild == child)
cout << "0";
else
cout << "1";
}
OutCode(HT, Tmp.parent, leaf);
}
void main()
{
HuffmanTree HT;
HuffmanCode HC;
int w[8] = {5, 29, 7, 8, 14, 23, 3, 11};
HuffmanCoding(HT, HC, w, 8);
for(int i=0; i<8; i++)
OutCode(HT, i, -1);
}