數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)赫夫曼編譯碼器(C++)_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)赫夫曼編譯碼器(C++)_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)赫夫曼編譯碼器(C++)_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)赫夫曼編譯碼器(C++)_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)赫夫曼編譯碼器(C++)_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、赫夫曼編譯碼器摘要 本次課程設(shè)計(jì)過(guò)程中我主要根據(jù)課本中的實(shí)現(xiàn)思想及算法編寫(xiě)程序,體現(xiàn)以課本知識(shí)的應(yīng)用為主,在學(xué)習(xí)了線性表、棧、隊(duì)列、二叉樹(shù)、樹(shù)和圖等結(jié)構(gòu)的基礎(chǔ)上,以能夠更加熟練的應(yīng)用所學(xué)知識(shí),并能結(jié)合一些著名算法來(lái)實(shí)現(xiàn)對(duì)一些實(shí)際問(wèn)題的應(yīng)用,例如,赫夫曼樹(shù)等,從而更為深刻理解數(shù)據(jù)結(jié)構(gòu)的內(nèi)涵,熟悉它們各自的應(yīng)用場(chǎng)合及方法。有些在平時(shí)課程中并沒(méi)有掌握的內(nèi)容在這次課程設(shè)計(jì)中都是先通過(guò)看課本學(xué)懂了,然后再在課程設(shè)計(jì)中加深印象,實(shí)現(xiàn)算法的應(yīng)用和擴(kuò)展。這次課程設(shè)計(jì)的設(shè)計(jì)內(nèi)容主要是通過(guò)實(shí)際的例子和程序來(lái)實(shí)現(xiàn)課本中所學(xué)習(xí)的算法的應(yīng)用。程序設(shè)計(jì)設(shè)計(jì)語(yǔ)言采用c+,程序運(yùn)行平臺(tái)為windows xp。赫夫曼編譯碼器的

2、主要功能是先建立赫夫曼樹(shù),然后利用建好的赫夫曼樹(shù)生成哈夫曼編碼后進(jìn)行譯碼 。赫夫曼編譯系統(tǒng)分為五個(gè)功能模塊:原始數(shù)據(jù)載入,打印編碼規(guī)則、編碼、譯碼。以二叉樹(shù)的應(yīng)用為基礎(chǔ),包括統(tǒng)計(jì)信息,并通過(guò)構(gòu)建赫夫曼樹(shù)、對(duì)信息進(jìn)行赫夫曼編碼,將編碼信息等存入文檔。關(guān)鍵字 數(shù)據(jù)結(jié)構(gòu) 棧和隊(duì)列 赫夫曼樹(shù) 赫夫曼編碼 目錄1引言.11.1課程設(shè)計(jì)目的.1 1.2課程設(shè)計(jì)背景.11.3課程設(shè)計(jì)主要內(nèi)容.12需求分析.33 概要設(shè)計(jì).43.1 設(shè)計(jì)思想43.2 函數(shù)間的關(guān)系43.3數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計(jì)44詳細(xì)設(shè)計(jì).6 4.1 赫夫曼的主要結(jié)構(gòu).65 調(diào)試分析.86 測(cè)試并列出測(cè)試結(jié)果.9 6.1 測(cè)試方式 9 6.2 測(cè)

