




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、裝訂線長(zhǎng) 春 大 學(xué) 課程設(shè)計(jì)紙目 錄目 錄11 課程設(shè)計(jì)的目的和意義22 需求分析33 系統(tǒng)設(shè)計(jì)4(1)設(shè)計(jì)思路及方案4(2)模塊的設(shè)計(jì)及介紹4(3)主要模塊程序流程圖64 系統(tǒng)實(shí)現(xiàn)10(1)主調(diào)函數(shù)10(2)建立HuffmanTree10(3)生成Huffman編碼并寫入文件13(4)電文譯碼145 系統(tǒng)調(diào)試16小 結(jié)18參考文獻(xiàn)19附錄 源程序201 課程設(shè)計(jì)的目的和意義在當(dāng)今信息爆炸時(shí)代,如何采用有效的數(shù)據(jù)壓縮技術(shù)來節(jié)省數(shù)據(jù)文件的存儲(chǔ)空間和計(jì)算機(jī)網(wǎng)絡(luò)的傳送時(shí)間已越來越引起人們的重視。哈夫曼編碼正是一種應(yīng)用廣泛且非常有效的數(shù)據(jù)壓縮技術(shù)。哈夫曼編碼的應(yīng)用很廣泛,利用哈夫曼樹求得的用于通信的
2、二進(jìn)制編碼稱為哈夫曼編碼。樹中從根到每個(gè)葉子都有一條路徑,對(duì)路徑上的各分支約定:指向左子樹的分支表示“0”碼,指向右子樹的分支表示“1”碼,取每條路徑上的“0”或“1”的序列作為和各個(gè)對(duì)應(yīng)的字符的編碼,這就是哈夫曼編碼。通常我們把數(shù)據(jù)壓縮的過程稱為編碼,解壓縮的過程稱為解碼。電報(bào)通信是傳遞文字的二進(jìn)制碼形式的字符串。但在信息傳遞時(shí),總希望總長(zhǎng)度盡可能最短,即采用最短碼。作為軟件工程專業(yè)的學(xué)生,我們應(yīng)該很好的掌握這門技術(shù)。在課堂上,我們能過學(xué)到許多的理論知識(shí),但我們很少有過自己動(dòng)手實(shí)踐的機(jī)會(huì)!課程設(shè)計(jì)就是為解決這個(gè)問題提供了一個(gè)平臺(tái)。在課程設(shè)計(jì)過程中,我們每個(gè)人選擇一個(gè)課題,認(rèn)真研究,根據(jù)課堂講
3、授內(nèi)容,借助書本,自己動(dòng)手實(shí)踐。這樣不但有助于我們消化課堂所講解的內(nèi)容,還可以增強(qiáng)我們的獨(dú)立思考能力和動(dòng)手能力;通過編寫實(shí)驗(yàn)代碼和調(diào)試運(yùn)行,我們可以逐步積累調(diào)試C程序的經(jīng)驗(yàn)并逐漸培養(yǎng)我們的編程能力、用計(jì)算機(jī)解決實(shí)際問題的能力。在課程設(shè)計(jì)過程中,我們不但有自己的獨(dú)立思考,還借助各種參考文獻(xiàn)來幫助我們完成系統(tǒng)。更為重要的是,我們同學(xué)之間加強(qiáng)了交流,在對(duì)問題的認(rèn)識(shí)方面可以交換不同的意見。同時(shí),師生之間的互動(dòng)也隨之改善,我們可以通過具體的實(shí)例來從老師那學(xué)到更多的實(shí)用的知識(shí)。數(shù)據(jù)結(jié)構(gòu)課程具有比較強(qiáng)的理論性,同時(shí)也具有較強(qiáng)的可應(yīng)用性和實(shí)踐性。課程設(shè)計(jì)是一個(gè)重要的教學(xué)環(huán)節(jié)。我們?cè)谝话闱闆r下都能夠重視實(shí)驗(yàn)環(huán)節(jié)
4、,但是容易忽略實(shí)驗(yàn)的總結(jié),忽略實(shí)驗(yàn)報(bào)告的撰寫。通過這次實(shí)驗(yàn)讓我們明白:作為一名大學(xué)生必須嚴(yán)格訓(xùn)練分析總結(jié)能力、書面表達(dá)能力。需要逐步培養(yǎng)書寫科學(xué)實(shí)驗(yàn)報(bào)告以及科技論文的能力。只有這樣,我們的綜合素質(zhì)才會(huì)有好的提高。2 需求分析題 目:哈夫曼編碼/譯碼器問題描述:利用哈夫曼編碼進(jìn)行信息通信可以大大提高信道利用率,縮短信息傳輸時(shí)間,降低傳輸成本。但是這要求在發(fā)送端通過一個(gè)編碼系統(tǒng)對(duì)待傳數(shù)據(jù)預(yù)先編碼;在接收端將傳來的數(shù)據(jù)進(jìn)行譯碼(復(fù)原)。對(duì)于雙工信道(即可以雙向傳輸信息的信道),每端都需要一個(gè)完整的編/譯碼系統(tǒng)。試為這樣的信息收發(fā)站寫一個(gè)哈夫曼碼的編譯碼系統(tǒng)。具體要求:1) 初始化:鍵盤輸入字符集大小
5、n及n個(gè)字符和m個(gè)權(quán)值,建立哈夫曼樹,并將它存于文件hfmtree中。 2) 編碼:利用建好的哈夫曼樹,對(duì)文件tobetrans中的正文進(jìn)行編碼,然后將結(jié)果存入文件codefile中。3) 解碼:利用建好的哈夫曼樹將文件codefile中的代碼進(jìn)行譯碼,結(jié)果存入文件textfile中。4) 打印代碼文件:將文件codefile以緊湊格式顯示在終端上,每行50個(gè)代碼。同時(shí)將此字符形式的編碼文件寫入文件codeprint中。5) 打印哈夫曼樹:將已在內(nèi)存中的哈夫曼樹以直觀的方式(樹或凹入表形式)顯示在終端上,同時(shí)將此字符形式的哈夫曼樹寫入文件treeprint中。6) 設(shè)字符集及頻度如下表:字符空
6、格ABCDEFGHIJKLM頻度1866423223210321154757153220字符NOPQRSTUVWXYZ頻度205619250515530101122123 系統(tǒng)設(shè)計(jì)(1)設(shè)計(jì)思路及方案本課題是用最優(yōu)二叉樹即哈夫曼樹來實(shí)現(xiàn)哈夫曼編碼譯碼器的功能。假設(shè)每種字符在電文中出現(xiàn)的次數(shù)為Wi,編碼長(zhǎng)度為L(zhǎng)i,電文中有n種字符,則電文編碼總長(zhǎng)度為(W1*L1)+(W2*L2)+(Wi*Li)。若將此對(duì)應(yīng)到二叉樹上,Wi為葉結(jié)點(diǎn),Li為根結(jié)點(diǎn)到葉結(jié)點(diǎn)的路徑長(zhǎng)度。那么,(W1*L1)+(W2*L2)+(Wi*Li)恰好為二叉樹上帶權(quán)路徑長(zhǎng)度。因此,設(shè)計(jì)電文總長(zhǎng)最短的二進(jìn)制前綴編碼,就是以n種字符
7、出現(xiàn)的頻率作權(quán),構(gòu)造一棵哈夫曼樹,此構(gòu)造過程稱為哈夫曼編碼。該系統(tǒng)將實(shí)現(xiàn)以下幾大功能:從硬盤讀取字符串,建立哈夫曼樹,輸出哈夫曼樹的存儲(chǔ)結(jié)構(gòu)的初態(tài)和終態(tài),輸出各種字符出現(xiàn)的次數(shù)以及哈夫曼編碼的譯碼等。 (2)模塊的設(shè)計(jì)及介紹從硬盤讀取字符串fileopen(參數(shù)) 實(shí)現(xiàn)命令; 打印輸出;建立HuffmanTree通過三個(gè)函數(shù)來實(shí)現(xiàn):void select(參數(shù)) 初始化; for 接受命令; 處理命令;說明:在ht1.k中選擇parent為0且權(quán)值最小的兩個(gè)根結(jié)點(diǎn)的算法int jsq(參數(shù)) 初始化; for 接受命令; 處理命令; 說明:統(tǒng)計(jì)字符串中各種字母的個(gè)數(shù)以及字符的種類void Ch
8、uffmanTree() 初始化; for 接受命令; 處理命令; 輸出字符統(tǒng)計(jì)情況;說明:構(gòu)造哈夫曼樹輸出哈夫曼樹的存儲(chǔ)結(jié)構(gòu)的初態(tài)和終態(tài)分別調(diào)用print1()和print2()來實(shí)現(xiàn)void print1(參數(shù)) 初始化; 輸出初態(tài);說明:輸出哈夫曼樹的初態(tài)void print2(參數(shù)) for 輸出終態(tài);說明:輸出哈夫曼樹的終態(tài)哈夫曼編碼和譯碼void HuffmanEncoding(參數(shù)) 定義變量; 處理命令;說明:哈夫曼編碼char*decode(參數(shù)) 定義變量;while接受命令;處理命令;說明:哈夫曼譯碼(3)主要模塊程序流程圖下面介紹三個(gè)主要的程序模塊流程圖: 主函數(shù)流程圖
9、:結(jié)束統(tǒng)計(jì)字符種類及頻率字符總數(shù)num建立哈夫曼樹哈夫曼編碼哈夫曼譯碼打開文件?開始否是 圖3.1流程圖注釋:該圖比較簡(jiǎn)單,主要是調(diào)用各個(gè)函數(shù)模塊,首先代開已經(jīng)存在的文件,然后統(tǒng)計(jì)總的字符數(shù)以及出現(xiàn)的各個(gè)字符和頻率。然后才開始建立哈夫曼樹,接著在哈夫曼樹的基礎(chǔ)上對(duì)其進(jìn)行編碼,編碼之后才是譯碼。最后輸出結(jié)束。構(gòu)造哈夫曼樹:開始結(jié)束第i個(gè)結(jié)點(diǎn)權(quán)值i=num?創(chuàng)建哈夫曼樹輸出字符統(tǒng)計(jì)情況第i個(gè)根結(jié)點(diǎn)i=2*num-1?i=num?否是否是否是 圖3.2流程圖注釋:該圖是表示構(gòu)造哈夫曼樹的過程。首先輸入num個(gè)葉結(jié)點(diǎn)的權(quán)值,當(dāng)i=num是循環(huán)結(jié)束。然后進(jìn)行哈夫曼樹的構(gòu)建,當(dāng)i=2*num-1是循環(huán)結(jié)束
10、。最后輸出所得到的字符統(tǒng)計(jì)情況。哈夫曼編碼:結(jié)束開始Tp.lchlid=c?i<=num?Cd-start=0,start=numCd-start=0Cd-start=1否否是是 圖3.3流程圖解釋:該流程圖表四哈夫曼編碼情況。首先初始化,Cd-start=0,start=num。然后進(jìn)行編碼,使用了一個(gè)三目運(yùn)算符。cd-start=(Tp.lchild=c) ? '0' : '1',即當(dāng)cd-start=Tp.lchild= =c時(shí),cd-start=0;當(dāng)cd-start=Tp.lchild!= =c時(shí),cd-start=1。這個(gè)編碼循環(huán)一直到i=nu
11、m時(shí)結(jié)束。4 系統(tǒng)實(shí)現(xiàn)各模塊關(guān)鍵代碼及算法的解釋:(1)主調(diào)函數(shù) 代碼解釋:這是main函數(shù)里的各個(gè)函數(shù)調(diào)用情況。fileopen(string); /從硬盤中讀取文件num=jsq(string,cnt,str); /統(tǒng)計(jì)字符種類及各類字符出現(xiàn)的頻率DhuffmanTree(HT,cnt,str); printf("HuffmanTree的初態(tài):n");print1(HT); /輸出哈夫曼樹的初態(tài)ChuffmanTree(HT,HC,cnt,str);/建立哈夫曼樹 HuffmanEncoding(HT,HC); /生成哈夫曼編碼printf("HuffmanT
12、ree的終態(tài):n");print2(HT); /輸出哈夫曼樹的終態(tài)s=decode(HC); /讀編碼文件譯碼printf("譯碼后的字符串:n");printf("%sn",s); /輸出譯碼后的字符串(2)建立HuffmanTree 代碼解釋:該函數(shù)為在ht1.k中選擇parent為0且權(quán)值最小的兩個(gè)根結(jié)點(diǎn)的算法,其序號(hào)為s1和s2。void select(HuffmanTree T,int k,int &s1,int &s2) int i,j;int min1=101; for(i=1;i<=k;i+)if(Ti.w
13、eight<min1 &&Ti.parent=0) j=i;min1=Ti.weight;s1=j;min1=32767;for (i=1;i<=k;i+)if(Ti.weight<min1 && Ti.parent=0 && i!=s1)j=i;min1=Ti.weight;s2=j;代碼解釋:下面函數(shù)用來統(tǒng)計(jì)字符串中各種字母的個(gè)數(shù)以及字符的種類。當(dāng)字符在A和Z之間時(shí)即被計(jì)數(shù),并用strj保存字母到數(shù)組中,用cntj統(tǒng)計(jì)每種字符個(gè)數(shù)。j返回總共讀取的字符數(shù)目。int jsq(char *s,int cnt,char str)
14、int i,j,k; char *p;int temp27; for(i=1;i<=26;i+)tempi=0; for(p=s; *p!='0'p+) if(*p>='A'&&*p<='Z')k=*p-64;tempk+; /統(tǒng)計(jì)各種字符的個(gè)數(shù)for(i=1,j=0;i<=26;+i)if(tempi!=0 ) j+;strj=i+64; /送對(duì)應(yīng)的字母到數(shù)組中cntj=tempi; /存入對(duì)應(yīng)字母的權(quán)值 return j; /j是輸入字母總數(shù)代碼解釋:下面函數(shù)用來構(gòu)造哈夫曼樹HT。首先初始化哈夫曼樹,然
15、后輸入前面統(tǒng)計(jì)的各結(jié)點(diǎn)的權(quán)值,用for循環(huán)來構(gòu)造哈夫曼樹。void ChuffmanTree(HuffmanTree HT,HuffmanCode HC,int cnt,char str)int i,s1,s2;for(i=1;i<=2*num-1;i+)/初始化HT,2*num-1是指哈夫曼/所有的結(jié)點(diǎn)數(shù)目HTi.lchild=0;HTi.rchild=0;HTi.parent=0;HTi.weight=0;for(i=1;i<=num;i+) /輸入num個(gè)葉結(jié)點(diǎn)的權(quán)值HTi.weight=cnti;for(i=num+1;i<=2*num-1;i+)select(HT,
16、i-1,s1,s2);HTs1.parent=i;HTs2.parent=i;HTi.lchild=s1; HTi.rchild=s2;HTi.weight=HTs1.weight+HTs2.weight;/在ht1.k中選擇parent為0且權(quán)值最小/的兩個(gè)根結(jié)點(diǎn),其序號(hào)為s1和s2,i為雙親for(i=0;i<=num;i+) /輸入字符集的中字符HCi.ch=stri; /字符的種類i=1;while(i<=num)printf("字符%c次數(shù):%dn",HCi.ch,cnti+); /輸出統(tǒng)計(jì)的情況(3)生成Huffman編碼并寫入文件 代碼解釋:根據(jù)哈
17、夫曼樹T求哈夫曼編碼H。 void HuffmanEncoding(HuffmanTree T,HuffmanCode H)int c,p,i; /c和p分別指示t中孩子和雙親char cdn; /臨時(shí)存放編碼串int start; /指示碼在cd中的起始位置cdnum='0' /最后一位(第num個(gè))放上串結(jié)束符for(i=1;i<=num;+i)start=num; /初始位置c=i; /從葉子結(jié)點(diǎn)ti開始上溯while(p=Tc.parent)>0) /直至上溯到tc是樹根為止cd-start=(Tp.lchild=c) ? '0' :
18、9;1'c=p; /若tc是tp的左孩子/則生成0;否則生成底碼strcpy(Hi.bits,&cdstart);Hi.len=num-start;代碼解釋:對(duì)str所代表的字符串進(jìn)行編碼并寫入文件。將翻譯的二進(jìn)制碼寫入文本文件。void coding(HuffmanCode HC ,char *str) int i,j;FILE *fp;fp=fopen("codefile.txt","w");while(*str)for(i=1;i<=num;i+)if(HCi. ch=*str)for(j=0;j<=HCi.len;j+
19、)fputc(HCi.bitsj,fp);break;str+;fclose(fp);(4)電文譯碼代碼解釋:代碼文件codefile.txt的譯碼,將翻譯的二進(jìn)制碼譯成原來的字符。char*decode(HuffmanCode HC)FILE *fp;char str254; /假設(shè)遠(yuǎn)文本文件不超過254個(gè)字符char *p;static char cdn+1;int i,j,k=0,cjs;fp=fopen("codefile.txt","r");/一只讀的方式打開文本文檔/codefile.txtwhile(!feof(fp) /feof(fp)判
20、斷文件是否真正結(jié)束, /feof(fp)=1時(shí)文件結(jié)束cjs=0;for(i=0;i<num && cjs=0 && !feof(fp);i+)cdi=' 'cdi+1='0'cdi=fgetc(fp); /數(shù)組接受從fp指針?biāo)赶蛭募凶x /入的一個(gè)字符 for(j=1;j<=num;j+)if(strcmp(HCj.bits,cd)=0)strk=HCj.ch;k+;cjs=1;break; /haffman編碼和密碼譯碼相比較 strk='0'p=str; return p;5 系統(tǒng)調(diào)試運(yùn)行程序后
21、,我們可以見到一下的運(yùn)行界面。 從硬盤中讀出已有的文本文件(見圖5.1): 圖5.1 輸出哈夫曼樹存儲(chǔ)結(jié)構(gòu)的初態(tài)(見圖5.2): 圖5.2 輸出所讀字符的種類和每種字符的個(gè)數(shù)(見圖5.3): 圖5.3 輸出哈夫曼樹存儲(chǔ)結(jié)構(gòu)的終態(tài)(見圖5.4): 圖5.4 輸出譯碼后的字符(見圖5.5) 圖5.5由此可見,此次測(cè)試很成功。我們能夠?qū)⑽谋疚臋n中的文段讀出,并將其統(tǒng)計(jì)并輸出字符種類和每種字符出現(xiàn)的頻率。同時(shí)輸出哈夫曼樹存儲(chǔ)結(jié)構(gòu)的初態(tài)和終態(tài)。然后輸出譯碼后的字符。小 結(jié)通過一周的課程設(shè)計(jì)使我對(duì)哈夫曼樹以及哈夫曼編碼有了更深的認(rèn)識(shí)和理解,也使我更加明白哈夫曼編碼譯碼在信息技術(shù)中的重要性和地位。首先我談?wù)?/p>
22、我在設(shè)計(jì)期間我遇到的難點(diǎn)。開始的時(shí)候,代碼中有許多的錯(cuò)誤,特別是有一個(gè)“無法找到文件”的錯(cuò)誤讓我束手無策,最后還是屏蔽了定義的四個(gè)頭文件然后慢慢地改正錯(cuò)誤才讓我又看到了希望。然后在實(shí)現(xiàn)文章的讀入時(shí),由于對(duì)文件不是太熟悉,只好翻開C語言書本仿照其模式編寫,但后來進(jìn)入了死循環(huán),最后的解決方式是把main函數(shù)里的一個(gè)dowhile循環(huán)去掉。在程序中,我還另外加了一個(gè)功能-輸出哈夫曼樹的存儲(chǔ)結(jié)構(gòu)的初態(tài)和終態(tài)。這使得我更加的明白了哈夫曼到底是怎么存儲(chǔ)信息的。許多的錯(cuò)誤讓我明白了一個(gè)道理-細(xì)心是非常重要的。同時(shí),對(duì)于編程者而言,思路清晰是相當(dāng)重要的。在適當(dāng)?shù)臅r(shí)候和同學(xué)一起交流探討是一個(gè)十分好的學(xué)習(xí)機(jī)會(huì)。請(qǐng)
23、教老師也很重要,因?yàn)楫吘刮覀兪切率郑瑢?duì)于某些問題很難弄清楚。而且,某些錯(cuò)誤對(duì)于我們來說有時(shí)候想半天都弄不來,但老師幾下下就搞好了,這樣就更加有效地節(jié)約了時(shí)間。這次課程設(shè)計(jì)不但讓我學(xué)得了一些編程知識(shí),還學(xué)會(huì)了系統(tǒng)的做一份課程設(shè)計(jì)報(bào)告,學(xué)會(huì)了如何截圖,學(xué)會(huì)了如何更好的畫流程圖,明白了做事情只有認(rèn)真,才能真正做得更好!參考文獻(xiàn)1 嚴(yán)蔚敏.數(shù)據(jù)結(jié)構(gòu)(C語言版).清華大學(xué)出版社,20072 蘇仕華.數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì).機(jī)械工業(yè)出版社,20073 譚浩強(qiáng).C語言程序設(shè)計(jì)教程.高等教育出版社,2006附錄 源程序#include <stdio.h>#include <string.h>
24、#include <stdlib.h>#include<fstream.h>/*類型相關(guān)變量的定義*#define n 100 /葉子結(jié)點(diǎn)數(shù)#define m 2*n-1 /哈夫曼樹中的結(jié)點(diǎn)樹typedef structchar ch;char bits9; /存放編碼位串int len; CodeNode;typedef CodeNode HuffmanCoden+1;typedef struct int weight; /權(quán)值int lchild,rchild,parent; /左右孩子幾雙親指針 HTNode;typedef HTNode HuffmanTreem
25、+1; /0號(hào)單元不用int num;/*建立HuffmanTree*void select(HuffmanTree T,int k,int &s1,int &s2) /在ht1.k中選擇parent為0且權(quán)值最小的兩個(gè)根結(jié)點(diǎn)的算法/其序號(hào)為s1和s2int i,j;int min1=101; for(i=1;i<=k;i+)if(Ti.weight<min1 &&Ti.parent=0) j=i;min1=Ti.weight;s1=j;min1=32767;for (i=1;i<=k;i+)if(Ti.weight<min1 &
26、& Ti.parent=0 && i!=s1)j=i;min1=Ti.weight;s2=j;int jsq(char *s,int cnt,char str) /統(tǒng)計(jì)字符串中各種字母的個(gè)數(shù)以及字符的種類int i,j,k; char *p;int temp27; for(i=1;i<=26;i+)tempi=0; for(p=s; *p!='0'p+) /統(tǒng)計(jì)各種字符的個(gè)數(shù) if(*p>='A'&&*p<='Z')k=*p-64;tempk+;for(i=1,j=0;i<=26;+
27、i)if(tempi!=0 ) j+;strj=i+64; /送對(duì)應(yīng)的字母到數(shù)組中cntj=tempi; /存入對(duì)應(yīng)字母的權(quán)值return j; /j是輸入字母總數(shù)void ChuffmanTree(HuffmanTree HT,HuffmanCode HC,int cnt,char str) /構(gòu)造哈夫曼樹HTint i,s1,s2;for(i=1;i<=2*num-1;i+)/初始化HT,2*num-1是指哈夫曼樹所有的結(jié)點(diǎn)數(shù)目HTi.lchild=0;HTi.rchild=0;HTi.parent=0;HTi.weight=0;for(i=1;i<=num;i+) /輸入nu
28、m個(gè)葉結(jié)點(diǎn)的權(quán)值HTi.weight=cnti;for(i=num+1;i<=2*num-1;i+) /在ht1.k中選擇parent為0且權(quán)值最小的兩個(gè)根結(jié)點(diǎn)/其序號(hào)為s1和s2/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;for(i=0;i<=num;i+) /輸入字符集的中字符HCi.ch=stri; /字符的種類i=1;while(i<=num)printf("字符%c次
29、數(shù):%dn",HCi.ch,cnti+);/*生成Huffman編碼并寫入文件*void HuffmanEncoding(HuffmanTree T,HuffmanCode H) /根據(jù)哈夫曼樹T求哈夫曼編碼Hint c,p,i; /c和p分別指示t中孩子和雙親char cdn; /臨時(shí)存放編碼串int start; /指示碼在cd中的起始位置cdnum='0' /最后一位(第num個(gè))放上串結(jié)束符for(i=1;i<=num;+i)start=num; /初始位置c=i; /從葉子結(jié)點(diǎn)ti開始上溯while(p=Tc.parent)>0) /直至上溯到t
30、c是樹根為止 /若tc是tp的左孩子,則生成0;否則生成底碼cd-start=(Tp.lchild=c) ? '0' : '1'c=p;strcpy(Hi.bits,&cdstart);Hi.len=num-start;void coding(HuffmanCode HC ,char *str) /對(duì)str所代表的字符串進(jìn)行編碼 并寫入文件int i,j;FILE *fp;fp=fopen("codefile.txt","w");while(*str)for(i=1;i<=num;i+)if(HCi. ch=
31、*str)for(j=0;j<=HCi.len;j+)fputc(HCi.bitsj,fp);break;str+;fclose(fp);/*電文譯碼*char*decode(HuffmanCode HC) /代碼文件codefile.txt的譯碼FILE *fp;char str254; /假設(shè)遠(yuǎn)文本文件不超過254個(gè)字符char *p;static char cdn+1;int i,j,k=0,cjs;fp=fopen("codefile.txt","r");/一只讀的方式打開文本文檔codefile.txtwhile(!feof(fp)/fe
32、of(fp)判斷文件是否真正結(jié)束,feof(fp)=1時(shí)文件結(jié)束cjs=0;for(i=0;i<num && cjs=0 && !feof(fp);i+)cdi=' 'cdi+1='0'cdi=fgetc(fp);/數(shù)組接受從fp指針?biāo)赶蛭募凶x入的一個(gè)字符 for(j=1;j<=num;j+)if(strcmp(HCj.bits,cd)=0)/haffman編碼和密碼譯碼相比較strk=HCj.ch;k+;cjs=1;break; strk='0'p=str;return p;/*輸出HuffmanTree存儲(chǔ)結(jié)構(gòu)*void print1(HuffmanTree HT)int x; for(x=1;x<=2*num-1;x+) HTx.parent=0;HTx.lchild=0;HTx.rchild=0;printf("%11d %dt %dt %dn",HTx.weight,HTx.parent,HTx.lchild,HTx.rchild);printf("-n"); void print2(HuffmanTree HT)int k;for(k=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 市場(chǎng)調(diào)查合同范本
- 農(nóng)業(yè)用地開挖合同范本
- 南京教育培訓(xùn)合同范本
- 衛(wèi)生間包管合同范本
- 機(jī)械制造基礎(chǔ)模擬考試題(附參考答案)
- 茶藝師五級(jí)模擬習(xí)題+答案
- 安全生產(chǎn)應(yīng)知應(yīng)會(huì)知識(shí)習(xí)題庫(kù)及答案
- 加盟費(fèi)合同范本
- 廠房場(chǎng)地租賃合同范本
- 出資不經(jīng)營(yíng)合同范本
- 2025年黑龍江農(nóng)墾職業(yè)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)完整
- 2025年黑龍江旅游職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)附答案
- 2025年湖南理工職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)必考題
- 2025年健康咨詢管理服務(wù)合同范文
- 光學(xué)鏡片透光率測(cè)量基準(zhǔn)
- 歷史-貴州省貴陽市2025年高三年級(jí)適應(yīng)性考試(一)(貴陽一模)試題和答案
- 2025年01月2025全國(guó)婦聯(lián)所屬在京事業(yè)單位公開招聘93人筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 輻射安全管理測(cè)試題含答案
- 信息系統(tǒng)項(xiàng)目計(jì)劃書
- 2025學(xué)生管理工作計(jì)劃怎么寫
- JGJT178-2009 補(bǔ)償收縮混凝土應(yīng)用技術(shù)規(guī)程
評(píng)論
0/150
提交評(píng)論