#include<iostream>
#include<fstream>
#include<string>
#include<sstream>
using namespace std;
char a[100]; //字符数组
int b[100]; //字符个数
double p_a[100]; //字符概率数组
int sum=0; //字符总数
//判断当前字符temp是否已出现过
bool search(char temp,char a[],int m,int n)//m为数组a的元素总个数,即100;n为当前数组a中存放的字符种类的个数
{
int i=0;
while(i<n)
{
if(a[i]==temp) return true;
else i++;
}
return false;
}
//求各个字符的个数,放在数组b中
void read_file( string file_name = "" )
{
int k=0;
ifstream file( file_name.c_str() ); //将string转化为char数组
char temp;
if ( file.is_open() == true ) //检查文件是否打开
{
while ( file.peek() != EOF ) // 从文件中读取一个字符,但该字符并未从输入流中删除
{
( temp ); // 从文件读入一个字符并把它存储在temp
sum++; //统计出现的字符总数
if(search(temp,a,100,k))
{
for(int i=0;i<k;i++)
{
if(temp==a[i])
{
b[i]++;
break;
}
}
}
else
{
字符串截取2个字符之间 a[k]=temp;
b[k]++;
k++;
}
}
}
file.close(); // 关闭文件
}
int main()
{
for(int i=0;i<100;i++)
{
a[i]='@';
b[i]=0;
}
string add="C:\\" ;
read_file(add);
cout<<sum<<endl;
for(int p=0;p<100;p++)
{
if(a[p]!='@')
{
p_a[p]=((double)b[p])/((double)sum);
}
else
p_a[p]=0.0;
}
p=0;
while(p<100 &&a[p]!='@')
{
cout<<a[p]<<" "<<p_a[p]<<endl;
p++;
}
return 0;
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
#include<iostream>
#include<fstream>
#include<string>
#include<sstream>
using namespace std;
//////////////////
char a[100]; //字符数组
int b[100]; //字符个数
double p_a[100]; //字符概率数组
int sum=0; //字符总数
//判断当前字符temp是否已出现过
bool search(char temp,char a[],int m,int n)//m为数组a的元素总个数,即100;n为当前数组a中存放的字符种类的个数
{
int i=0;
while(i<n)
{
if(a[i]==temp) return true;
else i++;
}
return false;
}
//求各个字符的个数,放在数组b中
void read_file( string file_name = "" )
{
int k=0;
ifstream file( file_name.c_str() ); //将string转化为char数组
char temp;
if ( file.is_open() == true ) //检查文件是否打开
{
while ( file.peek() != EOF ) // 从文件中读取一个字符,但该字符并未从输入流中删除
{
( temp ); // 从文件读入一个字符并把它存储在temp
sum++; //统计出现的字符总数
if(search(temp,a,100,k))
{
for(int i=0;i<k;i++)
{
if(temp==a[i])
{
b[i]++;
break;
}
}
}
else
{
a[k]=temp;
b[k]++;
k++;
}
}
}
file.close(); // 关闭文件
}
/////////////////////
typedef struct
{
char data;
int weight;
int parent ,lchild,rchild;
}HTNode,*HuffmanTree;//动态分配数组存储哈夫曼树
typedef char ** HuffmanCode;// 动态分配数组存储哈夫曼编码表
// 返回i个节点中权值最小的树的根节点序号
int min (HuffmanTree t, int i)
{
int j,flag;
int k=100;
for(j=1;j<=i;j++)
{
if((t[j].weight<=k)&&(t[j].parent==0))
{
k=t[j].weight,flag=j;
}
}
t[flag].parent=1;
return flag;
}
//在i个结点中选择2个权值最小的树的根结点序号,s1为其中序号小的那个
void select (HuffmanTree t,int i,int &s1,int &s2)
{
s1=min(t,i);
s2=min(t,i);
}
//w存放n个字符的权值,构造哈夫曼树HT,并求出n个字符的哈弗夫编码HC
void HuffmanCoding (HuffmanTree &HT,HuffmanCode &HC,int *w,int n,char *wx,int nx)
{
int m,i,s1,s2;
int c,cdlen;
HuffmanTree p;
char *cd;
if(n<=1)
return ;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//0号单元未用
for(p=HT+1,i=1;i<=n;++i,++p,++w)
{
(*p).weight=*w;
(*p).data=*wx;
(*p).parent=0;
(*p).lchild=0;
(*p).rchild=0;
}
for(;i<=m;++i,++p)
(*p).parent=0;
for(i=n+1;i<=m;++i)//见哈夫曼树
{
select(HT,i-1,s1,s2);
HT[s1].parent=HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
cd=(char*)malloc(n*sizeof(char));
c=m;
cdlen=0;//记录一个码字中码的个数
for(i=1;i<=m;++i)
HT[i].weight=0;//遍历哈弗曼树时用作结点状态标志
while (c)
{
if(HT[c].weight==0)//说明没有遍历过
{
HT[c].weight=1;
if(HT[c].lchild!=0)//有左孩子
{
c=HT[c].lchild;
cd[cdlen++]='0';
}
else if(HT[c].rchild==0)//没有左孩子,也没有右孩子
{
HC[c]=(char*)malloc((cdlen+1)*sizeof(char));//结束,多一个单元来放结束符号
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论