a){ num=a; }//初始化树 void CHf::start() {
int i;
for(i=0;i<(int)num.size();i++) {
hftree[i].flag=1; hftree[i].wt=num[i]; } }
hftree=new Hf_node[num.size()*2]; Str=new string[num.size()]; start();
//建立哈夫曼树 void CHf::BuildHf(){ int i,j; int i_m1,i_m2;
for(j=num.size();;j++){
i_m1=i_m2=-1;//标记最小与次小
for(i=0;i<(int)(2*num.size());i++){//选择... if(hftree[i].flag==0) continue; if(i_m1==-1){
i_m1=i;
continue; }
if(i_m2==-1){ i_m2=i;
if(Compare(i_m2,i_m1)) swap(i_m1,i_m2); continue;
}
if(Compare(i,i_m2)){ if(Compare(i,i_m1)){
i_m2=i;
swap(i_m2,i_m1);
}
else i_m2=i;
} }
if(i_m2==-1){ //建树完成 } else {
hftree[j].wt=hftree[i_m1].wt+hftree[i_m2].wt; hftree[j].l=i_m1; hftree[j].r=i_m2; hftree[i_m1].par=j; hftree[i_m2].par=j; hftree[i_m1].flag=0; hftree[i_m2].flag=0; head=i_m1;break;
//处理最小..次小
}
}
}
hftree[j].flag=1;
//找编码 void CHf::serch()
//返回编码.
string CHf::returnStr(int i) { }
//析构函数 CHf::~CHf()
{ return Str[i];
} }
}
int mm=0; for(i--;i>=0;i--)
Str[k]+=str[i];
int per=hftree[tmp].par; if(hftree[per].l==tmp) else
str[i++]='1'; str[i++]='0';
{
for(int k=0;k<(int)num.size();k++) {
int i=0;
char *str=new char[num.size()*2]; for(;;) {
if(hftree[tmp].par==-1) {break;}
int tmp=k;
tmp=hftree[tmp].par;
delete [] Str; delete hftree;
}
/*******************************************/ /* 字符串处理 */ /*******************************************/
//构造函数
CdealStr::CdealStr(vectorstr){ } //传值void CdealStr::setStr(vectorstr) { }//编码处理 对输入的一行字符串进行编码并输出 void CdealStr::dealStr(){
int i;
for(i=0;i<(int)str.size()-1;i++) {
int mid=JugeLetter[str[i]]; if(mid==0) {
JugeLetter[str[i]]=EachLetterNum.size()+1; IntLetter[EachLetterNum.size()]=str[i];
this->str.clear(); this->str=str;
IntLetter.clear(); EachLetterNum.clear(); StrLetter.clear(); this->str.clear();
this->str=str;
JugeLetter.clear();
EachLetterNum.push_back(1);
} else {
EachLetterNum[mid-1]++;
}
}
CHf chf(EachLetterNum); chf.BuildHf(); chf.serch();
for(i=0;i<(int)IntLetter.size();i++) { }
int mid=JugeLetter[IntLetter[i]];
cout<for(i=0;i<(int)str.size();i++) { }cout<int mid=JugeLetter[str[i]]; cout<StrLetter[chf.returnStr(mid-1)]=IntLetter[mid-1];//解码
void CdealStr::dealStrTraslate(vectorsstr){ }/*******************************************/ /* 文件编码 */ /*******************************************/
for(int i=0;i<(int)sstr.size();) { }
cout<string ss; while(1) { }if(StrLetter[ss]==NULL) { ss+=sstr[i++];continue;} else { }
cout<//构造函数CdealFile::CdealFile() { }
//压缩文件...
void CdealFile::dealFileIn(char *infile,char *outfile,char *keyfile) {
//读文件 ifstream file1; file1.open(infile);
//输出钥匙 ofstream file2;
for(int i=0;i<(int)IntLetter.size();i++) { //编码
CHf chf(EachLetterNum); chf.BuildHf(); chf.serch(); char c;
while(!file1.eof()) {
file1>>c;
int mid=JugeLetter[c]; if(mid==0) {
JugeLetter[c]=EachLetterNum.size()+1;
IntLetter[EachLetterNum.size()]=c; EachLetterNum.push_back(1);
} else { }
file1.close();
EachLetterNum[mid-1]++; }
file2.open(keyfile);
int mid=JugeLetter[IntLetter[i]];
}
string sss=chf.returnStr(mid-1); StrLetter[sss]=IntLetter[mid-1]; sss.push_back(IntLetter[mid-1]); file2<file2.close(); //输出编码 ofstream file3; file3.open(outfile); char cc;file1.open(infile); { }
file1.close(); file3.close(); system(\"cls\"); getchar();
cout<<\" 编码成功!!回车返回..\"<while(!file1.eof()) { }file1>>cc;
int mid=JugeLetter[cc]; string ss=chf.returnStr(mid-1); file3<//解压文件void CdealFile::dealFileOut(char *infile,char *outfile,char *keyfile) {
mapmm; mm.clear(); //处理钥匙 ifstream file1; file1.open(keyfile); string ss; file1>>ss;while(1) { }
file1.close(); //查编码 ifstream file2; file2.open(infile); ofstream file3; file3.open(outfile); ss.clear(); char c; file2>>c; while(1) { }
file3<cout<<\" 解码成功!!回车返回..!\"<if(mm[ss]==NULL) { } else { } file2>>c; if(file2.eof())break;
file3<string sss(ss,0,(int)ss.length()-1); mm[sss]=ss[(int)ss.length()-1]; file1>>ss; if(file1.eof())break;
}
getchar(); system(\"cls\");
//查看文件内容
void CdealFile::chakeFile(char *infile) { }
ifstream file1; char c;
while(!file1.eof()) { }
cout<file1>>c; cout<file1.open(infile);六、运行结果 1>字符串编码与解码
:
2>文件编码
文件编码结果
文件解码
文件解码结果
七、实验运行情况分析
程序运行成功,且调试成功,此程序通过输入一行字符串或者针对一个txt的文件两种方式进行的编码,在主函数中设计了一个dealSStr和dealFFile函数来来分别代表两种不同对象的操作,通过分别设计操作类与其公共建树类,达到编码;通过huffman算法求出不同字符的相应代码并将编码合理处理,文件则建立新的编码文件以及钥匙文件(各个字符的编码),进行保存,方便以后解码