哈夫曼编码

  • 格式:doc
  • 大小:35.00 KB
  • 文档页数:4

# include<iostream>
# include<list>
using std::list;
using namespace std;
struct HNode
{
unsigned int weight;
unsigned int parent;
unsigned int Lchild;
unsigned int Rchild;
};
class Huffman
{
private:
HNode*HTree;
HCode*HCodeTable;
public:
void CreateHTree(int a[],int n);
void CreateCodeTable(char b[],int n);
void Encode(char*s,char*d);
void Decode(char*s,char*d);
int SelectMin(int x,y,i);
char Reverse(int k,char code);
~Huffman();
};
void Huffman::CreateHTree(int a[],int n)
{
HTree=new HNode[2*n-1];
for (int i=0;i<n;i++)
{
HTree[i].weight=a[i];
HTree[i].LChild=-1;
HTree[i].RChild=-1;
HTree[i].parent=-1;
}
int x,y;
for (int i=n;i<2*n-1;;i++)
{
selectMin(x,y,o,i);
HTree[x].parent=HTree[y].parent=i;
HTree[i].weight=HTree[x].weight+HTree[y].weight;
HTree[i].LChild=x;
HTree[i].parent=-1;
}
}
int Huffman::SelectMin(int x,y,o,i)
{
list <int>ilist;
for(int j=0;j<i;j++)
{
if(HTree[j].parent=-1)
ilist.push_back(HTree[j].weight);
}
ilist.sort();
list<int>::iterator it=ilist.begin();
x=*it;
y=*++it;
return x,y;
}
void Huffman::CreateCodeTable(char b[],int n)
{
HCodeTable=new HCode[n];
for(int i=0;i<n;i++)
{
HCodeTable[i].data=b[i];
int child=i;
int parent=HTree[i].parent;
int k=0;
while(parent!=-1)
{
if(child==HTree[parent].Lchild)
HCodeTable[i].code[]='0';
else
HCodeTable[i].code[k]='1';
k++;
child=parent;
parent=HTree[child].parent;
}
HCodeTable[i].code[k]='/0';
HCodeTable[i].code=Reverse(int k,HCodeTable[i].code);
for(int j=0;j<k;j++)
cout<<HCodeTable[i].code[j];
}
}
char* Huffman::Reverse(int k,char*code)
{
char* Reverse(int k,char* code)
{
char*rcode;
for(int i=0;i<k-1;i++)
rcode[i]=code[k-1-i];
return rcode;
}
}
void Huffman::Decode(char*s,char*d) //s为编码串,d为解码串
{
while(*s!='/0')
{
int parent=2*n-1-1;
while(HTree[parent].Lchild!=-1)
{
if(*s=='/0')
parent=HTree[parent].Lchild;
else
parent=HTree[parent].Rchild;
s++;
}
*d=HCodeTable[parent].data;
d++;
}
}
int* Findweight(int*weight)
{
char buffer[100];
int k=0;
const int NUM=26;
int counts[NUM]={0};
int i=0;
do//循环输入每一行字符
{
char buffer[100]="I love data Structure, I love Computer。

I will try my best to study data Structure";
k=0;
while(buffer[k]!='/0')
{
i=tolower(buffer[k])-'a';
counts[i]++;
k++;
}
}while(buffer[0]!='/0');
int j=0;
for(int l=0;l<NUM;l++)
{
if(counts[l]!=0)
{
weight[j]=counts[l];
j++;
}
}
return weight;
}。