问个简单的C++问题, 卑职跪谢

 请问: 如何要把结构体改成类

? 

下辈子做牛做马给你们。。。。。

 

 

 

#include<iostream>
#include<string>
#include <fstream>
using namespace std;
typedef struct
{
 char character;
 unsigned int weight;
 unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
char *c;
HuffmanTree HT;
HuffmanCode HC;
void menu()                                          //定义菜单函数
{
    cout<<"pleace make the choice:"<<endl;
    cout<<"*****     I: 初始化        *****"<<endl;
    cout<<"*****     E:编码          *****"<<endl;
    cout<<"*****     D:译码          *****"<<endl;
    cout<<"*****     P:印代码文件    *****"<<endl;
    cout<<"*****     T: 印赫夫曼树    *****"<<endl;
    cout<<"*****     Q: 退出          *****"<<endl;
}

void Select(HuffmanTree &HT,int end,int &s1,int &s2)     //选择权值最小的两个结点
{
 int i;
 int weight1,weight2;
 weight1=1000;
 
 for(i=1;i<=end;i++)
 {
  if(HT[i].parent==0&&HT[i].weight<weight1)
  {
   weight1 = HT[i].weight;
   s1 = i;
  }
 }
 for(i=1;i<=end;i++)
 {
  if(HT[i].parent==0&&HT[i].weight<weight2&&(i!=s1))
  {
   weight2 = HT[i].weight;
   s2 = i;
  }
 }
}
void Initialization(HuffmanTree &HT,HuffmanCode &HC)                //建立赫夫曼树
{
 FILE *fp,*fp1;
 fp=fopen("hfmTree.txt","w+");
 fp1=fopen("ht.txt","w+");
 int m,n,i,s1,s2,start,f,b;
 int *w;
 char *cd;
 bool flag = true;
 cout<<"please input n: "<<endl;
 cin>>n;
 fprintf(fp,"%d/n",n);
 fprintf(fp1,"%d/n",n);
 if(n<=1)return;
 w=(int *)malloc((n+1)*sizeof(int));     //动态申请数组空间存储结点的权值
 c=(char *)malloc((n+1)*sizeof(char));       //动态申请数组空间存储结点字符
    cout<<"please input character and weight: "<<endl;
    for(i=1;i<=n;i++)
 {
  getchar();
  cout<<"请输入第"<<i<<"个字符及其权值:";
  cin>>c[i];
  cin>>w[i];
 }
 m=2*n-1;
 HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
 for(i=1;i<=n;i++)                       //初始化赫夫曼树
 {
  HT[i].character=c[i];
  HT[i].weight=w[i];
  HT[i].parent=0;
  HT[i].lchild=0;
  HT[i].rchild=0;
 }
 for(i=n+1;i<=m;++i)
 {
  HT[i].character=0;
  HT[i].weight=0;
  HT[i].parent=0;
  HT[i].lchild=0;
  HT[i].rchild=0;
 }

 for(i=n+1;i<=m;++i)
 {
  Select(HT,i-1,s1,s2);
  HT[s1].parent=i;
  HT[s2].parent=i;
  HT[i].lchild=s1;HT[i].rchild=s2;
  HT[i].weight=HT[s1].weight+HT[s2].weight;
 }
  for(i=n+1;i<2*n;i++)
 {
  fprintf(fp1,"%d ",HT[i].lchild);
     fprintf(fp1,"%d/n",HT[i].rchild);
 }
//---从叶子到根逆向求每个字符的赫夫曼编码
 HC = (HuffmanCode)malloc((n+1)*sizeof(char*));//分配n个字符编码的头指针向量
 HC[0] = NULL;
 cd = (char *)malloc(n*sizeof(char));//分配求编码的工作空间
 cd[n-1] = '/0'; //编码结束符
 for(i=1;i<=n;i++)//逐个字符求赫夫曼编码
 {
  start = n-1; //编码结束符位置
  for(b=i,f=HT[i].parent;f!=0;b=f,f=HT[f].parent)//从叶子到根逆向求编码
  {
   if(HT[f].lchild == b)
    cd[--start] = '0';
   else
    cd[--start] = '1';
  }
  HC[i] = (char *)malloc((n-start)*sizeof(char)); //为第i个字符分配存储空间
  strcpy(HC[i],&cd[start]);
  cout<<"字符"<<c[i]<<"的编码是:";
  cout<<HC[i]<<endl;
  fputc(HT[i].character,fp);         //将编码写入文件hfmTree中
  fputs(HC[i],fp);
  fputc('/n',fp); 
 }
    free(cd);
 fclose(fp);
 fclose(fp1);
}
void Encoding(HuffmanTree &HT,HuffmanCode &HC)     //利用已建好的赫夫曼树,对文件ToBeTran中的正文进行编码
{
 int choice,i,n,m,j;
 char ch[1000];
 ifstream inf("hfmTree.txt",ios::in);        //将文件hfmTree.txt中的赫夫曼树读入内存
 if(!inf)
 {
  cerr<<"open hmfTree failed!"<<endl;
  exit(1);
 }
 inf>>n;
 inf.get();
 
 HC = (HuffmanCode)malloc((n+1)*sizeof(char*));
 c = (char *)malloc((n+1)*sizeof(char));
 for(i=1;i<=n;i++)
 {
  HC[i] = (char *)malloc((n-1)*sizeof(char));
  inf.get(c[i]);
  inf>>HC[i];
  inf.get();
 }
 inf.close();
 //getchar();
 cout<<"请输入要译码的正文";//选择译文,Y重新创建ToBeTran,N文件ToBeTran已存在
 cin>>ch;
 m=strlen(ch);
 //getchar();
 /*if(ch=='Y')              //重新创建文件ToBeTran.txt
 {
      ofstream outfile("ToBeTran.txt",ios::out);
   if(!outfile)
   {
    cerr<<"create file failed!"<<endl;
    exit(1);
   }
       outfile<<"THIS PROGRAME  IS  MY  FAVORITE";
       outfile.close();
 }
 
 ifstream infile("ToBeTran.txt",ios::in);
 if(!infile)
 {
  cerr<<"open ToBeTran.txt failed!"<<endl;
  exit(1);
 }*/
 ofstream outfile("CodeFile.txt",ios::out);
 if(!outfile)
 {
  cerr<<"open CodeFile.txt failed!"<<endl;
  exit(1);
 }
 //while(true) //讲正文进行译码,写入文件CodeFile.txt
 //{
  //infile.get(ch);
  //if(infile.eof())  break;
  for(j=0;j<m;j++)
  {
    for(i=1;i<=n;++i)
 {
     if(ch[j] == c[i])
  {
     outfile<<HC[i];
     cout<<HC[i]<<" ";
      break;
  }
 }
    cout<<" ";
     if(i==n+1)
  {
       cout<<"error!"<<endl;
       exit(1);
  }
  }cout<<"sucess!"<<endl;
 //}
 //infile.close();
 outfile.close();
 
}
void Decoding(HuffmanTree &HT,HuffmanCode &HC) //译码
{
 int i,n;
 char ht;
 ifstream infile("ht.txt",ios::in);
 if(!infile)
 {
  cerr<<"open ht.txt failed!"<<endl;
  exit(1);
 }
 infile>>n;
 infile.get();
 HT = (HuffmanTree)malloc((2*n)*sizeof(HTNode));
 for(i=0;i<=n;i++)
 {
  HT[i].lchild=HT[i].rchild=HT[i].parent=0;
 }
 for(i=n+1;i<=2*n;i++)
 {
  infile>>HT[i].lchild>>HT[i].rchild;
  infile.get();
 }
 infile.close();
    ifstream inf1("hfmTree.txt",ios::in);
 if(!inf1)
 {
  cerr<<"open hmfTree.txt failed!"<<endl;
  exit(1);
 }
 inf1>>n;
 inf1.get();
 HC = (HuffmanCode)malloc((n+1)*sizeof(char*));
 c = (char *)malloc(n*sizeof(char));
 for(i=1;i<=n;i++)   //从文件hmfTree.txt中读出所有字符及其编码,存入HC[i]和c[i]中
 {
  HC[i] = (char *)malloc((n-1)*sizeof(char));
  inf1.get(c[i]);
  inf1>>HC[i];
  inf1.get();
 }
 inf1.close();
    ifstream inf("CodeFile.txt",ios::in);
 if(!inf)
 {
  cerr<<"open CodeFile.txt failed!"<<endl;
  exit(1);
 }
 ofstream outfile("TextFile.txt",ios::out);
 if(!outfile)
 {
  cerr<<"open TextFile.txt failed!"<<endl;
  exit(1);
 }
 inf.get(ht);
 while(!inf.eof())
 {
  if(inf.eof())  break;
  for(i=2*n-1;HT[i].lchild>0||HT[i].rchild>0;)
  {
   if(ht=='0')
    i = HT[i].lchild;
   else if(ht=='1')
    i = HT[i].rchild;
   inf.get(ht);
  }
  outfile<<c[i];
  cout<<c[i]<<" ";//chinese
 }
 inf.close();
 outfile.close();
 cout<<"译码成功!"<<endl;
}
int main()
{  
 char ch;
 menu();
 scanf("%c",&ch);
 while(true)
 {
  switch(ch)
  {
  case 'I':
   Initialization(HT,HC);
   menu();
   cout<<"请输入选项:";
   getchar();
   scanf("%c",&ch);
   break;
  case 'E':
   Encoding(HT,HC);
   menu();
   cout<<"请输入选项:";
   getchar();
   scanf("%c",&ch);
   break;
  case 'D':
   Decoding(HT,HC);
   menu();
   cout<<"请输入选项:";
   getchar();
   scanf("%c",&ch);
   break;
  case 'Q':
   exit(0);
   break;
  default:
   cout<<"error!"<<endl;
   scanf("%c",&ch);
   break;
  }
 }
    return 0;
}

 

 

 

 请问: 如何要把结构体改成类

? 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值