3、試結(jié)果.97 總結(jié)13致謝.14參考文獻(xiàn).14附錄.151 引言當(dāng)今社會(huì),計(jì)算機(jī)技術(shù)和通信技術(shù)已不斷發(fā)展,處理和傳輸?shù)臄?shù)據(jù)量越來(lái)越龐大。如何采用有效的數(shù)據(jù)壓縮技術(shù)引起了人們的極大重視。從而產(chǎn)生了哈夫曼編碼,它是一種應(yīng)用廣泛且非常有效的數(shù)據(jù)壓縮技術(shù),該技術(shù)一般可將數(shù)據(jù)壓縮20%至90%,通常我們將壓縮技術(shù)稱為編碼,解壓縮過(guò)程稱為解碼。樹(shù)狀結(jié)構(gòu)簡(jiǎn)稱為樹(shù),是一種以分支關(guān)系進(jìn)行定義的層次結(jié)構(gòu),是十分重要的非線性數(shù)據(jù)結(jié)構(gòu),在計(jì)算機(jī)軟件設(shè)計(jì)方面,有著廣泛的應(yīng)用。1.1 課程設(shè)計(jì)目的 本課程設(shè)計(jì)是為了讓同學(xué)們了解數(shù)據(jù)結(jié)構(gòu)的作用和意義。數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)、計(jì)算機(jī)信息管理與應(yīng)用專業(yè)和電子商務(wù)的專業(yè)的

4、基礎(chǔ)課,是十分重要的課程。所有的計(jì)算機(jī)系統(tǒng)軟件和應(yīng)用軟件都要用到各種類型的數(shù)據(jù)結(jié)構(gòu)。因此,想要更好地運(yùn)用計(jì)算機(jī)來(lái)解決實(shí)際問(wèn)題,僅掌握幾種計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言是難以應(yīng)付當(dāng)前眾多復(fù)雜的課題,想要有效地使用計(jì)算機(jī),充分發(fā)揮它的性能,還必須學(xué)習(xí)和掌握好數(shù)據(jù)結(jié)構(gòu)的有關(guān)知識(shí),打好數(shù)據(jù)結(jié)構(gòu)這門(mén)課的扎實(shí)基礎(chǔ),對(duì)于學(xué)習(xí)計(jì)算機(jī)專業(yè)的其他課程,如操作系統(tǒng)、軟件工程、編譯原理、人工智能等十分有益。1.2 課程設(shè)計(jì)背景當(dāng)今社會(huì),計(jì)算機(jī)技術(shù)和通信技術(shù)已不斷發(fā)展,處理和傳輸?shù)臄?shù)據(jù)量越來(lái)越龐大。如何采用有效的數(shù)據(jù)壓縮技術(shù)引起了人們的極大重視。從而產(chǎn)生了哈夫曼編碼,它是一種應(yīng)用廣泛且非常有效的數(shù)據(jù)壓縮技術(shù),該技術(shù)一般可將數(shù)據(jù)壓縮

5、20%至90%,通常我們將壓縮技術(shù)稱為編碼,解壓縮過(guò)程稱為解碼。樹(shù)狀結(jié)構(gòu)簡(jiǎn)稱為樹(shù),是一種以分支關(guān)系進(jìn)行定義的層次結(jié)構(gòu),是十分重要的非線性數(shù)據(jù)結(jié)構(gòu),在計(jì)算機(jī)軟件設(shè)計(jì)方面,有著廣泛的應(yīng)用。在這信息量發(fā)達(dá)的時(shí)代,隨著社會(huì)的進(jìn)步,信息不斷地增多和更新,為了使信息更加快速、準(zhǔn)確有的傳遞。需要一個(gè)程序來(lái)完成。 1.3課程設(shè)計(jì)主要內(nèi)容本課程設(shè)計(jì)要求完成發(fā)送端對(duì)待傳送數(shù)據(jù)的編碼和接收端對(duì)傳送來(lái)的數(shù)據(jù)的譯碼。要實(shí)現(xiàn)五個(gè)功能:接受原始數(shù)據(jù)、編碼、譯碼、打印編碼規(guī)則、將編碼、譯碼存檔。通過(guò)系統(tǒng)的提示要建立哈夫曼樹(shù)并對(duì)載入的原文件進(jìn)行編碼,并保存到txtfile.txt文件中,同時(shí)輸出到屏幕。最后將建立的赫夫曼樹(shù)用某

