哈夫曼编码:
#include<iostream>
#include<cstring>
using namespace std;
typedef struct{
char data;
int weight;
int parent, left, right;
}HTNode, *HuffmanTree;
int n;
char a[1005];
int b[1005] = {0};
string s;
void Select(HuffmanTree &HT, int end, int *s1, int *s2)
{
int min1, min2;
int i = 1;
while(HT[i].parent != 0 && i <= end){
i++;
}
min1 = HT[i].weight;
*s1 = i;
i++;
while(HT[i].parent != 0 && i <= end){
i++;
}
if(HT[i].weight < min1){
min2 = min1;
*s2 = *s1;
*s1 = i;
min1 = HT[i].weight;
}else{
*s2 = i;
min2 = HT[i].weight;
}
for(int j = i+1; j <= end; j++){
if(HT[j].parent != 0) continue;
if(HT[j].weight < min1){
min2 = min1;
*s2 = *s1;
*s1 = j;
min1 = HT[j].weight;
}else if(HT[j].weight >= min1 && HT[j].weight < min2){
min2 = HT[j].weight;
*s2 = j;
}
}
}
void CreatHuffman(HuffmanTree &HT){
cout<<"请输入字符信息:\n";
cin>>s;
int k = 1;
int cunt = s.length();
for(int i = 0; i < cunt; i++){
int j = 1;
for(j = 1; j < k; j++){
if(s[i] == a[j]){
b[j]++;
break;
}
}
if(j == k){
a[k] = s[i];
b[k]++;
k++;
}
}
n = k-1;
if(n <= 1) return;
int m = 2*n-1;
HT = (HTNode*)malloc(sizeof(HTNode)*(2*n));
for(int i = 1; i <= n; i++){
HT[i].weight = b[i];
HT[i].parent = 0;
HT[i].left = 0;
HT[i].right = 0;
HT[i].data = a[i];
}
for(int i = n+1; i <= m; i++){
HT[i].weight = 0;
HT[i].parent = 0;
HT[i].left = 0;
HT[i].right = 0;
}
for(int i = n+1; i <= m; i++){
int s1,s2;
Select(HT,i-1,&s1,&s2);
HT[i].left = s1;
HT[i].right = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
HT[s1].parent = i;
HT[s2].parent = i;
}
}
typedef char** huffmanCode; //第一个*是代表它是指针变量,说明它是数组
//第二个*说明它是指针数组,代表这个char类型数组里每个元素都是*huffmanCode变量
void HuffmanCode(HuffmanTree HT, huffmanCode &HC){
HC = (huffmanCode)malloc(sizeof(huffmanCode)*(n+1));
char* cd = (char*)malloc(sizeof(char) * n);
int start = 0, c = 0, f = 0;
cd[n-1] = '\0';
for(int i = 1; i <= n; i++){
start = n-1;
c = i;
f = HT[i].parent;
while(f != 0){
start--;
if(HT[f].left == c){
cd[start] = '0';
}else{
cd[start] = '1';
}
c = f;
f = HT[c].parent;
}
HC[i] = (char*)malloc(sizeof(char) * (n - start));
strcpy(HC[i],&cd[start]);
}
free(cd);
}
int main()
{
HuffmanTree HT;
huffmanCode HC;
CreatHuffman(HT);
HuffmanCode(HT,HC);
cout<<n<<"\n";
for(int i = 1; i <= n; i++){
cout<<HT[i].data<<":"<<HC[i]<<"\n";
}
for(int i = 0; i < s.length(); i++){
for(int j = 1; j <=n; j++){
if(s[i] == HT[j].data){
cout<<HC[j]<<" ";
}
}
}
cout<<"\n";
string ss;
cout<<"请输入想要解码的信息:\n";
cin>>ss;
string sss;
for(int i = 0; i < ss.length(); i++){
sss += ss[i];
for(int j = 1; j <= n; j++){
if(sss == HC[j]){
sss.clear();
cout<<HT[j].data;
}
}
}
return 0;
}