#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小时内删除。