基于哈夫曼树的文件压缩解压程序-示例文档内容摘要:

是课间给我的精辟回答使我有了更为明晰的思路,才有最终的设计结果。 14 七 附录 (此部分不用打印) 程序清单 在此,给出 的程序清单。 Dos 版本的程序清单在此略过。 include pragma hdrstop include include include include vector include set include utility include iterator include list include include using namespace std。 pragma package(smart_init) pragma resource *.dfm char inputFileBuffer[1048576]。 char wantFileBuffer[1048576]。 vector double X(511,0)。 AnsiString ShowNowTime() { Word H, M, S,Ms。 DecodeTime(Now(), H, M, S,Ms)。 AnsiString sH=AnsiString(H)。 AnsiString sM=AnsiString(M)。 AnsiString sS=AnsiString(S)。 AnsiString sMs=AnsiString(Ms)。 if (()==1) sM=0+sM。 if (()==1) sS=0+sS。 if (()==1) sMs=00+sMs。 if (()==2) sMs=0+sMs。 return sH+点 +sM+分 +sS+秒 +sMs。 } void Haffman(int nodeCode,int length,int sum,vector pairint,int amp。 hfmCode,vectorint amp。 lchild,vectorint amp。 rchild) { if (nodeCode==1) return。 if (nodeCode=255) { hfmCode[nodeCode].first=length。 hfmCode[nodeCode].second=sum。 return。 } Haffman(lchild[nodeCode],length+1,sum*2,hfmCode,lchild,rchild)。 Haffman(rchild[nodeCode],length+1,sum*2+1,hfmCode,lchild,rchild)。 } void search(int nodeCode,int amp。 i,vectorint amp。 lchild,vectorint amp。 rchild) { if (lchild[nodeCode]==1) { X[nodeCode]=i。 15 i++。 return。 } search(lchild[nodeCode],i,lchild,rchild)。 search(rchild[nodeCode],i,lchild,rchild)。 X[nodeCode]=(X[lchild[nodeCode]]+X[rchild[nodeCode]])/2。 } void searchdraw(int nodeCode,int height,vectorint amp。 lchild,vectorint amp。 rchild) { if (nodeCode==1) return。 if (lchild[nodeCode]==1) { Form3Image1CanvasBrushColor=clWhite。 Form3Image1CanvasTextOut(X[nodeCode]*205,height*60+14,AnsiString(nodeCode))。 Form3Image1CanvasBrushColor=clRed。 } Form3Image1CanvasEllipse(X[nodeCode]*205,height*604,X[nodeCode]*20+10+4,height*60+10+4)。 Form3Image1CanvasTextOut(X[nodeCode]*201,height*601,height)。 Form3Image1CanvasBrushColor=clYellow。 if (lchild[nodeCode]!=1) { Form3Image1CanvasMoveTo(X[nodeCode]*20+5,height*60+10+4)。 Form3Image1CanvasLineTo(X[lchild[nodeCode]]*20+5,height*60+604)。 searchdraw(lchild[nodeCode],height+1,lchild,rchild)。 Form3Image1CanvasMoveTo(X[nodeCode]*20+5,height*60+10+4)。 Form3Image1CanvasLineTo(X[rchild[nodeCode]]*20+5,height*60+604)。 searchdraw(rchild[nodeCode],height+1,lchild,rchild)。 } } void indexSearch(int nodeCode,vectorint amp。 lchild,vectorint amp。 rchild,vectorint amp。 index,vectorintamp。 code) { if (nodeCode256) { (1)。 (nodeCode)。 return。 } (0)。 indexSearch(lchild[nodeCode],lchild,rchild,index,code)。 indexSearch(rchild[nodeCode],lchild,rchild,index,code)。 } void makeIndex(int nodeCode,int amp。 tt,vectorint amp。 index,int amp。 indexNum,listint amp。 code,vectorint amp。 lchild,vectorint amp。 rchild) { if (index[indexNum++]==1) { lchild[nodeCode]=()。 ()。 } else { lchild[nodeCode]=tt++。 makeIndex(lchild[nodeCode],tt,index,indexNum,code,lchild,rchild)。 } if (index[indexNum++]==1) { rchild[nodeCode]=()。 ()。 } else { 16 rchild[nodeCode]=tt++。 makeIndex(rchild[nodeCode],tt,index,indexNum,code,lchild,rchild)。 } } TForm1 *Form1。 // __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } // void __fastcall TForm1::Compress(TObject *Sender) { if (!FileExists(Edit1Text)) { ShowMessage(Edit1Text+ 文件不存在 !)。 return。 } Edit8Text=。 Edit9Text=。 Edit10Text=。 Edit11Text=。 Edit12Text=。 Edit13Text=。 Label1Caption=。 Label2Caption=。 Label3Caption=。 Label4Caption=。 Label5Caption=。 Label6Caption=。 Label20Caption=。 Label26FontColor=clOlive。 ProgressBar1Position=0。 ProgressBar3Position=0。 StatusBar1PanelsItems[0]Text=。 StatusBar1PanelsItems[1]Text=。 Edit8Text=ShowNowTime()。 Label21FontColor=clNavy。 Form1Update()。 ifstream fin,fin1。 ofstream fout。 vector int frequent(256,0)。 vector int lchild(512,1)。 vector int rchild(512,1)。 vector pair int,int hfmCode(256)。 int newNodeCode=255。 int inputFileByte。 int wantFileByte=0。 int wantFileIndexByte=0。 int wantFileContentBit=0。 int wantFileContentByte。 int buffer。 int buffersize。 int inputFileRestSize。 int inputFileMega=0。 char *inputFileName=new char[Edit1()+1]。 strcpy(inputFileName,Edit1())。 char *wantFileName=new char[Edit4()+1]。 strcpy(wantFileName,Edit4())。 17 int handle=open(inputFileName,O_RDONLY)。 inputFileByte=filelength(handle)。 close(handle)。 int step。 (inputFileName,ios::binary)。 //下面统计该文件的编码频率分布 Edit9Text=ShowNowTime()。 Label21FontColor=clOlive。 Label22FontColor=clNavy。 Form1Update()。 while(1) { (inputFileBuffer,1048576)。 if (()) break。 for(int i=0。 i1048576。 i++) { int t=inputFileBuffer[i]。 if (t0) t+=256。 frequent[t]++。 } inputFileMega+=1。 ProgressBar3Position=inputFile。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。