建立HUFFMAN树,并进行编码(编码使用逆向编码)
PS:利用了书本上的思想,但不拘泥于书本,特别是在进行编码并显示节点的编码时
#include <malloc.h>
#include <stdio.h>
#define SIZE 5
typedef struct
{
int Parent;//双亲的索引
int value;//数据域数值
int left,right;//左右孩子的索引
}* Huffman,Node;
void Select(Huffman &Huff,int start,int end,int &s1,int &s2)
{
//s1<s2<...
int Miner=0x7FFFFFFF;
int Minest=0x7FFFFFFF;
int x_Miner=-1;
int x_Minest=-1;
for(int i=start;i<=end;i++)
{
if(Huff[i].value<Minest&&0==Huff[i].Parent)
{
x_Miner=x_Minest;
Miner=Minest;
Minest=Huff[i].value;
x_Minest=i;
}
else
{
if(Huff[i].value<Miner&&0==Huff[i].Parent)
{
Miner=Huff[i].value;
x_Miner=i;
}
}
}
s1=x_Minest;
s2=x_Miner;
return ;
}
//先将Huffman的数组建好
void HuffmanCoding(int (&HT)[SIZE])
{
int s1(0),s2(0);
int NodeNumber=2*SIZE-1;
Huffman HuffmanArray=(Huffman)malloc(NodeNumber*sizeof(Node));//哈夫曼数组已经编好了
for(int i=0;i<SIZE;i++)
{
// HuffmanArray[i]={0,HT[i],0,0};//将Huff中的数,复制到HuffmanArray中
HuffmanArray[i].value=HT[i];
HuffmanArray[i].Parent=0;
HuffmanArray[i].left=0;
HuffmanArray[i].right=0;
}
for(int i_c=i;i_c<NodeNumber;i_c++)
{
HuffmanArray[i_c].Parent=0;//把其余节点的Parent都置为0
}
//开始建立节点了
for(;i<NodeNumber;i++)
{
Select(HuffmanArray,0,i-1,s1,s2);//从0节点到i-1节点找两个最小数,返回
HuffmanArray[i].value=HuffmanArray[s1].value+HuffmanArray[s2].value;
HuffmanArray[i].left=s1;
HuffmanArray[i].right=s2;
HuffmanArray[s1].Parent=i;
HuffmanArray[s2].Parent=i;
}
//HuffmanArray[i-1].Parent=0;
//建好节点后,就开始编码了吧
//编码空间最大为:n-1
char * charArray=(char *)malloc((SIZE-1)*sizeof(char));
for(int j=0;j<SIZE;j++)
{
int n=SIZE-1;
int k=j;
int kj=k;
while((k=HuffmanArray[k].Parent)!=0)
{
if(HuffmanArray[k].right==kj)
charArray[n--]='1';
else
charArray[n--]='0';
kj=k;
}
printf("%d的哈夫编码为:\t",HT[j]);
for(int o_k=n+1;o_k<SIZE;o_k++)
{
printf("->%c",charArray[o_k]);
}
printf("\n");
}
free(HuffmanArray);
}
void main()
{
int a[SIZE]={0};
for(int i=0;i<SIZE;i++)
{
a[i]=i+1;
}
//int * b=a;
HuffmanCoding(a);
}
评论
发表评论