資源描述:
《《數(shù)據(jù)結(jié)構(gòu)實訓(xùn)》實訓(xùn)報告》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、計算機工程系計算機12級卓越計Y121班數(shù)據(jù)結(jié)構(gòu)實訓(xùn)報告1題目與要求1.1問題提出本人計劃編寫一個哈夫曼編碼譯碼器,主要是進行信息通信,實現(xiàn)在發(fā)送端通過一個編碼系統(tǒng)對待傳數(shù)據(jù)預(yù)先編碼;在接收端將傳來的數(shù)據(jù)進行譯碼(復(fù)原)的信息收發(fā)站。1.2本系統(tǒng)涉及的知識點最優(yōu)二叉樹、數(shù)組、循環(huán)、函數(shù)、分支、類型結(jié)構(gòu)定義、文件、遞歸1.3功能要求所要實現(xiàn)的題目功能:1)I:初始化(Initialization)。從終端讀入字符集大小n及n個字符和m個權(quán)值,建立哈夫曼樹,并將它存于文件hfmtree中。(2)C:編碼(Coding)。利用已建好的哈夫曼樹(如不在內(nèi)存,則
2、從文件hfmtree中讀入),對文件tobetrans中的正文進行編碼,然后將結(jié)果存入文件codefile中。(3)D:解碼(Decoding)。利用已建好的哈夫曼樹將文件codefile中的代碼進行譯碼,結(jié)果存入文件textfile中。(4)P:打印代碼文件(Print)。將文件codefile以緊湊格式顯示在終端上,每行50個代碼。同時,將此字符形式的編碼文件寫入文件codeprint中。(5)T:打印哈夫曼樹(Treeprinting)。將已在內(nèi)存中的哈夫曼樹以直觀的方式(樹或凹人表形式)顯示在終端上,同時將此字符形式的哈夫曼樹寫入文件treep
3、rint中。2功能設(shè)計2.1算法設(shè)計本系統(tǒng)需要實現(xiàn)的功能要求:1、利用switch語句設(shè)計如圖1所示的主菜單(圖中的文字宋體5號):1、初始化(Init)39計算機工程系計算機12級卓越計Y121班數(shù)據(jù)結(jié)構(gòu)實訓(xùn)報告2、編碼(Coding)3、解碼(Decoding)4、打印代碼(print)5、打印哈夫曼樹(Treeprint)6、退出請輸入你的選擇(1~6):圖1哈夫曼編碼譯碼器主菜單2、(1)選擇2后,調(diào)用編碼子菜單函數(shù),進入函數(shù)后利用switch語句實現(xiàn)一個如圖2所示的菜單,該菜單中1、2選項調(diào)用一個函數(shù)。圖2編碼(coding)子菜單(2)選擇
4、2后,調(diào)用解碼碼子菜單函數(shù),進入函數(shù)后利用switch語句實現(xiàn)一個如圖3所示的菜單,該菜單中1、2選項調(diào)用一個函數(shù).圖3解碼(Decoding)子菜單39計算機工程系計算機12級卓越計Y121班數(shù)據(jù)結(jié)構(gòu)實訓(xùn)報告3、根據(jù)所選菜單編寫相應(yīng)代碼:1)初始化(Init):利用循環(huán)將字符存入結(jié)構(gòu)體數(shù)組,再利用循環(huán)從文本文件中取出字符統(tǒng)計字符的頻率存入結(jié)構(gòu)體數(shù)組中,再利用循環(huán)將其作為權(quán)值存入哈夫曼樹的結(jié)構(gòu)體數(shù)組中再循環(huán)尋找最小結(jié)點值建立哈夫曼樹,然后再將其創(chuàng)建哈夫曼樹存入文件中,最后對樹進行逆向求葉子結(jié)點的編碼并將其編碼表存入文件和輸出在終端上。具體程序為:voi
5、dInitialization(HuffmanTree&HT,HuffmanCode&HC,List*L)//初始化{Statistics(L,N);CreateHT_HC(HT,HC,L,N);printf("Initializationsucceed!!!!!");}///////////////////////////////統(tǒng)計文件中的字符(字符是從Ascll32--126)頻率,將其頻率作為權(quán)值建立哈夫曼樹/////////voidStatistics(List*L,intn){FILE*fp;inti,j;intm;char
6、ch;for(i=0,j=32;j<=126;j++){L[i].chars=j;i++;}if((fp=fopen("test.txt","r"))==NULL)//打開test.txt文件{printf("cannotopenthefile!!!");exit(0);}while((ch=fgetc(fp))!=EOF)//從文件中逐個取出字符直到文件結(jié)尾{m=ch-32;//m等于字符的Ascll碼值減去空格的Ascll碼,其值就為這個字符存放數(shù)組的下標L[m].weight++;}39計算機工程系計算機12級卓越計Y121班數(shù)據(jù)結(jié)構(gòu)實訓(xùn)報告fc
7、lose(fp);}/////////////////////////////////////////////////求解最小權(quán)值的操作/////////////////intmin(HuffmanTreeHT,inti){intj,flag=0;unsignedintk=99999;//定義k足夠大for(j=1;j<=i;j++)//循環(huán)在1-i個結(jié)點中尋找權(quán)值最小的結(jié)點if(HT[j].weight8、rent置為1,標志這個結(jié)點已找過returnflag;}/////////////構(gòu)造哈夫曼