6、種樹(shù)的儲(chǔ)存方式儲(chǔ)存后輸出。2 需求分析一套完整的編碼譯碼系統(tǒng)應(yīng)該具有以下功能:(1)i:初始化(initialization)。從終端讀入字符集大小n,以及n個(gè)字符和n個(gè)權(quán)值,建立赫夫曼樹(shù)。并將他存于文件hfmtree.txt中。(2)e:編碼(encoding)。利用已經(jīng)建立好的赫夫曼樹(shù)(如不在內(nèi)存,則從文件hfmtree.txt中讀入),對(duì)文件tobetree.txt中的正文進(jìn)行編碼。然后將結(jié)果存入文件codefile.txt文件中。(3)d:譯碼(decoding)。利用已經(jīng)建立好的赫夫曼樹(shù)將文件codefile.txt中的代碼進(jìn)行譯碼,將結(jié)果存入文件textfile.txt中。(4)p

7、:印代碼文件(print)。將文件codefile.txt以緊湊格式顯示在終端上。每行50個(gè)代碼。同時(shí)將字符形式的編碼文件寫(xiě)入到文件codeprin.txt中。(5)t:印赫夫曼樹(shù)(treeprint)。將已在內(nèi)存中的赫夫曼樹(shù)以直觀的方式(樹(shù)或凹入表形式)顯示在終端上,同時(shí)將此字符形式的赫夫曼樹(shù)寫(xiě)入文件treeprin.txt中。3 概要設(shè)計(jì)3.1 設(shè)計(jì)思想赫夫曼樹(shù)用鄰接矩陣作為存儲(chǔ)結(jié)構(gòu),借助靜態(tài)鏈表來(lái)實(shí)現(xiàn)遍歷。3.2 函數(shù)間的關(guān)系 函數(shù)間的關(guān)系如圖3.1所示:主函數(shù)顯示表頭初始化樹(shù)輸入字符編碼譯碼打印編碼打印赫夫曼樹(shù)選最小兩個(gè)權(quán)值select()圖3.1 函數(shù)間的關(guān)系3.3 數(shù)據(jù)結(jié)構(gòu)與算法設(shè)

8、計(jì)赫夫曼編譯碼器的主要功能是先建立赫夫曼樹(shù),然后利用建好的赫夫曼樹(shù)生成赫夫曼編碼后進(jìn)行譯碼 。在數(shù)據(jù)通信中,經(jīng)常需要將傳送的文字轉(zhuǎn)換成由二進(jìn)制字符0、1組成的二進(jìn)制串,稱之為編碼。構(gòu)造一棵赫夫曼樹(shù),規(guī)定赫夫曼樹(shù)中的左分之代表0,右分支代表1,則從根節(jié)點(diǎn)到每個(gè)葉子節(jié)點(diǎn)所經(jīng)過(guò)的路徑分支組成的0和1的序列便為該節(jié)點(diǎn)對(duì)應(yīng)字符的編碼,稱之為赫夫曼編碼。最簡(jiǎn)單的二進(jìn)制編碼方式是等長(zhǎng)編碼。若采用不等長(zhǎng)編碼,讓出現(xiàn)頻率高的字符具有較短的編碼,讓出現(xiàn)頻率低的字符具有較長(zhǎng)的編碼,這樣可能縮短傳送電文的總長(zhǎng)度。赫夫曼樹(shù)課用于構(gòu)造使電文的編碼總長(zhǎng)最短的編碼方案。其主要流程圖如圖3.2所示。開(kāi)始結(jié)點(diǎn)數(shù)是否大于1將dat

