您的位置:首页 > 理论基础 > 数据结构算法

数据结构 Huffman编码实现

2017-04-28 20:31 218 查看
#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

#define OK 1
#define ERROR 0
typedef char TElemType;
typedef char **HuffmanCode;
typedef int Status;

typedef struct
{
TElemType data;
unsigned int weight;
unsigned int parent,lchild,rchild;
} HTNode,*HuffmanTree;

Status Select(HuffmanTree HT,int i,unsigned int &s1,unsigned int &s2)
{
int count = 0;

for(int j =0; j<i; j++)
{
if(HT[j].parent == 0)
{
count ++;
}
}
if(count == 0)
{
return ERROR;
}

int tmp =0;
//最小
for(int j1 =0; j1<i; j1++)
{
if(HT[j1].parent != 0)
{
continue;
}
//--------初始化s1-------
tmp++;
if(tmp == 1)
{
s1 = j1;
}
//-----------------------
if(HT[j1].weight<HT[s1].weight)
{
s1 = j1;
}
}
tmp = 0;
//次小
for(int a = 0; a<i; a++)
{
if(HT[a].parent != 0)
{
continue;
}
//------初始化s2--------
tmp ++;
if(tmp == 1)
{
if(a ==s1)
{
tmp =0;
continue;
}
else
{
s2 = a;
}
}
//--------------------
if(HT[a].weight<HT[s2].weight && a!=s1)
{
s2 = a;
}
}
//cout<<s1<<"--"<<s2<<endl;
return OK;
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,TElemType *d,unsigned int *w,int n)
{
if(n<=1)return;
int  m = 2*n-1;//总结点数
HT = (HuffmanTree)malloc((m)*sizeof(HTNode));
HuffmanTree p;
int i;
//带权重结点初始化(叶子结点)
for(p=HT,i=0; i<n; ++i,++p,++d,++w)
{
*p = {*d,*w,0,0,0};//*******************************
}
//空白结点初始化
for(; i<m; ++i,++p)
{
*p = {'0',0,0,0,0};
}
unsigned int  s1 ;
unsigned int  s2 ;
//构造哈夫曼树
for(unsigned int i1 = n; i1<m; ++i1)
{

Select(HT,i1,s1,s2);//选择parent为0,且权值最小的两个结点
HT[s1].parent = i1;
HT[s2].parent = i1;
HT[i1].lchild = s1;
HT[i1].rchild = s2;
HT[i1].weight = HT[s1].weight+HT[s2].weight;
}
//-----------构造哈夫曼编码-----------------
HC = (HuffmanCode)malloc(n*sizeof(char*));
char * cd = (char *)malloc(n*sizeof(char));
cd[n-1] = '\0';
for(int j = 0; j<n; ++j)
{
int start = n-1;
for(int c= j, f =HT[j].parent; f!=0; c = f,f = HT[f].parent)
{
if(HT[f].lchild == c)
{
cd[--start] = '0';
// cout<<'0';
}
else
{
cd[--start] = '1';
// cout<<'1';
}

}
// cout<<endl;
HC[j] = (char*)malloc((n-start)*sizeof(char));
strcpy(HC[j],&cd[start]);//***********************
}
free(cd);
}

int main()
{
HuffmanTree HT;
HuffmanCode HC;
int number;
cin>>number;
unsigned int *w = new unsigned int[number];
TElemType *d =  new TElemType [number];
//字符集
int i =0;
while(i<number)
{
cin>>d[i++];
}
//权重
i = 0;
while(i<number)
{
cin>>w[i++];
}

//    unsigned int w [10]= {1,2,3,4,5,6,7,8,9,10};
HuffmanCoding(HT,HC,d,w,number);

cout<<"各结点对应编码:"<<endl;
for(int j = 0; j<number; j++)
{
cout<<HT[j].data<<"--"<<HC[j]<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息