哈夫曼编码

#include <iostream>
#include <limits.h>
#include <string.h>
#include <stdlib.h>

using namespace std;
#define N 6
typedef struct huffNode
{
int weight;
int lchild, right, parent;
}HTNode, *HuffTree;

typedef char ** HuffCode;
void select(HuffTree HT, int n ,int *s1, int *s2)
{
*s1 = 0;
*s2 = 0;
int min1 = INT_MAX, min2 = INT_MAX;

for(int i = 1; i <= n; i++)
if(HT[i].parent == 0)
{
if(HT[i].weight < min1)
min2 = min1,
*s2 = *s1,
min1 = HT[i].weight,
*s1 = i;
else if(HT[i].weight >= min1 && HT[i].weight < min2)
min2 = HT[i].weight,
*s2 = i;
else
{
;
}
}
}
void HuffmanCode(HuffTree HT, HuffCode HC, int *w, int n)
{
int c, f, i;
int s1, s2;
int m = 2 * n - 1;
char * code;
HT = (HuffTree)malloc((m+1)*sizeof(HTNode));
for(int i = 1; i <= n; i++)
{
HT[i].weight = w[i];
HT[i].lchild = 0;
HT[i].parent = 0;
HT[i].right = 0;
};
for(int i = n + 1; i <= m; i++)
{
HT[i].weight = 0;
HT[i].lchild = 0;
HT[i].parent = 0;
HT[i].right = 0;
}

for(int i = n+1; i<= m; i++)
{
select(HT, i - 1, &s1, &s2);

HT[i].lchild = s1;
HT[i].right = s2;
HT[s1].parent = i;
HT[s2].parent = i;
HT[i].weight = HT[s1].weight + HT[s2].weight;
}
HC = (HuffCode)malloc((n+1)*sizeof(char *));
code = (char *)malloc((n)*sizeof(char));
code[n-1] = '\0';

for(int i = 1; i <= n; i++)
{
int start = n - 1;
for(c = i,f = HT[i].parent; f!=0;c = f, f = HT[f].parent)
if(HT[f].lchild == c)
code[--start] = '0';
else
code[--start] = '1';
HC[i] = (char *)malloc((n-start) * sizeof(char));
strcpy(HC[i], &code[start]);

}
free(code);
}

int main(void)
{
char key[N] = {'0', 'A', 'B', 'C', 'D', 'E'};
int w[N] = {0,1,2,4,5,6};
HuffTree HT;
HuffCode HC;
HuffmanCode(HT, HC, w, N-1);
for(int i = 1; i <= N; i++)
cout << HC[i];

return 0;
}

posted @ 2016-07-18 20:05  JungleHuter  阅读(108)  评论(0编辑  收藏  举报