9、a和權(quán)值賦給ht輸出根結(jié)點(diǎn)和權(quán)值調(diào)用select函數(shù)計(jì)算根結(jié)點(diǎn)函數(shù)父結(jié)點(diǎn)為兩子結(jié)點(diǎn)之和輸出兩子結(jié)點(diǎn)和已構(gòu)造的結(jié)點(diǎn)是否為根結(jié)點(diǎn)?左子是否為空?此時(shí)編碼為0i2*n?i+編碼為1結(jié)束否否否右子是否為空是是否否是是是圖3.2 赫夫曼樹(shù)編譯碼器流程圖4 詳細(xì)設(shè)計(jì)赫夫曼樹(shù)編、譯碼設(shè)計(jì)功能如下:1赫夫曼樹(shù)抽象數(shù)據(jù)類型定義adt huffmancoding數(shù)據(jù)對(duì)象t:具有相同特性的數(shù)據(jù)元素的集合數(shù)據(jù)關(guān)系r:滿足最優(yōu)二叉樹(shù)的關(guān)系基本操作p:init(&t)操作結(jié)果:構(gòu)造一個(gè)空赫夫曼樹(shù)t。encode()操作結(jié)果:利用赫夫曼樹(shù)進(jìn)行編碼decode()操作結(jié)果:利用赫夫曼樹(shù)進(jìn)行譯碼2. 主函數(shù)void mian(

10、)打印表頭;while(選擇項(xiàng)不為q)輸入選擇項(xiàng);switch(選擇項(xiàng))case i: 初始化;break;case w: 輸入要編碼的字符; break;case e: 編碼字符; break;case d; 譯碼操作;break;case p; 打印代碼;break;case t; 打印赫夫曼樹(shù); break;default:輸入錯(cuò)誤,重新選擇;3. 求赫夫曼編碼5 if(tj.weightk&tj.parent=0) k=tj.weight,flag=j; /flag為標(biāo)志符,為不小于可能的值tflag.parent=1; 4. 建赫夫曼樹(shù) hts1.parent=hts2.parent

11、=i;/將選好的兩個(gè)結(jié)點(diǎn)設(shè)置成有同一個(gè)雙親結(jié)點(diǎn) hti.lchild=s1;/左孩子的權(quán)值 hti.rchild=s2;/右孩子的權(quán)值 hti.weight=hts1.weight+hts2.weight;/將兩個(gè)權(quán)值相加作為新的權(quán)值 hc=(huffmancode)malloc(n+1)*sizeof(char*);/為赫夫曼代碼分配空間 5. 將赫夫曼編碼寫(xiě)入文件用fputs(hci,htmtree); fputs(r,htmtree);fclose(htmtree) 這些函數(shù)來(lái)實(shí)現(xiàn)編碼寫(xiě)入文件; 6. 完成譯碼功能并將譯碼寫(xiě)入文件 因?yàn)楹辗蚵鼧?shù)建好后是左孩子結(jié)點(diǎn)旁標(biāo)上0,右孩子結(jié)點(diǎn)上標(biāo)上

12、1所以碰到1是用左孩子結(jié)點(diǎn),2是用右孩子結(jié)點(diǎn),可以用條件語(yǔ)句來(lái)實(shí)現(xiàn)。 if(i2=0) m=htm.lchild; if(i2=1) m=htm.rchild;fputs(outext,txtfile);/將譯碼寫(xiě)入文件5 調(diào)試分析1本程序要執(zhí)行首先要初始化一個(gè)赫夫曼樹(shù),按照用戶設(shè)定的字符集大小,輸入每個(gè)字符及其對(duì)應(yīng)的出現(xiàn)概率即權(quán)值。分別存放在w和z這兩個(gè)變量中。再利用這兩個(gè)變量構(gòu)造赫夫曼樹(shù)。2執(zhí)行輸入字符命令時(shí),程序?qū)⒂脩糨斎氲淖址嫒胛募obetran.txt中。以便執(zhí)行下一步編碼操作時(shí)自己從文件調(diào)用。3編碼時(shí),程序直接從tobetran.txt中讀取字符,依次和字符數(shù)組變量z中元素項(xiàng)比

