![](https://static.zsdocx.com/FlexPaper/FileRoot/2019-6/5/21/27172cc0-17a3-4661-b252-5018c0837181/27172cc0-17a3-4661-b252-5018c0837181pic.jpg)
![數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---哈夫曼編碼器_第1頁(yè)](https://static.zsdocx.com/FlexPaper/FileRoot/2019-6/5/21/27172cc0-17a3-4661-b252-5018c0837181/27172cc0-17a3-4661-b252-5018c08371811.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 摘 要</b></p><p> 哈夫曼(huffman)樹(shù)是一種帶權(quán)路徑長(zhǎng)度最小的二叉樹(shù),也稱最優(yōu)二叉樹(shù),它有著極為廣泛的應(yīng)用。而我今天做的課程設(shè)計(jì)就是其中的一個(gè)應(yīng)用---哈夫曼編碼器。其實(shí)它的思想很簡(jiǎn)單,顯示根據(jù)輸入的權(quán)值建立一棵哈夫曼樹(shù),然后根據(jù)哈夫曼數(shù)求出各個(gè)葉結(jié)點(diǎn)的編碼。這樣就構(gòu)成了一個(gè)最簡(jiǎn)單的哈夫曼編碼器。</p><p>
2、; 關(guān)鍵詞:哈夫曼樹(shù) 編碼器 最優(yōu)二叉樹(shù) 帶權(quán)路徑長(zhǎng)度</p><p><b> 目 錄</b></p><p><b> 1 課題分析1</b></p><p> 1.1 設(shè)計(jì)目的1</p><p> 1.2 設(shè)計(jì)要求1</p><p><
3、;b> 1.3設(shè)計(jì)內(nèi)容1</b></p><p> 2 總體設(shè)計(jì)與分析3</p><p> 2.1功能函數(shù)設(shè)計(jì)3</p><p> 2.1.1建立哈夫曼樹(shù)3</p><p> 2.2.2求哈夫曼編碼函數(shù)3</p><p> 2.2.3打印編碼函數(shù)3</p>&l
4、t;p><b> 3 程序說(shuō)明4</b></p><p><b> 3.1 結(jié)構(gòu)圖4</b></p><p><b> 4 程序調(diào)試5</b></p><p><b> 4.1 菜單5</b></p><p> 4.2 輸入葉結(jié)點(diǎn)和
5、權(quán)值6</p><p> 4.3 輸出哈夫曼編碼7</p><p><b> 5 設(shè)計(jì)問(wèn)題8</b></p><p><b> 5.1存入文件8</b></p><p> 5.1.1問(wèn)題18</p><p> 5.1.2問(wèn)題28</p>&
6、lt;p><b> 6 小結(jié)9</b></p><p><b> 參考文獻(xiàn)10</b></p><p><b> 源代碼11</b></p><p><b> 1 課題分析</b></p><p> 在當(dāng)今信息爆炸時(shí)代,如何采用有效的
7、數(shù)據(jù)壓縮技術(shù)節(jié)省數(shù)據(jù)文件的存儲(chǔ)空間和計(jì)算機(jī)網(wǎng)絡(luò)的傳送時(shí)間已越來(lái)越引起人們的重視,哈夫曼編碼正是一種應(yīng)用廣泛且非常有效的數(shù)據(jù)壓縮技術(shù)。哈夫曼編碼是一種編碼方式,以哈夫曼樹(shù)—即最優(yōu)二叉樹(shù),帶權(quán)路徑長(zhǎng)度最小的二叉樹(shù),經(jīng)常應(yīng)用于數(shù)據(jù)壓縮。哈夫曼編碼使用一張?zhí)厥獾木幋a表將源字符(例如某文件中的一個(gè)符號(hào))進(jìn)行編碼。這張編碼表的特殊之處在于,它是根據(jù)每一個(gè)源字符出現(xiàn)的估算概率而建立起來(lái)的(出現(xiàn)概率高的字符使用較短的編碼,反之出現(xiàn)概率低的則使用較長(zhǎng)的編
8、碼,這便使編碼之后的字符串的平均期望長(zhǎng)度降低,從而達(dá)到無(wú)損壓縮數(shù)據(jù)的目的)。赫夫曼編碼的應(yīng)用很廣泛,利用哈夫曼樹(shù)求得的用于通信的二進(jìn)制編碼稱為哈夫曼編碼。樹(shù)中從根到每個(gè)葉子都有一條路徑,對(duì)路徑上的各分支約定:指向左子樹(shù)的分支表示“0”碼,指向右子樹(shù)的分支表示“1”碼,取每條路徑上的“0”或“1”的序列作為和各個(gè)葉子對(duì)應(yīng)的字符的編碼,這就是哈夫曼編碼。</p><p><b> 1.1 設(shè)計(jì)目的<
9、/b></p><p> (1)復(fù)習(xí)并靈活掌握二叉樹(shù)的各種儲(chǔ)存結(jié)構(gòu)和遍歷方法。</p><p> ?。?)了解靜態(tài)鏈表,并掌握其構(gòu)造方法。</p><p> (3)掌握哈夫曼樹(shù)的構(gòu)造過(guò)程和哈夫曼編碼的求解方法。</p><p> (4)復(fù)習(xí)掌握文件讀寫(xiě)的基本方法。</p><p><b> 1.
10、2 設(shè)計(jì)要求</b></p><p> ?。?)求得的哈夫曼編碼及WPL必須寫(xiě)入編碼文件。</p><p> ?。?)哈夫曼樹(shù)的存儲(chǔ)可以采用靜態(tài)鏈表或二叉鏈表。</p><p><b> 1.3設(shè)計(jì)內(nèi)容</b></p><p> 我在實(shí)驗(yàn)中采用的是靜態(tài)鏈表作為存儲(chǔ)結(jié)構(gòu),其數(shù)據(jù)類型可以定義為:</p&
11、gt;<p> #define m 2*n-1 /*m為哈夫曼樹(shù)的結(jié)點(diǎn)*/ /*具有n個(gè)葉結(jié)點(diǎn)的哈夫曼樹(shù)共有2n-1個(gè)結(jié)點(diǎn)*/</p><p> typedef struct</p><p> {int wi; /*定義權(quán)值*/</p><p> char data;
12、 /*定義葉結(jié)點(diǎn)*/</p><p> int Parent,Lchild,Rchild; /*定義父結(jié)點(diǎn)、左孩子、右孩子*/</p><p><b> }huffm;</b></p><p> huffm HT[m+1]; /*靜態(tài)鏈表HT[m+1]*/</p>&l
13、t;p> (1)從文件中讀取所有結(jié)點(diǎn)的權(quán)值,將讀取的權(quán)值放到靜態(tài)鏈表中,并初始化靜態(tài)鏈表。</p><p> ?。?)依據(jù)給定的權(quán)值,不斷生成各分支結(jié)點(diǎn),直到生成樹(shù)根結(jié)點(diǎn)為止,得到生成</p><p> 哈夫曼樹(shù)后的靜態(tài)鏈表。</p><p> ?。?)規(guī)定所有的左分支為0,右分支為1,從樹(shù)根到葉子所經(jīng)過(guò)的分支構(gòu)成的01編碼,即是對(duì)應(yīng)葉子的哈夫曼編碼。&l
14、t;/p><p> (4)求出所有葉子的哈夫曼編碼,并將編碼寫(xiě)入文件。</p><p> 2 總體設(shè)計(jì)與分析</p><p> 通常我們把數(shù)據(jù)壓縮的過(guò)程稱為編碼,解壓縮的過(guò)程稱為解碼。電報(bào)通信是傳遞文字的二進(jìn)制碼形式的字符串。構(gòu)造一棵赫夫曼樹(shù),此構(gòu)造過(guò)程稱為赫夫曼編碼。設(shè)計(jì)實(shí)現(xiàn)的功能: (1) 赫夫曼樹(shù)的建立; (2) 赫夫曼編碼的生成; (3) 編碼文件的譯碼
15、。</p><p><b> 2.1功能函數(shù)設(shè)計(jì)</b></p><p> 2.1.1建立哈夫曼樹(shù)</p><p> void HuffmTree(huffm HT[m+1]);</p><p> 我用的是手動(dòng)輸入,首先提醒用戶輸入8個(gè)葉結(jié)點(diǎn),即8個(gè)字母,輸入完畢后提醒用戶輸入8個(gè)權(quán)值。以上的兩個(gè)輸入的輸入格式都
16、用空格隔開(kāi),以回車結(jié)束。哈夫蠻樹(shù)建立成功。</p><p><b> 其基本算法是:</b></p><p> ?、儆山o定的8個(gè)權(quán)值,構(gòu)造由空二叉樹(shù)擴(kuò)充得到的擴(kuò)充二叉樹(shù),每個(gè)數(shù)只有一個(gè)外部結(jié)點(diǎn)。</p><p> ?、谠谝呀?jīng)構(gòu)造的擴(kuò)充二叉樹(shù)中,選取根結(jié)點(diǎn)權(quán)值最小和次小的兩個(gè)。將它們作為左子樹(shù)、右子樹(shù),構(gòu)造成一顆新的擴(kuò)充二叉樹(shù),它的根結(jié)點(diǎn)的權(quán)值
17、為兩子樹(shù)的權(quán)值之和。</p><p> ?、壑貜?fù)執(zhí)行步驟②,每次都使擴(kuò)充的二叉樹(shù)的個(gè)數(shù)減一,當(dāng)只剩下一棵擴(kuò)充二叉樹(shù)時(shí),它便是所要構(gòu)造的哈夫曼樹(shù)。</p><p> 2.2.2求哈夫曼編碼函數(shù)</p><p> void Huffmcode(ctype code[n+1]);</p><p> 從根結(jié)點(diǎn)開(kāi)始,尋找每一個(gè)葉結(jié)點(diǎn),在尋找過(guò)程中
18、,經(jīng)過(guò)左子樹(shù)時(shí),編碼增加“0”,經(jīng)過(guò)右子樹(shù)時(shí),編碼增加“1”,當(dāng)每一個(gè)葉結(jié)點(diǎn)都訪問(wèn)過(guò)時(shí),便得到相應(yīng)的編碼。</p><p> 2.2.3打印編碼函數(shù)</p><p> void Output (ctype code[n+1]);</p><p> 打印編碼函數(shù)即輸出編碼函數(shù)。當(dāng)用戶輸好葉結(jié)點(diǎn)和權(quán)值后,通過(guò)哈夫曼編碼函數(shù)進(jìn)行編碼,然后通過(guò)打印編碼函數(shù)將哈夫曼編碼
19、顯示在屏幕上。</p><p><b> 3 程序說(shuō)明</b></p><p><b> 3.1 結(jié)構(gòu)圖</b></p><p> 這就是整個(gè)程序的基本流程,總共分為三大塊:建立哈夫曼樹(shù)、哈夫曼編碼、輸出哈夫曼編碼。其實(shí)思想很簡(jiǎn)單,按照這個(gè)步驟來(lái)就行了。首先,用戶手動(dòng)輸入8個(gè)字母和權(quán),建立好哈夫曼樹(shù)后,左子樹(shù)為‘0’
20、,右子樹(shù)為‘1’,根據(jù)這個(gè)可以寫(xiě)出每個(gè)葉結(jié)點(diǎn)的編碼。最后輸出即可。</p><p> 這整個(gè)程序過(guò)程都是通過(guò)C語(yǔ)言實(shí)現(xiàn)的,所以都是一些很簡(jiǎn)單的語(yǔ)句,通俗易懂,這樣我修改起來(lái)也比較方便。</p><p><b> 4 程序調(diào)試</b></p><p><b> 4.1 菜單</b></p><p&g
21、t; 這只是一個(gè)很簡(jiǎn)單的菜單,在這次的實(shí)驗(yàn)中,我沒(méi)有在菜單上花很多功夫,所以這只是一個(gè)再簡(jiǎn)單不過(guò)的開(kāi)始界面,就是詢問(wèn)用戶是否要繼續(xù)玩下去。</p><p> 4.2 輸入葉結(jié)點(diǎn)和權(quán)值</p><p><b> 用戶手動(dòng)輸入</b></p><p><b> 輸入8個(gè)字母:</b></p><p&
22、gt; a s d f g h j k</p><p><b> 輸入8個(gè)權(quán)值:</b></p><p> 12 22 33 45 6 9 8 24</p><p> 4.3 輸出哈夫曼編碼</p><p> 在這個(gè)環(huán)節(jié)中,先輸出編譯好的哈夫曼編碼,接下來(lái)還要求最短路徑WPL。然后下面的那個(gè)菜單一開(kāi)始的那個(gè)菜單
23、是相同的意思,就是詢問(wèn)用戶是否要繼續(xù)玩下去,如果選擇1,則用戶再次手動(dòng)輸入葉結(jié)點(diǎn)和權(quán)值,再進(jìn)行編譯。</p><p><b> 5 設(shè)計(jì)問(wèn)題</b></p><p><b> 5.1存入文件</b></p><p> 這次課程設(shè)計(jì)輸入的葉結(jié)點(diǎn)和權(quán)值,還有最后的哈夫曼編碼都是要存入文件。剛開(kāi)始以為加進(jìn)去個(gè)文件會(huì)很簡(jiǎn)單,
24、因?yàn)槲覀兩蠈W(xué)期也做過(guò)課程設(shè)計(jì),是C語(yǔ)言的,最主要的就是弄文件,所以這個(gè)本來(lái)沒(méi)有多大問(wèn)題。但是這次加了文件后出現(xiàn)了比較麻煩的問(wèn)題。</p><p><b> 5.1.1問(wèn)題1</b></p><p> ?、贋槭裁从浭卤緯?huì)出現(xiàn)空白?</p><p> 在我加入文件后顯示出現(xiàn)了許多小問(wèn)題,具體是什么問(wèn)題我已經(jīng)記得不清,只知道最后總算是把錯(cuò)誤全找出
25、來(lái)了,調(diào)通了,本來(lái)以為沒(méi)錯(cuò)了,后來(lái)運(yùn)行的一切都很正常。等到最后都執(zhí)行完了,打開(kāi)文件發(fā)現(xiàn)文件是空白的,什么都沒(méi)有,就這個(gè)問(wèn)題我嘗試過(guò)很多遍,可記事本始終是空白的,后來(lái)我發(fā)現(xiàn)記事本的大小為1KB,就說(shuō)明里面是肯定有東西,在研究了多遍后,發(fā)現(xiàn)記事本里都是空格,所以我們是看不見(jiàn)的,但用鼠標(biāo)全選一下就會(huì)發(fā)現(xiàn)有東西。</p><p><b> 5.1.2問(wèn)題2</b></p><p
26、> ②為什么記事本中會(huì)全都是空格鍵?</p><p> 上面那個(gè)問(wèn)題算是解決了,但接下來(lái)有個(gè)更頭疼的問(wèn)題---為什么記事本中會(huì)都是空格鍵呢?怎么樣才能讓記事本中出現(xiàn)我輸入的哪些字符和數(shù)字呢?</p><p> 本來(lái)我是把保存文件單獨(dú)弄一個(gè)函數(shù)的---void save();但是由于文件出了問(wèn)題,所以我就把文件的那個(gè)函數(shù)刪掉了,把它加入到程序中。然后我發(fā)現(xiàn)把文件加入主函數(shù)中后、文
27、件夾中就會(huì)出現(xiàn)東西。但是至于為什么將文件單獨(dú)作為一個(gè)函數(shù)時(shí),文件夾中出現(xiàn)的都是空格還沒(méi)有弄清楚。</p><p><b> 6 小結(jié)</b></p><p> 在我自己課程設(shè)計(jì)中,就在編寫(xiě)好源代碼后的調(diào)試中出現(xiàn)了不少的錯(cuò)誤,遇到了很多麻煩及困難,我的調(diào)試及其中的錯(cuò)誤和我最終找出錯(cuò)誤,修改為正確的能夠執(zhí)行的程序中,通過(guò)分析,我學(xué)到了:</p><
28、p> 通過(guò)這次課程設(shè)計(jì),讓我對(duì)一個(gè)程序的數(shù)據(jù)結(jié)構(gòu)有更全面更進(jìn)一步的認(rèn)識(shí),根據(jù)不同的需求,采用不同的數(shù)據(jù)存儲(chǔ)方式,不一定要用棧,二叉樹(shù)等高級(jí)類型,有時(shí)用基本的一維數(shù)組,只要運(yùn)用得當(dāng),也能達(dá)到相同的效果,甚至更佳,就如這次的課程設(shè)計(jì),通過(guò)用for的多重循環(huán),舍棄多余的循環(huán),提高了程序的運(yùn)行效率。在編寫(xiě)這個(gè)程序的過(guò)程中,我復(fù)習(xí)了之前學(xué)的基本語(yǔ)法,哈弗曼樹(shù)最小路徑的求取,哈弗曼編碼的應(yīng)用范圍,程序結(jié)構(gòu)算法等一系列的問(wèn)題它使我對(duì)數(shù)據(jù)結(jié)構(gòu)改
29、變了看法。在這次設(shè)計(jì)過(guò)程中,體現(xiàn)出自己?jiǎn)为?dú)設(shè)計(jì)模具的能力以及綜合運(yùn)用知識(shí)的能力,體會(huì)了學(xué)以致用、突出自己勞動(dòng)成果的喜悅心情,也從中發(fā)現(xiàn)自己平時(shí)學(xué)習(xí)的不足和薄弱環(huán)節(jié),從而加以彌補(bǔ)。</p><p> 而且我還學(xué)習(xí)了很多在上課沒(méi)懂的知識(shí),并對(duì)求哈夫曼樹(shù)及哈夫曼編碼/譯碼的算法有了更加深刻的了解,更鞏固了課堂中學(xué)習(xí)有關(guān)于哈夫曼編碼的知識(shí),真正學(xué)會(huì)一種算法了。當(dāng)求解一個(gè)算法時(shí),不是拿到問(wèn)題就不加思索地做,而是首先要先對(duì)
30、它有個(gè)大概的了解,接著再詳細(xì)地分析每一步怎么做,無(wú)論自己以前是否有處理過(guò)相似的問(wèn)題,只要按照以上的步驟,必定會(huì)順利地做出來(lái)。</p><p> 一個(gè)成功的項(xiàng)目必須在寫(xiě)代碼前,先要對(duì)課題有充分的思考和規(guī)劃,否則即使完成了項(xiàng)目也會(huì)浪費(fèi)很多的時(shí)間和精力,我認(rèn)為科學(xué)合理的編程方法是我這次課程設(shè)計(jì)的最大收獲。</p><p><b> 參考文獻(xiàn)</b></p>
31、<p> [1]. 譚浩強(qiáng)著.C語(yǔ)言設(shè)計(jì)(第四版).北京:清華大學(xué)大學(xué)出版社,2010.</p><p> [2] 陳元春 王中華 張亮 王勇等著.實(shí)用數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)(第三版).北京,中國(guó)鐵道出版社,2011 </p><p> [3] 秦鋒 袁志祥著.數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版)例題詳解與課程設(shè)計(jì)指導(dǎo). 安徽:中國(guó)科學(xué)技術(shù)大學(xué)出版社,2007</p><p&g
32、t;<b> 源代碼</b></p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> #include <string.h></p><p> #define n 8 /
33、*n為定的8個(gè)數(shù)*/</p><p> #define m 2*n-1 /*m為哈夫曼樹(shù)的結(jié)點(diǎn)*/ /*具有n個(gè)葉結(jié)點(diǎn)的哈夫曼樹(shù)共有2n-1個(gè)結(jié)點(diǎn)*/</p><p> #define max 2000 /*最大值*/</p><p> typedef struct</p><p><
34、b> {</b></p><p> int wi; /*權(quán)值*/</p><p> char data;</p><p> int Parent,Lchild,Rchild;/*定義父結(jié)點(diǎn)、左孩子、右孩子*/</p><p><b> }huffm;</b>
35、</p><p> huffm HT[m+1];</p><p> typedef struct</p><p><b> {</b></p><p> char bits[n+1];</p><p> int start;</p><p><b>
36、char ch;</b></p><p><b> }ctype;</b></p><p> ctype code[n+1];</p><p> void HuffmTree(huffm HT[m+1]);</p><p> void Huffmcode(ctype code[n+1]);</p
37、><p> void Output (ctype code[n+1]);</p><p> /* 構(gòu)造HuffmTree的函數(shù)*/</p><p> void HuffmTree(huffm *HT)</p><p><b> {</b></p><p> int i,j,p1,p2;<
38、;/p><p> int s1,s2;</p><p> for(i=n+1;i<=m;i++)</p><p><b> {</b></p><p><b> p1=p2=0;</b></p><p> s1=s2=max;</p><p&g
39、t; for(j=1;j<=i-1;j++)</p><p> if(HT[j].Parent==0)</p><p> if(HT[j].wi <s1)</p><p><b> {</b></p><p><b> s2=s1;</b></p><p&g
40、t; s1=HT[j].wi;</p><p> p2=p1; p1=j;</p><p><b> }</b></p><p> else if(HT[j].wi<s2)</p><p><b> {</b></p><p> s2=HT[j].wi ;&
41、lt;/p><p><b> p2=j;</b></p><p><b> }</b></p><p> HT[p1].Parent=HT[p2].Parent=i;</p><p> HT[i].Lchild=p1;</p><p> HT[i].Rchild=p2;
42、</p><p> HT[i].wi=HT[p1].wi+HT[p2].wi;</p><p><b> }</b></p><p><b> return ;</b></p><p><b> }</b></p><p> /* 求Huffm
43、Tree編碼的函數(shù)*/</p><p> void Huffmcode(ctype code[n+1])</p><p><b> {</b></p><p> int i,p,s;</p><p><b> ctype md;</b></p><p> for(i
44、=1;i<=n;i++)</p><p><b> {</b></p><p> md.ch=code[i].ch;</p><p> md.start = n+1;</p><p><b> s=i;</b></p><p> p=HT[i].Parent;
45、</p><p> while(p!=0)</p><p><b> {</b></p><p> md.start--;</p><p> if(HT[p].Lchild==s)</p><p> md.bits[md.start]='0';</p>&l
46、t;p><b> else </b></p><p> md.bits[md.start] ='1';</p><p><b> s=p;</b></p><p> p=HT[p].Parent;</p><p><b> }</b></p
47、><p> code[i] = md;</p><p><b> }</b></p><p><b> }</b></p><p> /*打印編碼函數(shù)*/</p><p> void Output(ctype code[n+1])</p><p>
48、;<b> {</b></p><p><b> FILE *fp;</b></p><p> if ((fp=fopen("huffmancode.txt","w"))==NULL)</p><p><b> {</b></p><
49、p> printf("不能打開(kāi)文件\n");</p><p><b> exit(0);</b></p><p><b> }</b></p><p> fprintf(fp,"\n哈夫曼編碼");</p><p><b> int
50、i,j;</b></p><p> int WPL=0,count=0;</p><p> printf("\n");</p><p> printf("\n");</p><p> puts(" \t\t================================
51、========");</p><p> printf("\n");</p><p> printf("\t\t\t葉結(jié)點(diǎn)\t\t哈夫曼編碼");</p><p> for(i=1;i<=n;i++)</p><p><b> {</b></p>
52、<p> printf("\n\t\t\t %c\t\t",code[i].ch );</p><p> for(j=1;j<=n;j++)</p><p><b> {</b></p><p> if(j<code[i].start)</p><p> pri
53、ntf(" ");</p><p><b> else</b></p><p> if((code[i].bits[j]=='0')||(code[i].bits[j]=='1'))</p><p><b> {</b></p><p>
54、printf("%c",code[i].bits[j]);</p><p><b> count++;</b></p><p> fputc(code[i].bits[j],fp);</p><p><b> }</b></p><p><b> } <
55、/b></p><p> fprintf(fp,"\n");</p><p> WPL=WPL+count*HT[i].wi;</p><p><b> count=0;</b></p><p><b> }</b></p><p> pr
56、intf("\n\n");</p><p> printf("\t\t\t\tWPL=%d\n",WPL);</p><p> fprintf(fp,"\n WPL=%d",WPL);</p><p> puts(" \t\t===============================
57、========= ");</p><p> fclose(fp);</p><p><b> }</b></p><p><b> /*主函數(shù)*/</b></p><p> void main()</p><p><b> {</b>
58、;</p><p><b> FILE *fp;</b></p><p> if ((fp=fopen("huffman.txt","w"))==NULL)</p><p><b> {</b></p><p> printf("不能打開(kāi)文件
59、\n");</p><p><b> exit(0);</b></p><p><b> }</b></p><p> int i,j,w;</p><p> int flag=1;</p><p> int choice;</p><
60、p> ctype code[n+1];</p><p> char temp[n+1];</p><p> int temp2[n+1];</p><p> printf("\n");</p><p> printf(" \n\t\t 哈夫曼編碼器
61、 \n");</p><p> printf(" \n\t\t 主菜單 \n");</p><p> printf(" \n\t\t******************************************\n");</p>
62、<p> printf(" \n\t\t* Would you want to play? *\n");</p><p> printf(" \n\t\t* 1-Yes and Start *\n");</p><p> printf("
63、 \n\t\t* 0-No and Exit *\n");</p><p> printf(" \n\t\t******************************************\n");</p><p> printf(" \n\t\t請(qǐng)選擇菜單號(hào): ");<
64、;/p><p> scanf("%d",&choice);</p><p> printf("\n");</p><p> while(flag&&(choice==1))</p><p><b> {</b></p><p>
65、 choice = 0;</p><p> for(i=1;i<=m;i++)//初始化</p><p><b> { </b></p><p> HT[i].data =NULL;</p><p> HT[i].wi=0;</p><p> HT[i].Parent = 0;&l
66、t;/p><p> HT[i].Lchild = HT[i].Rchild = 0;</p><p><b> }</b></p><p> for(i=1;i<=n;i++)</p><p><b> {</b></p><p> code[i].start =
67、 0;</p><p> code[i].ch = NULL;</p><p> for(j=1;j<=n;j++)</p><p> code[i].bits[j] = NULL;</p><p><b> }</b></p><p> printf(" \t\tP
68、lease input %d char(用空格隔開(kāi),以回車結(jié)束): \n",n);/*輸入字母*/</p><p> printf(" \t\t");</p><p> getchar();</p><p> scanf("%c %c %c %c %c %c %c %c",&temp[1],&
69、;temp[2],&temp[3],&temp[4],&temp[5],&temp[6],&temp[7],&temp[8]);</p><p> fprintf(fp,"字符");</p><p> for(i=1;i<=n;i++)</p><p><b> {</b
70、></p><p> code[i].ch =temp[i];</p><p> HT[i].data =temp[i];</p><p> fputc(temp[i],fp);</p><p><b> }</b></p><p> printf("\n\n"
71、);</p><p> printf(" \t\tPlease input %d rate(用空格隔開(kāi),以回車結(jié)束): \n",n);/*輸入權(quán)值*/</p><p> fprintf(fp,"\n權(quán)值");</p><p> printf(" \t\t");</p><p
72、> getchar();</p><p> scanf("%d %d %d %d %d %d %d %d",&temp2[1],&temp2[2],&temp2[3],&temp2[4],&temp2[5],&temp2[6],&temp2[7],&temp2[8]);</p><p> fpr
73、intf(fp,"%d %d %d %d %d %d %d %d",temp2[1],temp2[2],temp2[3],temp2[4],temp2[5],temp2[6],temp2[7],temp2[8]);</p><p> printf("\n");</p><p> puts(" \t\t================
74、=====================");</p><p> printf(" \t\t\t 字符 權(quán)值\n");</p><p> for(i=1;i<n+1;i++)</p><p> printf(" \t\t\t %c %4d \n",temp[i],temp2[i]
75、);</p><p> puts(" \t\t======================================");</p><p> for(i=1;i<=n;i++)</p><p><b> {</b></p><p> w= temp2[i];</p>
76、<p> HT[i].wi = w;</p><p><b> }</b></p><p> HuffmTree(HT);</p><p> Huffmcode(code);</p><p> Output(code);</p><p> printf("\n&
77、quot;);</p><p> printf("\n");</p><p> printf(" \n\t\t********************************************\n");</p><p> printf(" \n\t\t Continue
78、? \n");</p><p> printf(" \n\t\t* 1--Contine *\n");</p><p> printf(" \n\t\t* 0--Exit *\
79、n");</p><p> printf(" \n\t\t********************************************\n");</p><p> printf(" \n\t\t請(qǐng)選擇菜單號(hào): ");</p><p> scanf("%d",&ch
80、oice);</p><p> if(choice!=1)</p><p><b> break;</b></p><p><b> }</b></p><p> getchar();</p><p><b> return;</b></
溫馨提示
- 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ù)據(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ù)據(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ù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--哈夫曼編碼和譯碼報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告----哈夫曼
- 哈夫曼樹(shù)_數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 哈夫曼樹(shù)_數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告——哈夫曼編譯器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--哈夫曼編碼問(wèn)題的設(shè)計(jì)和實(shí)現(xiàn)
評(píng)論
0/150
提交評(píng)論