#include<iostream>
#include<fstream>
#include<string>
using namespace std;
typedef struct SC
{
char ss[100];//所有字符串
char s[100];//不重复的字符串
int si[100];//每个字符的总数
int per[100];
int i;//字符数
string str[100];//code
int count;//总数
double CountPer;//压缩率
int mixlen;//编码的最长长度
}SC;
void MaxLen(SC &s);
string OutHufCode(char c,SC s);
double compress(SC s);
void HufumanCode(SC &s);
void InitSC(SC &s);
int Search(SC s,char c);
void SortSC(SC &s);
int main()
{
ifstream fin("Input.txt");
ofstream fout("Output.txt");
char c,c1;
SC s;InitSC(s);
int i=0;
while(!fin.eof())
{
fin>>c;
if(fin.get()=='\n')
break;
s.ss[s.count++]=c;
if(Search(s,c)==-1)
{
s.s[s.i]=c;
s.si[s.i]++;
s.i++;
}
else
{
s.si[Search(s,c)]++;
}
}
for(i=0;i<s.i;i++)
{
cout<<s.s[i]<<"\t"<<s.si[i]<<endl;
}
SortSC(s);
cout<<"**********\n";
for(i=0;i<s.i;i++)
{
cout<<s.si[i]<<endl;
}
cout<<"**********\n";
for(i=0;i<s.i;i++)
{
cout<<s.s[i]<<endl;
}
HufumanCode(s);
cout<<"**********\n";
for(i=0;i<s.i;i++)
{
cout<<s.str[i]<<endl;
}
cout<<"***********************\n";
for(i=0;i<s.count;i++)
{
cout<<OutHufCode(s.ss[i],s);
}
cout<<endl;
cout<<compress(s)<<endl;
return 0;
}
double compress(SC s)
{
int total=0;int i;
MaxLen(s);
for(i=0;i<s.i-1;i++)
{
total+=s.si[i]*(i+1);
}
total+=s.si[i]*i;
return s.CountPer=(double)total/(s.mixlen*s.count);
}
string OutHufCode(char c,SC s)
{
SortSC(s);
for(int i=0;i<s.i;i++)
{
if(s.s[i]==c)
return s.str[i];
}
return 0;
}
void HufumanCode(SC &s)
{
int i,j=0;
for(i=0;i<s.i;i++)
{
j=0;
for(j++;j<=i;j++)
{
s.str[i]+='1';
}
if(i==s.i-1)
break;
s.str[i]+='0';
}
}
void SortSC(SC &s)
{
int k,j;
char c;
for(int i=0;i<s.i;i++)
{
for(j=i+1;j<s.i;j++)
{
if(s.si[i]<s.si[j])
{
k=s.si[i];c=s.s[i];
s.si[i]=s.si[j];s.s[i]=s.s[j];
s.si[j]=k;s.s[j]=c;
}
if(s.si[i]==s.si[j])
{
continue;
}
}
}
}
int Search(SC s,char c)
{
for(int i=0;i<s.i;i++)
{
if(s.s[i]==c)
return i;
}
return -1;
}
void InitSC(SC &s)
{
s.i=0;
for(int j=0;j<=99;j++)
{
s.ss[j]='0';
s.si[j]=0;
s.s[j]='0';
s.per[j]=0;
s.count=0;
s.CountPer=0.0;
s.mixlen=0;
}
return ;
}
void MaxLen(SC &s)
{
int i=s.i;
i--;
while(i)
{
s.mixlen++;
i=i/2;
}
}
HuffCode.rar_显示哈夫曼树
版权申诉
166 浏览量
2022-09-14
19:10:06
上传
评论
收藏 1001B RAR 举报
林当时
- 粉丝: 100
- 资源: 1万+