13、較,找到之后,將編碼表hc中對(duì)應(yīng)編號(hào)的代碼添加到分配的工作區(qū)間中,全部字符編碼完成后將代碼寫(xiě)入文件codefile.txt中。4譯碼時(shí),程序從codefile中讀取代碼,按照代碼從樹(shù)根開(kāi)始向葉子節(jié)點(diǎn)查找對(duì)應(yīng)的字符,直到全部代碼譯碼完成,再將譯好的字符寫(xiě)入文件txtfile.txt中5打印編碼操作,即從codefile.txt中讀取代碼,按要求輸出到屏幕上。6 測(cè)試并列出測(cè)試結(jié)果6.1 測(cè)試方式 1程序運(yùn)行環(huán)境為dos,執(zhí)行文件為:胡江英的程序設(shè)計(jì).exe2程序運(yùn)行后,出現(xiàn)的界面如圖6.1所示:圖6.1 界面圖3首先須進(jìn)行初始化,按“i”執(zhí)行,輸入字符集數(shù),對(duì)應(yīng)的字符和權(quán)值,初始化赫夫曼樹(shù)。然后

14、才能進(jìn)行后續(xù)的操作。4選擇“w”,輸入要編碼的字符。5選擇“e”,對(duì)剛輸入的字符進(jìn)行編碼。6選擇“d”,對(duì)剛編碼出的代碼再譯碼回去。7選擇“p”,打印編碼出的代碼。8選擇“t”,代印赫夫曼樹(shù)9選擇“q”,退出程序。6.2 測(cè)試結(jié)果1.初始化的內(nèi)容如表6.1所示:表6.1 初始化的內(nèi)容“”abcdefghijklmn1866413223210321154757153220nopqrstuvwxyz5763151485802381811612.初始化的結(jié)果如圖6.2所示:圖6.2 初始化的結(jié)果3.將字符對(duì)應(yīng)編碼寫(xiě)入htmtree.txt,如圖6.3所示:圖6.3 將字符寫(xiě)入文件4.字符對(duì)應(yīng)的編碼如

15、圖6.4所示:圖6.4 字符對(duì)應(yīng)的編碼5.輸入要編碼的字符如圖6.5所示:圖6.5 要編碼的字符6.譯碼:文件textfile.txt中內(nèi)容:this program is my favorit其操作如圖6.6所示:圖6.6 譯碼操作7.打印赫夫曼樹(shù)如圖6.7所示:圖6.7 赫夫曼樹(shù)7 總 結(jié)通過(guò)將近兩周的課設(shè)練習(xí),認(rèn)識(shí)到知識(shí)的遷移運(yùn)用,理論應(yīng)用實(shí)際和相互間的密切聯(lián)系,感受到理論知識(shí)的重要,在今后的學(xué)習(xí)中一定會(huì)更加努力,認(rèn)真。體會(huì)到自己知識(shí)有所缺乏,和個(gè)人能力的有限,只有通過(guò)同學(xué)、老師間的密切配合才能完成一項(xiàng)不錯(cuò)的工作。從中也體會(huì)到了學(xué)習(xí)中的樂(lè)趣,可以自由的創(chuàng)作自己喜歡的東西并自己調(diào)試。致 謝

16、在課程設(shè)計(jì)過(guò)程中遇到了很多問(wèn)題,不過(guò)在陳倩詒老師和和同學(xué)們的幫助下大部分都得以解決,首先要對(duì)他們表示感謝。同時(shí),我們也要感謝學(xué)校為我們提供了大量的圖書(shū),通過(guò)看書(shū)我們也學(xué)到了很多課堂上學(xué)不到的東西。通過(guò)此次課程設(shè)計(jì)我最大的收獲是學(xué)會(huì)了自主學(xué)習(xí),也增加了與老師和同學(xué)們的交往、增進(jìn)了相互之間的感情。參考文獻(xiàn)1嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu):c語(yǔ)言版. 北京:清華大學(xué)出版社,19972王昆侖,李紅.數(shù)據(jù)結(jié)構(gòu)與算法.北京:中國(guó)鐵道出版社 3周靄如,林偉健.c+程序設(shè)計(jì)基礎(chǔ). 北京:電子工業(yè)出版社, 20054耿國(guó)華.數(shù)據(jù)結(jié)構(gòu). 北京:高等教育出版社, 20055 王衛(wèi)東. 數(shù)據(jù)結(jié)構(gòu)輔導(dǎo)課. 西安: 電子科技大

