

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課 程 設(shè) 計(jì)</b></p><p><b> 課程設(shè)計(jì)任務(wù)書(shū)</b></p><p> 2011~2012學(xué)年第 2學(xué)期</p><p> 學(xué)生姓名: **** 專業(yè)班級(jí):**********</p><p> 指導(dǎo)教師: ***
2、 工作部門(mén): 計(jì)算機(jī)學(xué)院 </p><p> 一、課程設(shè)計(jì)題目:哈夫曼樹(shù)的應(yīng)用</p><p> 二、課程設(shè)計(jì)內(nèi)容(含技術(shù)指標(biāo))</p><p> 1.從終端讀入字符集大小n,以及n個(gè)字符和n個(gè)權(quán)值,建立哈夫曼樹(shù)并將它存于文件hfmTree中.將已在內(nèi)存中的哈夫曼樹(shù)以直觀的方式(比如樹(shù))顯示在終端上;</p><p>
3、; 2.利用已經(jīng)建好的哈夫曼樹(shù)(如不在內(nèi)存,則從文件htmTree中讀入),對(duì)文件Text.txt中的正文進(jìn)行編碼,然后將結(jié)果存入文件Code.txt中。</p><p> 3.利用已建好的哈夫曼樹(shù)將文件Code.txt中的代碼進(jìn)行譯碼,結(jié)果存入文件Text.txt中,并輸出結(jié)果。</p><p><b> 三、進(jìn)度安排</b></p><p
4、> 2012年6月11日 設(shè)計(jì)動(dòng)員,布置任務(wù)</p><p> 2012年6月12日~2012年6月13日,查閱資料,分析、討論與設(shè)計(jì)</p><p> 2012年6月14日~2011年6月19日,編寫(xiě)程序,進(jìn)行調(diào)試</p><p> 2012年6月20日~2011年6月21日,完成模塊聯(lián)調(diào),進(jìn)行測(cè)試</p><p> 201
5、2年6月22日,成果驗(yàn)收,完成設(shè)計(jì)報(bào)告、答辯</p><p><b> 四、基本要求</b></p><p> 1.分析問(wèn)題,給出數(shù)學(xué)模型,選擇數(shù)據(jù)結(jié)構(gòu)。</p><p> 2.設(shè)計(jì)算法,給出算法描述,給出源程序清單。</p><p> 3.編輯、編譯、調(diào)試源程序,撰寫(xiě)課程設(shè)計(jì)報(bào)告。</p><
6、;p> 4.界面友好,函數(shù)功能要?jiǎng)澐趾?lt;/p><p> 5.總體設(shè)計(jì)應(yīng)畫(huà)一流程圖</p><p> 6.程序要加必要的注釋</p><p> 7.要提供程序測(cè)試方案</p><p> 8.程序一定要經(jīng)得起測(cè)試,寧可功能少一些,也要能運(yùn)行起來(lái),不能運(yùn)行的程序是沒(méi)有價(jià)值的。 </p><p>
7、;<b> 目 錄</b></p><p><b> 摘要1</b></p><p><b> 一 概述2</b></p><p> 1.課程設(shè)計(jì)的目的2</p><p> 2.課程設(shè)計(jì)的要求2</p><p> 3.哈夫曼算法的實(shí)
8、現(xiàn)2</p><p> 二 總體方案設(shè)計(jì)3</p><p> 1.整體的設(shè)計(jì)思路3</p><p> 2.算法的整體思路3</p><p><b> 3.工作內(nèi)容3</b></p><p><b> 4.關(guān)鍵問(wèn)題4</b></p><
9、p><b> 三 詳細(xì)設(shè)計(jì)5</b></p><p> 1.總體設(shè)計(jì)流程圖5</p><p> 2.建立哈夫曼樹(shù)5</p><p><b> 3.編碼功能6</b></p><p><b> 4.譯碼功能6</b></p><p&g
10、t; 四 程序的調(diào)試與運(yùn)行結(jié)果說(shuō)明7</p><p> 五 課程設(shè)計(jì)總結(jié)10</p><p><b> 程序部分代碼11</b></p><p><b> 參考文獻(xiàn)14</b></p><p><b> 摘要</b></p><p>
11、 隨著計(jì)算機(jī)的普遍應(yīng)用與日益發(fā)展,其應(yīng)用早已不局限于簡(jiǎn)單的數(shù)值運(yùn)算,而涉及到問(wèn)題的分析、數(shù)據(jù)結(jié)構(gòu)框架的設(shè)計(jì)以及設(shè)計(jì)最短路線等復(fù)雜的非數(shù)值處理和操作。算法與數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)就是為以后利用計(jì)算機(jī)資源高效地開(kāi)發(fā)非數(shù)值處理的計(jì)算機(jī)程序打下堅(jiān)實(shí)的理論、方法和技術(shù)基礎(chǔ)。</p><p> 算法與數(shù)據(jù)結(jié)構(gòu)旨在分析研究計(jì)算機(jī)加工的數(shù)據(jù)對(duì)象的特性,以便選擇適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)和存儲(chǔ)結(jié)構(gòu),從而使建立在其上的解決問(wèn)題的算法達(dá)到最優(yōu)。<
12、/p><p> 數(shù)據(jù)結(jié)構(gòu)是在整個(gè)計(jì)算機(jī)科學(xué)與技術(shù)領(lǐng)域上廣泛被使用的術(shù)語(yǔ)。它用來(lái)反映一個(gè)數(shù)據(jù)的內(nèi)部構(gòu)成,即一個(gè)數(shù)據(jù)由那些成分?jǐn)?shù)據(jù)構(gòu)成,以什么方式構(gòu)成,呈什么結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)有邏輯上的數(shù)據(jù)結(jié)構(gòu)和物理上的數(shù)據(jù)結(jié)構(gòu)之分。邏輯上的數(shù)據(jù)結(jié)構(gòu)反映成分?jǐn)?shù)據(jù)之間的邏輯關(guān)系,而物理上的數(shù)據(jù)結(jié)構(gòu)反映成分?jǐn)?shù)據(jù)在計(jì)算機(jī)內(nèi)部的存儲(chǔ)安排。數(shù)據(jù)結(jié)構(gòu)是數(shù)據(jù)存在的形式。</p><p> 《數(shù)據(jù)結(jié)構(gòu)》主要介紹一些最常用的數(shù)據(jù)結(jié)
13、構(gòu),闡明各種數(shù)據(jù)結(jié)構(gòu)內(nèi)在的邏輯關(guān)系,討論其在計(jì)算機(jī)中的存儲(chǔ)表示,以及在其上進(jìn)行各種運(yùn)算時(shí)的實(shí)現(xiàn)算法,并對(duì)算法的效率進(jìn)行簡(jiǎn)單的分析和討論。數(shù)據(jù)結(jié)構(gòu)是介于數(shù)學(xué)、計(jì)算機(jī)軟件和計(jì)算機(jī)硬件之間的一門(mén)計(jì)算機(jī)專業(yè)的核心課程,它是計(jì)算機(jī)程序設(shè)計(jì)、數(shù)據(jù)庫(kù)、操作系統(tǒng)、編譯原理及人工智能等的重要基礎(chǔ),廣泛的應(yīng)用于信息學(xué)、系統(tǒng)工程等各種領(lǐng)域。</p><p> 學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)是為了將實(shí)際問(wèn)題中所涉及的對(duì)象在計(jì)算機(jī)中表示出來(lái)并對(duì)它們進(jìn)行處
14、理。通過(guò)課程設(shè)計(jì)可以提高學(xué)生的思維能力,促進(jìn)學(xué)生的綜合應(yīng)用能力和專業(yè)素質(zhì)的提高。</p><p><b> 一 概述</b></p><p><b> 1.課程設(shè)計(jì)的目的</b></p><p> 1.理解和掌握該課程中的有關(guān)基本概念,程序設(shè)計(jì)思想和方法。</p><p> 2.培養(yǎng)綜合運(yùn)用
15、所學(xué)知識(shí)獨(dú)立完成課題的能力。</p><p> 3.培養(yǎng)勇于探索、嚴(yán)謹(jǐn)推理、實(shí)事求是、有錯(cuò)必改,用實(shí)踐來(lái)檢驗(yàn)理論,全方位考慮問(wèn)題等科學(xué)技術(shù)人員應(yīng)具有的素質(zhì)。</p><p> 4.掌握從資料文獻(xiàn)、科學(xué)實(shí)驗(yàn)中獲得知識(shí)的能力,提高學(xué)生從別人經(jīng)驗(yàn)中找到解決問(wèn)題的新途徑的悟性,初步培養(yǎng)工程意識(shí)和創(chuàng)新能力。</p><p><b> 2.課程設(shè)計(jì)的要求<
16、/b></p><p> 一個(gè)完整的系統(tǒng)至少具有以下功能:</p><p> (1) I:初始化(Initialization)。從終端讀入字符集大小n,以及n個(gè)字符和n個(gè)權(quán)值,建立赫夫曼樹(shù),并將它存于文件hfmTree中。</p><p> (2) E:編碼(Encoding)。利用已建好的赫夫曼樹(shù)(如不在內(nèi)存,則從文件hfmTree中讀入),對(duì)文件T
17、oBeTran中的正文進(jìn)行編碼,然后將結(jié)果存入文件CodeFile中。</p><p> (3) D:譯碼(Decoding)。利用已建好的赫夫曼樹(shù)將文件CodeFile中的代碼進(jìn)行譯碼,結(jié)果存入文件Textfile中。</p><p> 3.哈夫曼算法的實(shí)現(xiàn)</p><p> 由哈夫曼樹(shù)的構(gòu)造過(guò)程可知,初始森林中共有n棵二叉樹(shù),每棵樹(shù)中都僅有一個(gè)孤立的結(jié)點(diǎn),
18、它們既是根,又是葉子。然后將當(dāng)前森林中的兩棵根結(jié)點(diǎn)權(quán)值最小的二叉樹(shù),合并成一棵新二叉樹(shù)。每合并一次,森林中就減少一棵樹(shù)。顯然,要進(jìn)行n-l次合并,才能使森林中的二叉樹(shù)的數(shù)目,由n棵減少到剩下一棵最終的哈夫曼樹(shù)。并且每次合并,都要產(chǎn)生一個(gè)新結(jié)點(diǎn),合并n-l次共產(chǎn)生n-1個(gè)新結(jié)點(diǎn),顯然它們都是具有兩個(gè)孩子的分支結(jié)點(diǎn)。由此可知,最終求得的哈夫曼樹(shù)中共有2n-1個(gè)結(jié)點(diǎn),其中n個(gè)葉結(jié)點(diǎn)是初始森林中的n個(gè)孤立結(jié)點(diǎn),并且哈夫曼樹(shù)中沒(méi)有度為1的分支結(jié)點(diǎn)
19、。因此,在構(gòu)造哈夫曼樹(shù)時(shí),可以設(shè)置一個(gè)大小為2n-1的數(shù)組ht保存哈夫曼樹(shù)中各結(jié)點(diǎn)的信息。</p><p><b> 二 總體方案設(shè)計(jì)</b></p><p><b> 1.整體的設(shè)計(jì)思路</b></p><p> 利用哈夫曼編碼進(jìn)行通信可以大大提高信道利用率,縮短信息傳輸時(shí)間,降低傳輸成本。這要求在發(fā)送端通過(guò)一個(gè)編
20、碼系統(tǒng)對(duì)待傳輸預(yù)先編碼,在接收端將傳來(lái)的數(shù)據(jù)進(jìn)行譯碼。對(duì)于雙工通道(即可以雙向傳輸信息的信道),每端都需要一個(gè)完整的編/譯碼系統(tǒng)。本課程設(shè)計(jì)實(shí)現(xiàn)這樣的信息收發(fā)站,編寫(xiě)一個(gè)哈夫曼碼的編/譯碼系統(tǒng)。</p><p> 系統(tǒng)共分為四個(gè)子系統(tǒng):初始化哈夫曼樹(shù);編碼;譯碼;打印哈夫曼樹(shù)。</p><p> 輸入相應(yīng)的數(shù)字后按回車鍵即可進(jìn)入相應(yīng)的系統(tǒng)。在相應(yīng)的系統(tǒng)內(nèi)可完成相應(yīng)的功能。各模塊相對(duì)獨(dú)立
21、,每個(gè)模塊用一個(gè)大型的函數(shù)來(lái)處理數(shù)據(jù)。</p><p><b> 2.算法的整體思路</b></p><p> 本系統(tǒng)能根據(jù)輸入的字符數(shù)生成哈夫曼樹(shù),并自動(dòng)輸出各字符的哈夫曼編碼。通過(guò)對(duì)單鏈表的結(jié)點(diǎn)查找,結(jié)點(diǎn)插入等一些算法建立一個(gè)根據(jù)頭結(jié)點(diǎn)來(lái)插入數(shù)據(jù)的函數(shù),通過(guò)對(duì)此函數(shù)的調(diào)用建立一個(gè)根據(jù)輸入的數(shù)據(jù)來(lái)輸入信息的函數(shù)。修改信息,排序,查找信息等模塊的函數(shù)均用同樣的方法
22、處理。</p><p><b> 3.工作內(nèi)容</b></p><p> 工作進(jìn)程安排:系統(tǒng)設(shè)計(jì),詳細(xì)設(shè)計(jì),編寫(xiě)代碼,結(jié)果測(cè)試與分析。</p><p> 本人負(fù)責(zé)模塊:譯碼功能。</p><p> 功能分析:譯碼(Decoding)。將codefile.txt文檔中的編碼以字符形式輸出。</p>&
23、lt;p> 譯碼原則:在完成Huffman編碼后,我們利用其構(gòu)建的哈夫曼編碼樹(shù)來(lái)進(jìn)行譯碼。與編碼過(guò)程不同,譯碼過(guò)程中,我們將用戶輸入的二進(jìn)制代碼串依次與字符集中的每個(gè)字符的編碼進(jìn)行比較,從根結(jié)點(diǎn)出發(fā),逐個(gè)讀入電文中的二進(jìn)制碼;若代碼為“0”,則走左子樹(shù)的根結(jié)點(diǎn),否則走向右子樹(shù)的根結(jié)點(diǎn);一旦到達(dá)葉子結(jié)點(diǎn),便譯出代碼所對(duì)應(yīng)的字符。然后又重新從根結(jié)點(diǎn)開(kāi)始繼續(xù)譯碼,直到二進(jìn)制電文結(jié)束。</p><p><b
24、> 實(shí)現(xiàn)代碼:</b></p><p> void Decoding()</p><p> { cout << "下面對(duì)根目錄下文件codefile.txt中的字符進(jìn)行譯碼" << endl;</p><p> FILE *codef, *txtfile;</p><p&g
25、t; if ((txtfile = fopen("Textfile.txt", "w")) == NULL)// w 只寫(xiě)</p><p> { cout << "不能打開(kāi)文件" << endl; }</p><p> if ((codef = fopen("codefile.tx
26、t", "r")) == NULL)// r 只讀</p><p> { cout << "不能打開(kāi)文件" << endl; }</p><p> char *work, *work2, i2;</p><p> int i4 = 0, i, i3;</p>&
27、lt;p> unsigned long length = 10000;</p><p> work = (char*)malloc(length *sizeof(char));</p><p> fgets(work, length, codef);</p><p> work2 = (char*)malloc(length *sizeof(char)
28、);</p><p> i3 = 2 * n - 1;</p><p> for (i = 0; *(work + i - 1) != '\0'; i++)</p><p> { i2 = *(work + i);</p><p> if (HT[i3].lchild == 0)</p><p
29、> { *(work2 + i4) = *(z + i3 - 1);</p><p> i4++; i3 = 2 * n - 1; i--;</p><p><b> }</b></p><p> else if (i2 == '0')</p><p> i3
30、 = HT[i3].lchild;</p><p> else if (i2 == '1')</p><p> i3 = HT[i3].rchild;</p><p><b> }</b></p><p> *(work2 + i4) = '\0';</p><
31、p> fputs(work2, txtfile);</p><p> cout << "譯碼完成" << endl << "內(nèi)容寫(xiě)入根目錄下的文件txtfile.txt中" << endl<< endl;</p><p> cout << work2<<e
32、ndl;</p><p> free(work); free(work2);</p><p> fclose(txtfile); fclose(codef);</p><p><b> }</b></p><p><b> 4.關(guān)鍵問(wèn)題</b></p>&
33、lt;p> (1)哈夫曼樹(shù)的構(gòu)建,輸入字符與權(quán)值后哈夫曼編碼的生成。</p><p> ?。?)編碼(Encoding)。輸入要編碼的字符,存入text.txt文檔中,通過(guò)編碼程序,將字符以哈夫曼編碼形式存在codefile.txt文檔中。</p><p> ?。?)將哈夫曼樹(shù)以樹(shù)型打印出來(lái)。</p><p><b> 三 詳細(xì)設(shè)計(jì)</b&
34、gt;</p><p><b> 1.總體設(shè)計(jì)流程圖</b></p><p> 圖3-1 主要功能流程圖</p><p><b> 2.建立哈夫曼樹(shù)</b></p><p> 功能:1.進(jìn)入輸入系統(tǒng)后選擇需要進(jìn)行的操作步驟。輸入待編碼的字符數(shù),并且隨即輸入編碼字符的權(quán)值。 </p&g
35、t;<p><b> 3.編碼功能</b></p><p> 功能:輸入需要編碼的字符,編碼后存入文檔。再輸出編碼。</p><p><b> 4.譯碼功能</b></p><p> 功能:選擇譯碼步驟,將Codefile.txt中的編碼進(jìn)行譯碼。</p><p> 四 程序
36、的調(diào)試與運(yùn)行結(jié)果說(shuō)明</p><p><b> 1.初始化哈夫曼樹(shù)</b></p><p><b> 2.編碼功能</b></p><p><b> 3.譯碼功能</b></p><p><b> 4.打印哈夫曼樹(shù)</b></p>&
37、lt;p><b> 5.調(diào)試分析</b></p><p> 5.1 調(diào)試過(guò)程中遇到的問(wèn)題</p><p> ?。?)文件的調(diào)用與寫(xiě)入。</p><p> 由于文件的內(nèi)容學(xué)習(xí)得不夠扎實(shí),在從tobetran.txt文檔中讀取已經(jīng)輸入的字符進(jìn)行編碼時(shí)出現(xiàn)了問(wèn)題。程序首先能成功讀取字符,并進(jìn)行編碼存入Codefile.txt文檔中,但無(wú)法
38、再?gòu)腃odefile.txt文檔中讀出已經(jīng)編碼的值。</p><p> 解決方法:設(shè)置一個(gè)全局結(jié)構(gòu)體變量來(lái)存放已經(jīng)在文件中存放的哈夫曼樹(shù)。</p><p> ?。?)Huffman樹(shù)的打印。</p><p> 由于在學(xué)習(xí)中并未留意數(shù)據(jù)如何類似圖形輸出,算法思想也不了解。因此這一模塊無(wú)法成功完成。</p><p> 解決方案:由其他組員完
39、成,但未完善解決,只是將內(nèi)存中的哈夫曼樹(shù)中各節(jié)點(diǎn)的值及其孩子輸出。</p><p> 5.2 算法的時(shí)空分析</p><p><b> 算法的時(shí)間復(fù)雜度:</b></p><p> Select(HuffmanTree HT,int end,int *s1,int *s2) O(n)</p><p> Hu
40、ffmanCoding(Huffman Hfm) O(n2)</p><p> InitHuffman(Huffman Hfm) O(n)</p><p> Encoding(Huffman Hfm) O(n)</p><p> Decoding(Huff
41、man Hfm) O(n)</p><p> Print(Huffman Hfm) O(n)</p><p><b> 五 課程設(shè)計(jì)總結(jié)</b></p><p> 通過(guò)為期半個(gè)月的課程設(shè)計(jì),我們對(duì)《數(shù)據(jù)結(jié)構(gòu)》這門(mén)課程有了更深一步的了解。它是計(jì)算機(jī)程序設(shè)
42、計(jì)的重要理論技術(shù)基礎(chǔ),在我們計(jì)算機(jī)專業(yè)的學(xué)習(xí)中占據(jù)著十分重要的地位。同時(shí)也使我們知道,要學(xué)好這門(mén)課程,僅學(xué)習(xí)書(shū)本上的知識(shí)是不夠的,還要有較強(qiáng)的實(shí)踐能力。因?yàn)槲覀儗W(xué)習(xí)知識(shí)就是為了實(shí)踐。而只有多實(shí)踐,多編寫(xiě)程序,才能更好的理解與掌握書(shū)本上的東西。</p><p> 我從實(shí)踐中明白了C語(yǔ)言的模塊化設(shè)計(jì)的理論。將一個(gè)大任務(wù)分成若干個(gè)較小的任務(wù),較小的任務(wù)又細(xì)分為更小的任務(wù),直到更小的任務(wù)功能較為單一,便于實(shí)現(xiàn)為止,每個(gè)
43、小任務(wù)為一個(gè)模塊。各個(gè)模塊功能單一,獨(dú)立編程,獨(dú)立存放,單獨(dú)調(diào)試,可以為多個(gè)程序所調(diào)用,并可以由不同的人實(shí)現(xiàn)。</p><p> 在以后的編程過(guò)程中,我會(huì)按照軟件開(kāi)發(fā)的方法,步驟,原則認(rèn)真的完成軟件開(kāi)發(fā)。不斷尋求最優(yōu)的解決問(wèn)題的辦法,使自己開(kāi)發(fā)出來(lái)的軟件運(yùn)行效率更高,功能更加完善。</p><p> 對(duì)于自己解決不了的問(wèn)題可以在網(wǎng)上查找,找同學(xué)幫忙,復(fù)習(xí)教材相應(yīng)的內(nèi)容,并且不斷地學(xué)習(xí)新
44、知識(shí),以使自己在軟件開(kāi)發(fā)方面跟上時(shí)代的發(fā)展。</p><p><b> 程序部分代碼</b></p><p> // -----------------求赫夫曼編碼-----------------------</p><p> int min(HuffmanTree t, int i)</p><p> {
45、int j, flag;</p><p> int k = UINT_MAX; //k存最小權(quán)值,初值取整型最大值</p><p> for (j = 1; j <= i; j++)//對(duì)于前i個(gè)結(jié)點(diǎn),尋找第一最小值</p><p> if (t[j].weight < k && t[j].parent == 0) </p&g
46、t;<p> k = t[j].weight, flag = j; </p><p> t[flag].parent = 1;</p><p> return flag;</p><p><b> }</b></p><p> //--------------------slect函數(shù)------
47、----------------</p><p> void select(HuffmanTree t, int i, int &s1, int &s2)</p><p> { int j;</p><p> s1 = min(t, i);//尋找第一個(gè)最小值</p><p> s2 = min(t, i);//尋
48、找第二最小值</p><p> if (s1 > s2)</p><p> { j = s1;</p><p><b> s1 = s2;</b></p><p><b> s2 = j;</b></p><p><b> }</b>
49、;</p><p><b> }</b></p><p> // --------------構(gòu)造赫夫曼樹(shù)--------------------</p><p> void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n)</p>
50、<p> { int m, i, s1, s2, start;//*m表示結(jié)點(diǎn)個(gè)數(shù)*//</p><p><b> int c, f;</b></p><p> HuffmanTree p;</p><p><b> char *cd;</b></p><p> if (n &
51、lt;= 1)//葉子結(jié)點(diǎn)數(shù)不大于n</p><p><b> return ;</b></p><p> m = 2 * n - 1; //n個(gè)葉子結(jié)點(diǎn)的哈弗曼樹(shù)共有m個(gè)結(jié)點(diǎn)</p><p> HT = (HuffmanTree)malloc((m + 1) *sizeof(HTNode)); // 0號(hào)單元未用</p>
52、<p> for (p = HT + 1, i = 1; i <= n; ++i, ++p, ++w)</p><p> { p->weight = *w;//*賦權(quán)值*//</p><p> p->parent = 0;//*雙親域?yàn)榭眨ㄊ歉Y(jié)點(diǎn))*//</p><p> p->lchild = 0;//*左右孩子
53、為空(是葉子結(jié)點(diǎn))*//</p><p> p->rchild = 0;</p><p><b> }</b></p><p> for (; i <= m; ++i, ++p) //*i從n+1到m*///</p><p> p->parent=0; //*雙親域?yàn)榭眨ㄊ歉Y(jié)點(diǎn))*//<
54、;/p><p> p->lchild=0; //*左右孩子為空(是葉子結(jié)點(diǎn))*//</p><p> p->rchild=0;*/</p><p> p->parent = 0;</p><p> for (i = n + 1; i <= m; ++i)</p><p> { se
55、lect(HT, i - 1, s1, s2);</p><p> HT[s1].parent = HT[s2].parent = i;//*i號(hào)單元是s1和s2的雙親*//</p><p> HT[i].lchild = s1;//*i號(hào)單元的左右孩子分別是s1和s2*//</p><p> HT[i].rchild = s2;</p><
56、;p> HT[i].weight = HT[s1].weight + HT[s2].weight; }</p><p> HC = (HuffmanCode)malloc((n + 1) *sizeof(char*));</p><p> cd = (char*)malloc(n *sizeof(char)); // 分配求編碼的工作空間</p><p&g
57、t; cd[n - 1] = '\0'; // 編碼結(jié)束符</p><p> for (i = 1; i <= n; i++)</p><p> { start = n - 1; // 編碼結(jié)束符位置</p><p> for (c = i, f = HT[i].parent; f != 0; c = f, f = HT[f
58、].parent)</p><p> if (HT[f].lchild == c) //*c是其雙親的左孩子*//</p><p> cd[--start] = '0';</p><p><b> else</b></p><p> cd[--start] = '1'; </
59、p><p> HC[i] = (char*)malloc((n - start) *sizeof(char));</p><p> strcpy(HC[i], &cd[start]); // 從cd復(fù)制編碼(串)到HC</p><p><b> }</b></p><p> free(cd); // 釋放工作
60、空間</p><p><b> }</b></p><p> //------------------------打印赫夫曼樹(shù)的函數(shù)-----------------------</p><p> void coprint(HuffmanTree start, HuffmanTree HT)</p><p> {
61、 if (start != HT)</p><p> { FILE *TreePrint;</p><p> if ((TreePrint = fopen("TreePrint.txt", "a")) == NULL)</p><p> { cout << "創(chuàng)建文件失敗"
62、; << endl;</p><p><b> return ;</b></p><p><b> }</b></p><p> numb++; //該變量為已被聲明為全局變量</p><p> coprint(HT + start->rchild, HT);</p&
63、gt;<p> cout << setw(5 *numb) << start->weight << endl;</p><p> fprintf(TreePrint, "%d\n", start->weight);</p><p> coprint(HT + start->lchild, HT);
64、</p><p><b> numb--;</b></p><p> fclose(TreePrint);</p><p><b> }</b></p><p><b> }</b></p><p> void Tree_printing(Hu
65、ffmanTree HT, int w)</p><p> { HuffmanTree p;</p><p> p = HT + w;</p><p> cout << "下面打印赫夫曼樹(shù)" << endl;</p><p> coprint(p, HT);</p><
66、p> cout << "打印工作結(jié)束" << endl;</p><p><b> }</b></p><p> //------------------------主函數(shù)------------------------------------</p><p> void main()&
67、lt;/p><p> { char choice;</p><p> while (choice != 'q')</p><p> { cout << " "<<" 哈夫曼編碼解碼系統(tǒng)" << endl;</p><p>
68、 cout << "1.初始化哈夫曼樹(shù)" << " 2.編 碼 功 能" << endl;</p><p> cout << "3.譯 碼 功 能 " << " 4.打印哈夫曼樹(shù)" << endl;</p><p>
69、cout << "5.退 出 系 統(tǒng)" << endl;</p><p> cout<<"請(qǐng)輸入您要進(jìn)行的操作:";</p><p> cin >> choice;</p><p> switch (choice)</p><p> { cas
70、e '1':</p><p> Initialization();</p><p><b> break;</b></p><p><b> case '2':</b></p><p> InputCode();</p><p> E
71、ncoding();</p><p><b> break;</b></p><p><b> case '3':</b></p><p> Decoding();</p><p><b> break;</b></p><p>
72、<b> case '4':</b></p><p> Tree_printing(HT, 2 *n - 1);</p><p><b> break;</b></p><p><b> case '5':</b></p><p><
73、;b> default:</b></p><p> cout << "input error" << endl;</p><p><b> }</b></p><p><b> }</b></p><p><b> f
74、ree(z);</b></p><p><b> free(w);</b></p><p><b> free(HT);</b></p><p><b> }</b></p><p><b> 參考文獻(xiàn)</b></p>&
75、lt;p> [1]鄧又明,數(shù)據(jù)結(jié)構(gòu)(第一版),北京,地質(zhì)出版社,2007年8月。</p><p> [2]劉天印,C語(yǔ)言程序設(shè)計(jì)(第一版),北京,科學(xué)出版社,2007年3月。</p><p> [3]嚴(yán)蔚敏,吳偉民編著,數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版),北京;清華大學(xué)出版社,2005</p><p> [4]嚴(yán)蔚敏,陳文博編著,數(shù)據(jù)結(jié)構(gòu)及應(yīng)用算法教程,北京;清華大
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---哈夫曼樹(shù)的應(yīng)用
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--哈夫曼樹(shù)的應(yīng)用
- 哈夫曼樹(shù)_數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 哈夫曼樹(shù)_數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--- 哈夫曼樹(shù)的應(yīng)用
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告----哈夫曼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)哈夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----赫夫曼樹(shù)
- 數(shù)據(jù)結(jié)構(gòu)-赫夫曼樹(shù)-課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu) 課程設(shè)計(jì)之哈夫曼編碼
- 哈夫曼編碼譯碼數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(赫夫曼樹(shù)的建立)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---哈夫曼編碼器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---哈夫曼編碼器
- 哈夫曼編碼譯碼數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論