版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計評閱書題目哈夫曼編碼與譯碼的實現(xiàn)學生姓名萬永馨學號指導教師評語及成績指導教師簽名:年月日答辯評語及成績答辯教師簽名:年月日教研室意見總成績:室主任簽名:年月日20112012學年第一學期專業(yè):信息管理與信息系統(tǒng)學號:1021024016姓名:萬永馨課程設(shè)計名稱:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計設(shè)計題目:哈夫曼編碼與譯碼的實現(xiàn)完成期限:自2012年2月20日至2012年3月_2日共2周設(shè)計依據(jù)、要求及主要內(nèi)容(可另加附頁):該設(shè)計題目將按以下要求完成:哈夫曼編碼與譯碼是信息傳輸中應(yīng)用的經(jīng)典算法,運用C或VC+結(jié)合數(shù)據(jù)結(jié)構(gòu)等基礎(chǔ)知識,按以下要求編程實現(xiàn)各種進制的轉(zhuǎn)換。任務(wù)要求:1)闡述設(shè)計思想,畫
2、出流程圖;2)需要對哈夫曼編碼/譯碼的相關(guān)原理有所了解,設(shè)計數(shù)據(jù)結(jié)構(gòu),建立必要的信息數(shù)據(jù)文件(最好存儲成外部文件),并分析完成用戶所需的基本操作功能;3)實現(xiàn)給定信息的編碼和譯碼功能;4)應(yīng)有較好的界面設(shè)計,說明程序測試方法;5)按照格式要求完成課程設(shè)計說明書。設(shè)計要求:1)問題分析和任務(wù)定義:根據(jù)設(shè)計題目的要求,充分地分析和理解問題,明確問題要求做什么?(而不是怎么做?)限制條件是什么?確定問題的輸入數(shù)據(jù)集合。2)邏輯設(shè)計:對問題描述中涉及的操作對象定義相應(yīng)的數(shù)據(jù)類型,并按照以數(shù)據(jù)結(jié)構(gòu)為中心的原則劃分模塊,定義主程序模塊和各抽象數(shù)據(jù)類型。邏輯設(shè)計的結(jié)果應(yīng)寫出每個抽象數(shù)據(jù)類型的定義(包括數(shù)據(jù)結(jié)
3、構(gòu)的描述和每個基本操作的功能說明),各個主要模塊的算法,并畫出模塊之間的調(diào)用關(guān)系圖;3)詳細設(shè)計:定義相應(yīng)的存儲結(jié)構(gòu)并寫出各函數(shù)的偽碼算法。在這個過程中,要綜合考慮系統(tǒng)功能,使得系統(tǒng)結(jié)構(gòu)清晰、合理、簡單和易于調(diào)試,抽象數(shù)據(jù)類型的實現(xiàn)盡可能做到數(shù)據(jù)封裝,基本操作的規(guī)格說明盡可能明確具體。詳細設(shè)計的結(jié)果是對數(shù)據(jù)結(jié)構(gòu)和基本操作做出進一步的求精,寫出數(shù)據(jù)存儲結(jié)構(gòu)的類型定義,寫出函數(shù)形式的算法框架;4)程序編碼:把詳細設(shè)計的結(jié)果進一步求精為程序設(shè)計語言程序。同時加入一些注解和斷言,使程序中邏輯概念清楚;5)程序調(diào)試與測試:能夠熟練掌握調(diào)試工具的各種功能,設(shè)計測試數(shù)據(jù)確保程序正確。調(diào)試正確后,認真整理源程
4、序及其注釋,形成格式和風格良好的源程序清單和結(jié)果;6)結(jié)果分析:程序運行結(jié)果包括正確的輸入及其輸出結(jié)果和含有錯誤的輸入及其輸出結(jié)果。算法的時間、空間復(fù)雜性分析;7)編寫課程設(shè)計報告;以上要求前三個階段的任務(wù)完成后,將設(shè)計說明書的草稿交指導老師面審,審查合格方可進入后續(xù)階段的工作。設(shè)計工作結(jié)束,經(jīng)指導老師驗收合格后將設(shè)計說明書裝訂,并答辯。指導教師(簽字):教研室主任(簽字):批準日期:摘要在當今信息爆炸時代,如何采取有效的數(shù)據(jù)壓縮技術(shù)來節(jié)省數(shù)據(jù)文件的儲存空間越來越引起人們的重視。本次課程設(shè)計的實驗題目為哈夫曼編碼與譯碼的實現(xiàn)。利用哈夫曼樹求得的用于通訊的二進制編碼稱為哈弗曼編碼。通常我們將文字
5、轉(zhuǎn)化為二進制稱為編碼,而將二進制轉(zhuǎn)化為文字稱為譯碼。此次程序就是將一個簡單的文件進行編碼轉(zhuǎn)化為二進制數(shù)存入文件并進行譯碼進而輸出。而將文件轉(zhuǎn)化為二進制編碼運用哈夫曼樹的相關(guān)知識可以有效的節(jié)省存儲空間與時間。關(guān)鍵詞:哈夫曼樹;哈夫曼樹的編碼;哈夫曼樹的譯碼;哈夫曼樹初始化;哈夫曼樹的建立開發(fā)工具:visualC+目錄1. 引言52. 課題描述63. 程序設(shè)計73.1實驗?zāi)康呐c基本要求73.2部分函數(shù)介紹73.3主要模塊程序流程圖84系統(tǒng)實現(xiàn)124.1主函數(shù)(菜單函數(shù))124.2建立HuffmanTree124.3生成Huffman編碼并寫入文件144.4對文件哈夫曼譯碼.txt進行譯碼譯碼155
6、系統(tǒng)調(diào)試16附錄源程序22131.引言在課程設(shè)計過程中,我們四個人一組選擇一個課題,認真研究,根據(jù)課堂講授內(nèi)容,借助書本,自己動手實踐。這樣不但有助于我們消化課堂所講解的內(nèi)容,還可以增強我們的獨立思考能力和動手能力;通過編寫實驗代碼和調(diào)試運行,我們可以逐步積累調(diào)試C程序的經(jīng)驗并逐漸培養(yǎng)我們的編程能力、用計算機解決實際問題的能力。在課程設(shè)計過程中,我們不但有自己的獨立思考,還借助各種參考文獻來幫助我們完成系統(tǒng)。更為重要的是,我們同學之間加強了交流,在對問題的認識方面可以交換不同的意見。同時,師生之間的互動也隨之改善,我們可以通過具體的實例來從老師那學到更多的實用的知識。數(shù)據(jù)結(jié)構(gòu)課程具有比較強的理
7、論性,同時也具有較強的可應(yīng)用性和實踐性。課程設(shè)計是一個重要的教學環(huán)節(jié)。我們在一般情況下都能夠重視實驗環(huán)節(jié),但是容易忽略實驗的總結(jié),忽略實驗報告的撰寫。通過這次實驗讓我們明白:作為一名大學生必須嚴格訓練分析總結(jié)能力、書面表達能力。需要逐步培養(yǎng)書寫科學實驗報告以及科技論文的能力。只有這樣,我們的綜合素質(zhì)才會有好的提高。2. 課題描述課題:哈夫曼編碼與譯碼的實現(xiàn)問題描述:對文件哈夫曼.txt中的字符串進行編譯,統(tǒng)計其中的字符種類、個數(shù)作為權(quán)值。1. 從D盤的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計文件夾中建立哈夫曼.txt文件里讀出文章(必須大寫);2. 運用jsp函數(shù)統(tǒng)計這篇文章中的每個字符出現(xiàn)的次數(shù);3. 以字符出現(xiàn)字
8、數(shù)作為權(quán)值,構(gòu)建哈夫曼樹,并將哈夫曼樹的存儲結(jié)構(gòu)的初態(tài)和終態(tài)進行輸出;4. 對每個字符進行編碼并將所編碼寫入程序,然后對另一文件中的編碼編碼進行破譯。具體介紹:在本課題中,我們在硬盤D盤中預(yù)先建立一個哈夫曼.txt文檔,在里面編輯一篇文章(大寫)。然后運行程序,調(diào)用fileopen()函數(shù)讀出該文章,顯示在界面;再調(diào)用jsq()函數(shù)對該文章的字符種類進行統(tǒng)計,并對每個字符的出現(xiàn)次數(shù)進行統(tǒng)計,并且在界面上顯示;然后以每個字符出現(xiàn)次數(shù)作為權(quán)值,調(diào)用ChuffmanTree()函數(shù)構(gòu)建哈夫曼樹;并調(diào)用printl()和print2()函數(shù)將哈夫曼的存儲結(jié)構(gòu)的初態(tài)和終態(tài)進行輸出。然后哈夫曼樹進行編碼,
9、再對另一文件哈夫曼譯碼.txt編碼進行譯碼,再輸出至界面。至此,整個工作就完成了。3. 程序設(shè)計3.1實驗?zāi)康呐c基本要求利用赫夫曼編碼進行通信可以大大提高信道利用率,縮短信息傳輸時間,降低傳輸成本。這要求在發(fā)送端通過一個編碼系統(tǒng)對待傳輸數(shù)據(jù)預(yù)先編碼,在接收端將傳來的數(shù)據(jù)進行譯碼(復(fù)原)。對于雙工信道(即可以雙向傳輸信息的信道),每端都需要一個完整的編/譯碼系統(tǒng)。試為這樣的信息收發(fā)站編寫一個赫夫曼碼的編/譯碼系統(tǒng)。一個完整的系統(tǒng)應(yīng)具有以下功能:(1)初始化(Initialization)。從文件哈夫曼.txt讀入字符集,統(tǒng)計字母個數(shù)作為權(quán)值,建立赫夫曼樹。編碼(Encoding)。利用已建好的赫
10、夫曼樹(如不在內(nèi)存,則從文件中讀入),對哈夫曼樹進行編碼,然后將結(jié)果存入文件哈夫曼譯碼.txt中。(3)譯碼(Decoding)o利用已建好的赫夫曼樹將文件哈夫曼譯碼.txt中的代碼進行譯碼3.2部分函數(shù)介紹 從硬盤讀取字符串fileopen(參數(shù)) 建立HuffmanTree通過三個函數(shù)來實現(xiàn):voidselect(參數(shù))說明:在htl.k中選擇parent為0且權(quán)值最小的兩個根結(jié)點的算法intjsq(參數(shù))說明:統(tǒng)計字符串中各種字母的個數(shù)以及字符的種類voidChuffmanTree()說明:構(gòu)造哈夫曼樹 輸出哈夫曼樹的存儲結(jié)構(gòu)的初態(tài)和終態(tài)分別調(diào)用printl()和print2()來實現(xiàn)v
11、oidprintl(參數(shù))說明:輸出哈夫曼樹的初態(tài)voidprint2(參數(shù))說明:輸出哈夫曼樹的終態(tài) 哈夫曼編碼和譯碼voidHuffmanEncoding(參數(shù))說明:哈夫曼編碼char*decode(參數(shù))說明:哈夫曼譯碼3.3主要模塊程序流程圖主函數(shù)流程圖:圖3.1流程圖注釋:圖3.1比較簡單,由該圖可知主要是調(diào)用各個函數(shù)模塊,首先代開已經(jīng)存在的文件,然后統(tǒng)計總的字符數(shù)以及出現(xiàn)的各個字符和頻率。然后才開始建立哈夫曼樹,接著在哈夫曼樹的基流程圖注釋:圖3.2是表示構(gòu)造哈夫曼樹的過程。首先輸入num個葉結(jié)點的權(quán)值,當i=num是循環(huán)結(jié)束。然后進行哈夫曼樹的構(gòu)建,當i=2*num-l是循環(huán)結(jié)
12、束。最后輸出所得到的字符統(tǒng)計情況。哈夫曼編碼:圖3.3流程圖解釋:流程圖3.3表示哈夫曼編碼情況。首先初始化,Cdstart=O,start=num。然后從首地址開始進行比較,找節(jié)點的父母地址然后看節(jié)點為父母地址的左孩子是的話為'0',反之為'1'.依次開始上溯。將編碼存入Hi.bits。哈夫曼譯碼:N開文件?YYj=1NYj<=numYNfeof(fp)=lYi<num&&cjs=0&&N!feof(fp)開始i=0,cjs=0cdi二fgetc(fp)結(jié)束i+p=strreturn(p)strk=HCj.chj+,
13、k+,cjs=l圖3.4流程圖解釋:流程圖3.4表示哈夫曼譯碼情況。首先講哈夫曼編碼存入的文件打開,將哈夫曼編碼導出然后將文件中讀出的字符與哈夫曼編碼cd進行比較strcmp(HCj.bits,cd=O,相等的話開始譯出strk二HCj.ch。4系統(tǒng)實現(xiàn)各模塊關(guān)鍵代碼及算法的解釋:4.1主函數(shù)(菜單函數(shù))主函數(shù)相對簡單,只需了解順序,依次調(diào)用即可。這里不做解釋4.2建立HuffmanTree代碼解釋:該函數(shù)為在htl.k中選擇parent為0且權(quán)值最小的兩個根結(jié)點的算法,其序號為si和s2。voidselect(HuffmanTreeT,intk,int&s1,int&s2)i
14、nti,j;intmini=32767;for(i=i;i<=k;i+)if(Ti.weight<mini&&Ti.parent=0)j=i;mini=Ti.weight;si=j;mini=32767;for(i=i;i<=k;i+)if(Ti.weight<mini&&Ti.parent=0&&i!=si)j=i;mini=Ti.weight;s2=j;代碼解釋:下面函數(shù)用來統(tǒng)計字符串中各種字母的個數(shù)以及字符的種類。當字符在A和z之間時即被計數(shù),并用strj保存字母到數(shù)組中,用cntj統(tǒng)計每種字符個數(shù)。j返回總共讀取的
15、字符數(shù)目。intjsq(char*s,intcnt,charstr)inti,j,k;char*p;inttemp53;for(i=1;i<=52;i+)tempi=0;for(p=s;*p!='0'p+)if(*p>='A'&&*p<='z')k=*p-64;tempk+;/統(tǒng)計各種字符的個數(shù)for(i=1,j=0;i<=52;+i)if(tempi!=0)j+;strj=i+64;/送對應(yīng)的字母到數(shù)組中cntj=tempi;/存入對應(yīng)字母的權(quán)值returnj;/j是輸入字母總數(shù)代碼解釋:下面函數(shù)用來構(gòu)造
16、哈夫曼樹HT。首先初始化哈夫曼樹,然后輸入前面統(tǒng)計的各結(jié)點的權(quán)值,用for循環(huán)來構(gòu)造哈夫曼樹。voidChuffmanTree(HuffmanTreeHT,HuffmanCodeHC,intcnt,charstr)inti,s1,s2;for(i=l;i=2*numT;i+)/初始化HT,2*numT是指哈夫曼/所有的結(jié)點數(shù)目HTi.lchild=0;HTi.rchild=0;HTi.parent=0;HTi.weight=0;for(i=1;i<=num;i+)/輸入num個葉結(jié)點的權(quán)值HTi.weight=cnti;for(i=num+1;i<=2*num-1;i+)selec
17、t(HT,i-1,s1,s2);HTs1.parent=i;HTs2.parent=i;HTi.lchild=s1;HTi.rchild=s2;HTi.weight=HTs1.weight+HTs2.weight;/在htl.k中選擇parent為0且權(quán)值最小/的兩個根結(jié)點,其序號為si和s2,i為雙親for(i=0;i<=num;i+)/輸入字符集的中字符HCi.ch=stri;/字符的種類i=i;while(i<=num)printf("字符%。次數(shù):dn",HCi.ch,cnti+);/輸出統(tǒng)計的情況4.3生成Huffman編碼并寫入文件代碼解釋:根據(jù)哈夫
18、曼樹T求哈夫曼編碼H。voidHuffmanEncoding(HuffmanTreeT,HuffmanCodeH)intc,p,i;charcdn;intstart;cdnum='0'for(i=i;i<=num;+i)start=num;c=i;while(p=Tc.parent)>0)/c和p分別指示t中孩子和雙親/臨時存放編碼串/指示碼在cd中的起始位置/最后一位(第num個)放上串結(jié)束符/初始位置/從葉子結(jié)點ti開始上溯/直至上溯到tc是樹根為止cd-start=(Tp.lchild=c)?'0':'i'c=p;/若tc是tp
19、的左孩子/則生成0;否則生成底碼1strcpy(Hi.bits,&cdstart);Hi.len=num-start;voidcoding(HuffmanCodeHC,char*str)/對str所代表的字符串進行編碼并寫入文件inti,j;FILE*fp;fp二fopen("D:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計哈夫曼譯碼.txt","w");while(*str)for(i=1;i<=num;i+)for(j=0;j<HCi.len;j+)if(HCi.ch=*str)fputc(HCi.bitsj,fp);/將編碼寫入文件str+;fclose(
20、fp);4.4對文件哈夫曼譯碼.txt進行譯碼譯碼代碼解釋:代碼文件哈夫曼譯碼.txt的譯碼,將翻譯的二進制碼譯成原來的字符。char*decode(HuffmanCodeHC)FILE*fp;charstr254;/假設(shè)遠文本文件不超過254個字符char*p;staticcharcdn+1;inti,j,k=0,cjs;fp=fopen("D:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計哈夫曼譯碼.txt","r");/打開文本文檔txtwhile(!feof(fp)/feof(fp)判斷文件是否真正結(jié)束,/feof(fp)=1時文件結(jié)束cjs=0;for(i=0;i<n
21、um&&cjs=0&&!feof(fp);i+)cdi=''cdi+1='0'cdi=fgetc(fp);/數(shù)組接受從fp指針所指向文件中讀/入的一個字符for(j=1;j<=num;j+)17if(strcmp(HCj.bits,cd)=O)strk二HCj.ch;k+;cjs=l;break;/haffman編碼和密碼譯碼相比較strk二'0'p=str;returnp;5系統(tǒng)調(diào)試本次測試是在我的電腦的D盤中建立一個名為哈夫曼.txt的文本文檔,其中有大寫字母KONGYONGKAISB運行程序后,我們可以
22、見到一下的運行界面。1一打幵E盤芥的數(shù)捋結(jié)構(gòu)一"七又件2-初始化并建立哈夫曼楓乳進行哈夫曼編碼V-進行哈夫曼譯碼縝退出編碼譯碼器請輸入(Jf選擇要執(zhí)彳亍的操作:.首先選擇1打開文件哈夫曼.txt然后選擇2初始化并建立哈夫曼樹*1fmanTrcu的初始化=16691ss32曲皿1qqa266926692sea1a1SSae66aRqn0eGsa世96Saee0&Rna0e6ea請按任意犍捱緣*LDADADebugpADA.exse669青錘意鍵嵯Huffirianli'ce77-E11M&110Sa2120911169213S3213a214&1
23、7;1&31126kJ2±4122154S315934It£&4167IBE171113817131413U15lfc請按任竟犍竝續(xù).-LDADADebugpADA.exs"岀岀出出出岀出出出碼著碼碼碼碼碼碼;1110:1111=311:906:1UU;101:丄丄回=901;016禹意;T:已請哈夫:曼怦碼接下來選擇3開始對已經(jīng)建立的哈夫曼樹進行編碼并寫入文件哈夫曼譯碼.txt最后對文件哈夫曼譯碼.txt進行編譯選擇4開始進行譯碼的運算由此可見此次程序圓滿成功。本程序能夠有效的多文件進行編碼,并且在譯碼文件中至于要輸入你想要的子母編碼,在最后即可
24、輸出。29總結(jié)通過兩周的課程設(shè)計使我對哈夫曼樹以及哈夫曼編碼有了更深的認識和理解,也使我更加明白哈夫曼編碼譯碼在信息技術(shù)中的重要性和地位。首先我談?wù)勎以谠O(shè)計期間我遇到的難點。開始的時候,代碼中有許多的錯誤,其中之一便是部分信息無法有效的傳遞,不過在后面的改正中我發(fā)現(xiàn)的我的錯誤。還有很多很多,例如在樹的初始化輸出中,沒有權(quán)值的節(jié)點卻出現(xiàn)亂碼,這個問題我最終是換了一種方法輸出才成功余興了,還有就是循環(huán)中出現(xiàn)的錯誤。比如將哈夫曼編碼寫入文件,就因為多了一個等號以至于哈夫曼譯碼總是不能成功譯出。許多的錯誤讓我明白了一個道理-細心是非常重要的。同時,對于編程者而言,思路清晰是相當重要的。在適當?shù)臅r候和同
25、學一起交流探討是一個十分好的學習機會。請教老師也很重要,因為畢竟我們是新手,對于某些問題很難弄清楚。而且,某些錯誤對于我們來說有時候想半天都弄不來,但老師幾下下就搞好了,這樣就更加有效地節(jié)約了時間。這次課程設(shè)計不但讓我學得了一些編程知識,還學會了系統(tǒng)的做一份課程設(shè)計報告,明白了做事情只有認真,才能真正做得更好!參考文獻1 嚴蔚敏吳偉民數(shù)據(jù)結(jié)構(gòu)(C語言版)清華大學出版社2 施伯樂.數(shù)據(jù)結(jié)構(gòu).復(fù)旦大學出版社3 譚浩強.C語言程序設(shè)計教程.高等教育出版社4 金遠平.數(shù)據(jù)結(jié)構(gòu).清華大學出版社5 王燕.面向?qū)ο蟮睦碚撆cC+實踐清華大學出版社6 李春葆.C+語言一一習題與解析清華大學出版社7 殷人昆,陶永
26、雷,謝若陽等.數(shù)據(jù)結(jié)構(gòu).清華大學出版社8 朱戰(zhàn)立,張選平.數(shù)據(jù)結(jié)構(gòu)學習指導與典型題解.西安:西安交通大學出版社9 羅文劼,王苗,石強.數(shù)據(jù)結(jié)構(gòu)習題解答與實驗指.中國鐵道出版社附錄源程序#include<stdio.h>#include<string.h>#include<stdlib.h>#include<fstream.h>#definen100#definem2*n-1intg;typedefstruct/葉子結(jié)點數(shù)/哈夫曼樹中的結(jié)點樹/存放編碼位串/權(quán)值/左右孩子幾雙親指針/0號單元不用charch;charbits9;intlen;Cod
27、eNode;typedefCodeNodeHuffmanCoden+1;typedefstructintweight;intlchild,rchild,parent;HTNode;typedefHTNodeHuffmanTreem+1;intnum;/*建立HuffmanTree*voidselect(HuffmanTreeT,intk,int&s1,int&s2)/選擇parent為0且權(quán)值最小的兩個根結(jié)點的算法/其為si和s2inti,j;intmin1=32767;for(i=i;i<=k;i+)if(Ti.weight<mini&&Ti.pa
28、rent=0)j=i;mini=Ti.weight;si=j;mini=32767;for(i=i;i<=k;i+)if(Ti.weight<mini&&Ti.parent=0&&i!=si)j=i;mini=Ti.weight;s2=j;intjsq(char*s,intcnt,charstr)/統(tǒng)計字符串中各種字母的個數(shù)以及字符的種類inti,j,k;char*p;inttemp53;for(i=1;i<=52;i+)tempi=0;for(p=s;*p!='0'p+)if(*p>='A'&&a
29、mp;*p<='z')k=*p-64;tempk+;for(i=1,j=0;i<=52;+i)if(tempi!=0)j+;strj=i+64;cntj=tempi;returnj;/j是輸入字母總數(shù)voidChuffmanTree(HuffmanTreeHT,HuffmanCodeHC,intcnt)/構(gòu)造哈夫曼樹HTinti,s1,s2;for(i=1;i<=2*num-1;i+)HTi.lchild=0;HTi.rchild=0;HTi.parent=0;HTi.weight=0;for(i=l;i二num;i+)/輸入num個葉結(jié)點的權(quán)值HTi.wei
30、ght=cnti;for(i=num+1;i=2*num-1;i+)select(HT,i-1,s1,s2);HTs1.parent=i;HTs2.parent=i;HTi.lchild=s1;HTi.rchild=s2;HTi.weight=HTs1.weight+HTs2.weight;voidHuffmanEncoding(HuffmanTreeT,HuffmanCodeH)/生成哈夫曼編碼intc,p,i;/c和p分別指示t中孩子和雙親charcdn;intstart;cdnum='0'for(i=1;i<=num;+i)start=num;c=i;while(p
31、=Tc.parent)>0)cd-start=(Tp.lchild=c)?'0':'1'c=p;strcpy(Hi.bits,&cdstart);Hi.len=num-start;for(i=1;i<=num;i+)printf("輸出編碼:sn",Hi.bits);/代碼文件哈夫曼譯碼.txt的譯碼char*decode(HuffmanCodeHC)FILE*fp;charstr254;/假設(shè)文本文件不超過254個字符char*p;staticcharcdn+1;inti,j,k=0,cjs;fp二fopen("
32、;D:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計哈夫曼譯碼.txt","r");/打開文本文檔txtwhile(!feof(fp)/feof(fp)判斷文件是否真正結(jié)束,feof(fp)=1時文件結(jié)束cjs=0;for(i=0;i<num&&cjs=O&&!feof(fp);i+)cdi=''cdi+1='0'cdi=fgetc(fp);/數(shù)組接受從fp指針所指向文件中讀入的一個字符for(j=1;j<=num;j+)if(strcmp(HCj.bits,cd)=O)/haffman編碼和密碼譯碼相比較strk=H
33、Cj.ch;k+;cjs=1;break;strk='0'p=str;returnp;/*輸出HuffmanTree存儲結(jié)構(gòu)*voidprintl(HuffmanTreeHT)/初建哈夫曼intx;for(x=1;x<=2*num-1;x+)HTx.parent=0;HTx.lchild=0;HTx.rchild=0;if(x>num)printf("tt%dt%dt%dn",HTx.parent,HTx.lchild,HTx.rchild);elseprintf("t%-6d%dt%dt%dn",HTx.weight,HTx
34、.parent,HTx.lchild,HTx.rchild);printf("n");voidprint2(HuffmanTreeHT)intk;for(k=1;k<=2*num-1;k+)printf("t%dt%dt%dt%dn",HTk.weight,HTk.parent,HTk.lchild,HTk.rchild);printf("n");voidDhuffmanTree(HuffmanTreeHT,intcnt)/初始化哈夫曼樹inti;for(i=1;i<=num;i+)/輸入num個葉結(jié)點的權(quán)值HTi.wei
35、ght=cnti;/*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*X*X*X*LzII_!_/>l*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*/*T*1I1If/IVintopen(charstring)FILE*fp;if(fp二fopen("D:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計哈夫曼.txt","r")=NULL)printf("不能打開文件!n");exit(1);while(fgets(string,100,fp)!=NULL)printf("%sn",string);fclose(fp);return0;voidmain()charstring100;char*s,str53;intcnt53;intchoice;inti;HuffmanTreeHT;HuffmanCodeHC;while(choice)printf("nnnt*哈夫曼編碼與譯碼的實現(xiàn)*nnn");printf("tttl.打開D盤的的數(shù)據(jù)結(jié)構(gòu).txt文件nn");printf("ttt2.初始化并建立哈夫曼樹nn");printf
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三年級數(shù)學期末考試分析報告
- 東信和平行業(yè)分析報告
- 油脂行業(yè)政策風險分析報告
- 啟迪藥業(yè)行業(yè)分析報告
- 毛筆行業(yè)的亂象分析報告
- 餐旅行業(yè)前景分析報告
- 近年來行業(yè)分析報告
- 國內(nèi)床墊行業(yè)的分析研究報告
- 酒店客房易耗品管理制度
- 倉庫衛(wèi)生獎懲管理制度
- GB/T 46886-2025智能檢測裝備通用技術(shù)要求
- 護理護理科研與論文寫作
- 2025年健康體檢中心服務(wù)與質(zhì)量管理手冊
- 2025-2030中國駱駝市場前景規(guī)劃與投資運作模式分析研究報告
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責任公司社會成熟人才招聘備考題庫及完整答案詳解一套
- 鋼結(jié)構(gòu)玻璃雨棚安裝施工方案
- 鄂爾多斯輔警考試題型及答案
- 《中華人民共和國危險化學品安全法》全套解讀
- 房建工程電氣安裝施工方案
- 同等學力申碩公共管理真題及答案
- 2025初三英語中考英語滿分作文
評論
0/150
提交評論