17、學(xué)出版社, 2001年6 趙文靜. 數(shù)據(jù)結(jié)構(gòu)輔導(dǎo). 西安:交通大學(xué)出版社, 1999年附錄:#include #include #include #include #include /typedef int telemtype;const int uint_max=1000;typedef struct int weight; /權(quán)值 int parent,lchild,rchild; /父節(jié)點(diǎn),左孩子結(jié)點(diǎn),右孩子結(jié)點(diǎn)htnode,* huffmantree;typedef char *huffmancode;/-全局變量-huffmantree ht; /代表赫夫曼樹(shù)huffmancode

18、hc; /代表赫夫曼編碼int *w,i,j,n;char *z;int flag=0;int numb=0;/ -求赫夫曼編碼-void line()coutn-n;int min(huffmantree t,int i) int j,flag; int k=uint_max; / 取k為不小于可能的值 for(j=1;j=i;j+) if(tj.weights2)/ s1為最小的兩個(gè)值中序號(hào)小的那個(gè) j=s1; s1=s2; s2=j; void huffmancoding(huffmantree &ht,huffmancode &hc,int *w,int n) int m,i,s1,s

19、2,start; int c,f; huffmantree p; char *cd; if(n=1) return; m=2*n-1; ht=(huffmantree)malloc(m+1)*sizeof(htnode); / 0號(hào)單元未用 for(p=ht+1,i=1;iweight=*w; p-parent=0; p-lchild=0; p-rchild=0; for(;iparent=0; for(i=n+1;i=m;+i) / 建赫夫曼樹(shù) select(ht,i-1,s1,s2); hts1.parent=hts2.parent=i; hti.lchild=s1; hti.rchild

20、=s2; hti.weight=hts1.weight+hts2.weight; hc=(huffmancode)malloc(n+1)*sizeof(char*); cd=(char*)malloc(n*sizeof(char); cdn-1=0; for(i=1;i=n;i+) start=n-1; for(c=i,f=hti.parent;f!=0;c=f,f=htf.parent) / 從葉子到根逆向求編碼 if(htf.lchild=c) cd-start=0; else cd-start=1; hci=(char*)malloc(n-start)*sizeof(char); str

21、cpy(hci,&cdstart); free(cd);/-初始化赫夫曼鏈表-void init() /- flag=1; int num; int num2; cout下面初始化赫夫曼鏈表endlnum; n=num;line(); w=(int*)malloc(n*sizeof(int);/weight z=(char*)malloc(n*sizeof(char);/word coutn請(qǐng)依次輸入n個(gè)字符(字符型)n注意:必須以回車(chē)結(jié)束:endl; char temp2; line();for(i=0;in;i+) cout第i+1個(gè)字符:endl; gets(temp); *(z+i)=

22、*temp; line();for(i=0;i=n-1;i+) coutsetw(6)*(z+i); line();coutn請(qǐng)依次輸入n個(gè)權(quán)值(n注意:必須以回車(chē)結(jié)束):endl; line();for(i=0;i=n-1;i+) coutendl第i+1num2; *(w+i)=num2;/輸入部分結(jié)束- huffmancoding(ht,hc,w,n); /-打印編碼- line();cout字符對(duì)應(yīng)的編碼為:endl; for(i=1;i=n;i+) /cout字符*(z+i-1)的編碼; puts(hci); /-將赫夫曼編碼寫(xiě)入文件- line();cout下面將赫夫曼編碼寫(xiě)入文件

23、endl.endl; file *htmtree; char r= ,0; if(htmtree=fopen(htmtree.txt,w)=null)cout文件打開(kāi)失敗endl;return; fputs(z,htmtree); for(i=0;in+1;i+) fprintf(htmtree,%6d,*(w+i); fputs(r,htmtree); for(i=1;i=n;i+) fputs(hci,htmtree); fputs(r,htmtree); fclose(htmtree); cout已將字符與對(duì)應(yīng)編碼寫(xiě)入根目錄下文件htmtree.txt中endlendl;/init/-獲

24、取字符并寫(xiě)入文件-void inputcode() /cout請(qǐng)輸入你想要編碼的字符endl; file *virttran,*tobetran; char str100; if(tobetran=fopen(tobetran.txt,w)=null) cout不能打開(kāi)文件endl; return; cout請(qǐng)輸入你想要編碼的字符endl; gets(str); fputs(str,tobetran); cout獲取字符成功endl; fclose(tobetran);/-void encode() /完成譯碼功能 cout下面對(duì)目錄下文件tobetran.txt中的字符進(jìn)行編碼endl; f

25、ile *tobetran,*codefile; if(tobetran=fopen(tobetran.txt,rb)=null) cout不能打開(kāi)文件endl; if(codefile=fopen(codefile.txt,wb)=null) cout不能打開(kāi)文件endl; char *tran; i=99; tran=(char*)malloc(100*sizeof(char); /為tuan分配100個(gè)字節(jié) while(i=99) if(fgets(tran,100,tobetran)=null) cout不能打開(kāi)文件endl; break; for(i=0;*(tran+i)!=0;i

26、+) for(j=0;jn) cout字符錯(cuò)誤,無(wú)法編碼!endl; break; cout編碼工作完成endl編碼寫(xiě)入目錄下的codefile.txt中endlendl; fclose(tobetran); fclose(codefile); free(tran);/-void decode() /完成譯碼功能 cout下面對(duì)根目錄下文件codefile.txt中的字符進(jìn)行譯碼endl; file *codef,*txtfile; if(txtfile=fopen(textfile.txt,w)=null) cout不能打開(kāi)文件endl; if (codef=fopen(codefile.t

27、xt,r)=null) cout不能打開(kāi)文件endl; char *tbdc,*outext,i2; int io=0,i,m; unsigned long length=10000; tbdc=(char*)malloc(length*sizeof(char); /分配空間 fgets(tbdc,length,codef); outext=(char*)malloc(length*sizeof(char); /分配空間 m=2*n-1; for(i=0;*(tbdc+i)!=0;i+) /進(jìn)入循環(huán) i2=*(tbdc+i); if(htm.lchild=0) *(outext+io)=*(z

28、+m-1); io+; m=2*n-1; i-; else if(i2=0) m=htm.lchild; else if(i2=1) m=htm.rchild; *(outext+io)=0; fputs(outext,txtfile); cout譯碼完成endl內(nèi)容寫(xiě)入根目錄下的文件txtfile.txt中endlendl; free(tbdc); free(outext); fclose(txtfile); fclose(codef);/-void printcode() /打印代碼 cout下面打印根目錄下文件codeprin.txt中編碼字符endl-n; file * codepri

29、n,* codefile; if(codeprin=fopen(codeprin.txt,w)=null) cout不能打開(kāi)文件endl; return; if(codefile=fopen(codefile.txt,r)=null) cout不能打開(kāi)文件endl; return; char *work3; work3=(char*)malloc(51*sizeof(char); do if(fgets(work3,51,codefile)=null) cout不能讀取文件endl; break; fputs(work3,codeprin); puts(work3); while(strlen(work3)=50); free(work3); line();cout打印工作結(jié)束endlendl; fclose(codeprin); fclose(codefile);/-打印赫夫曼樹(shù)的函數(shù)-void coprint(huffmantree start,huffmantree ht)char t= ; if(start!=ht) file * t

溫馨提示

  • 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ù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論