请问: 如何要把结构体改成类
?
下辈子做牛做马给你们。。。。。
#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;
}
请问: 如何要把结构体改成类
?