哈夫曼編碼譯碼器課程設(shè)計(jì)報告中英文界面樣本_第1頁
哈夫曼編碼譯碼器課程設(shè)計(jì)報告中英文界面樣本_第2頁
哈夫曼編碼譯碼器課程設(shè)計(jì)報告中英文界面樣本_第3頁
哈夫曼編碼譯碼器課程設(shè)計(jì)報告中英文界面樣本_第4頁
哈夫曼編碼譯碼器課程設(shè)計(jì)報告中英文界面樣本_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

數(shù)據(jù)構(gòu)造課程設(shè)計(jì)報告課題:哈夫曼編碼譯碼器專業(yè)班級:信息06102班學(xué)號:1608姓名:李宇光指引教師:屠添翼評閱意見:評閱意見:評估成績:指引教師簽名:年月日目錄目錄目錄 11課程設(shè)計(jì)目和意義 22需求分析 33系統(tǒng)(項(xiàng)目)設(shè)計(jì) 5①設(shè)計(jì)思路及方案………………5②模塊設(shè)計(jì)及簡介……………5③重要模塊程序流程圖…………84系統(tǒng)實(shí)現(xiàn) 11①主調(diào)函數(shù)…………..…………..……………..12②建立HuffmanTree……………12③生成Huffman編碼并寫入文獻(xiàn)……………..15④電文譯碼……………………..165系統(tǒng)調(diào)試 17參照文獻(xiàn) 20附錄源程序 211課程設(shè)計(jì)目和意義在當(dāng)今信息爆炸時代,如何采用有效數(shù)據(jù)壓縮技術(shù)來節(jié)約數(shù)據(jù)文獻(xiàn)存儲空間和計(jì)算機(jī)網(wǎng)絡(luò)傳送時間已越來越引起人們注重。哈夫曼編碼正是一種應(yīng)用廣泛且非常有效數(shù)據(jù)壓縮技術(shù)。哈夫曼編碼應(yīng)用很廣泛,運(yùn)用哈夫曼樹求得用于通信二進(jìn)制編碼稱為哈夫曼編碼。樹中從根到每個葉子均有一條途徑,對途徑上各分支商定:指向左子樹分支表達(dá)“0”碼,指向右子樹分支表達(dá)“1”碼,取每條途徑上“0”或“1”序列作為和各個相應(yīng)字符編碼,這就是哈夫曼編碼。普通咱們把數(shù)據(jù)壓縮過程稱為編碼,解壓縮過程稱為解碼。電報通信是傳遞文字二進(jìn)制碼形式字符串。但在信息傳遞時,總但愿總長度盡量最短,即采用最短碼。作為信息管理專業(yè)學(xué)生,咱們應(yīng)當(dāng)較好掌握這門技術(shù)。在課堂上,咱們能過學(xué)到許多理論知識,但咱們很少有過自己動手實(shí)踐機(jī)會!課程設(shè)計(jì)就是為解決這個問題提供了一種平臺。在課程設(shè)計(jì)過程中,咱們每個人選取一種課題,認(rèn)真研究,依照課堂講授內(nèi)容,借助課本,自己動手實(shí)踐。這樣不但有助于咱們消化課堂所解說內(nèi)容,還可以增強(qiáng)咱們獨(dú)立思考能力和動手能力;通過編寫實(shí)驗(yàn)代碼和調(diào)試運(yùn)營,咱們可以逐漸積累調(diào)試C程序經(jīng)驗(yàn)并逐漸培養(yǎng)咱們編程能力、用計(jì)算機(jī)解決實(shí)際問題能力。在課程設(shè)計(jì)過程中,咱們不但有自己獨(dú)立思考,還借助各種參照文獻(xiàn)來協(xié)助咱們完畢系統(tǒng)。更為重要是,咱們同窗之間加強(qiáng)了交流,在對問題結(jié)識方面可以互換不批準(zhǔn)見。同步,師生之間互動也隨之改進(jìn),咱們可以通過詳細(xì)實(shí)例來從教師那學(xué)到更多實(shí)用知識。數(shù)據(jù)構(gòu)造課程具備比較強(qiáng)理論性,同步也具備較強(qiáng)可應(yīng)用性和實(shí)踐性。課程設(shè)計(jì)是一種重要教學(xué)環(huán)節(jié)。咱們在普通狀況下都可以注重實(shí)驗(yàn)環(huán)節(jié),但是容易忽視實(shí)驗(yàn)總結(jié),忽視實(shí)驗(yàn)報告撰寫。通過這次實(shí)驗(yàn)讓咱們明白:作為一名大學(xué)生必要嚴(yán)格訓(xùn)練分析總結(jié)能力、書面表達(dá)能力。需要逐漸培養(yǎng)書寫科學(xué)實(shí)驗(yàn)報告以及科技論文能力。只有這樣,咱們綜合素質(zhì)才會有好提高。2需求分析課題:哈夫曼編碼譯碼器系統(tǒng)問題描述:打開一篇英文文章,記錄該文章中每個字符浮現(xiàn)次數(shù),然后以它們作為權(quán)值,對每一種字符進(jìn)行編碼,編碼完畢后再對其編碼進(jìn)行譯碼。問題補(bǔ)充:1.從硬盤一種文獻(xiàn)里讀出一段英語文章;2.記錄這篇文章中每個字符浮現(xiàn)次數(shù);3.以字符浮現(xiàn)字?jǐn)?shù)作為權(quán)值,構(gòu)建哈夫曼樹,并將哈夫曼樹存儲構(gòu)造初態(tài)和終態(tài)進(jìn)行輸出;4.對每個字符進(jìn)行編碼并將所編碼寫入文獻(xiàn)然后對所編碼進(jìn)行破譯。詳細(xì)簡介:在本課題中,咱們在硬盤E盤中預(yù)先建立一種file1.txt文檔,在里面編輯一篇文章(大寫)。然后運(yùn)營程序,調(diào)用fileopen()函數(shù)讀出該文章,顯示在界面;再調(diào)用jsq()函數(shù)對該文章字符種類進(jìn)行記錄,并對每個字符浮現(xiàn)次數(shù)進(jìn)行記錄,并且在界面上顯示;然后以每個字符浮現(xiàn)次數(shù)作為權(quán)值,調(diào)用ChuffmanTree()函數(shù)構(gòu)建哈夫曼樹;并調(diào)用print1()和print2()函數(shù)將哈夫曼存儲構(gòu)造初態(tài)和終態(tài)進(jìn)行輸出。然后調(diào)用HuffmanEncoding()函數(shù)對哈夫曼樹進(jìn)行編碼,調(diào)用coding()函數(shù)將編碼寫入文獻(xiàn);再調(diào)用decode()對編碼進(jìn)行譯碼,再輸出至界面。至此,整個工作就完畢了。測試數(shù)據(jù):例如從文本中讀到文章為:IAMASTUDENT。則效果如下:IAMASTUDENTHuffmanTree初態(tài):200010001000100010001000100020001000-000-000-000-000-000-000-000-000字符A次數(shù):2字符D次數(shù):1字符E次數(shù):1字符I次數(shù):1字符M次數(shù):1字符N次數(shù):1字符S次數(shù):1字符T次數(shù):2字符U次數(shù):1HuffmanTree終態(tài):21300110001100011100111001120011200214001130021423215452156731691416810417111271713141101516譯碼后字符串:IAMASTUDENT**********************************************************Pressanykeytocontinue3系統(tǒng)(項(xiàng)目)設(shè)計(jì)(1)設(shè)計(jì)思路及方案本課題是用最優(yōu)二叉樹即哈夫曼樹來實(shí)現(xiàn)哈夫曼編碼譯碼器功能。假設(shè)每種字符在電文中浮現(xiàn)次數(shù)為Wi,編碼長度為Li,電文中有n種字符,則電文編碼總長度為(W1*L1)+(W2*L2)+…+(Wi*Li)。若將此相應(yīng)到二叉樹上,Wi為葉結(jié)點(diǎn),Li為根結(jié)點(diǎn)到葉結(jié)點(diǎn)途徑長度。那么,(W1*L1)+(W2*L2)+…+(Wi*Li)正好為二叉樹上帶權(quán)途徑長度。因而,設(shè)計(jì)電文總長最短二進(jìn)制前綴編碼,就是以n種字符浮現(xiàn)頻率作權(quán),構(gòu)造一棵哈夫曼樹,此構(gòu)造過程稱為哈夫曼編碼。該系統(tǒng)將實(shí)現(xiàn)如下幾大功能:從硬盤讀取字符串,建立哈夫曼樹,輸出哈夫曼樹存儲構(gòu)造初態(tài)和終態(tài),輸出各種字符浮現(xiàn)次數(shù)以及哈夫曼編碼譯碼等。(2)模塊設(shè)計(jì)及簡介①從硬盤讀取字符串fileopen(參數(shù)){實(shí)現(xiàn)命令;打印輸出; }②建立HuffmanTree通過三個函數(shù)來實(shí)現(xiàn):voidselect(參數(shù)){初始化;for{接受命令;解決命令;}}闡明:在ht[1k]中選取parent為0且權(quán)值最小兩個根結(jié)點(diǎn)算法intjsq(參數(shù)){初始化;for{接受命令;解決命令;}}闡明:記錄字符串中各種字母個數(shù)以及字符種類voidChuffmanTree(){初始化;for{接受命令;解決命令;}輸出字符記錄狀況;}闡明:構(gòu)造哈夫曼樹③輸出哈夫曼樹存儲構(gòu)造初態(tài)和終態(tài)分別調(diào)用print1()和print2()來實(shí)現(xiàn)voidprint1(參數(shù)){初始化;輸出初態(tài);}闡明:輸出哈夫曼樹初態(tài)voidprint2(參數(shù)){for{輸出終態(tài);}}闡明:輸出哈夫曼樹終態(tài)④哈夫曼編碼和譯碼voidHuffmanEncoding(參數(shù)){定義變量;{解決命令;}}闡明:哈夫曼編碼char*decode(參數(shù)){定義變量;while{接受命令;解決命令;}}闡明:哈夫曼譯碼(3)重要模塊程序流程圖下面簡介三個重要程序模塊流程圖:①主函數(shù)流程圖:結(jié)束結(jié)束記錄字符種類及頻率字符總數(shù)num建立哈夫曼樹哈夫曼編碼哈夫曼譯碼打開文獻(xiàn)?開始否是圖3.1流程圖注釋:該圖比較簡樸,重要是調(diào)用各個函數(shù)模塊,一方面代開已經(jīng)存在文獻(xiàn),然后記錄總字符數(shù)以及浮現(xiàn)各個字符和頻率。然后才開始建立哈夫曼樹,接著在哈夫曼樹基本上對其進(jìn)行編碼,編碼之后才是譯碼。最后輸出結(jié)束。②構(gòu)造哈夫曼樹:開始開始結(jié)束第i個結(jié)點(diǎn)權(quán)值i=num?創(chuàng)立哈夫曼樹輸出字符記錄狀況第i個根結(jié)點(diǎn)i=2*num-1?i=num?否是否是否是圖3.2流程圖注釋:該圖是表達(dá)構(gòu)造哈夫曼樹過程。一方面輸入num個葉結(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é)束。最后輸出所得到字符記錄狀況。③哈夫曼編碼:結(jié)束結(jié)束開始T[p].lchlid=c?i<=num?Cd[--start]=0,start=numCd[--start]=0Cd[--start]=1否否是是圖3.3 流程圖解釋:該流程圖表四哈夫曼編碼狀況。一方面初始化,Cd[--start]=0,start=num。然后進(jìn)行編碼,使用了一種三目運(yùn)算符。cd[--start]=(T[p].lchild==c)?'0':'1',即當(dāng)cd[--start]=T[p].lchild==c時,cd[--start]=0;當(dāng)cd[--start]=T[p].lchild!==c時,cd[--start]=1。這個編碼循環(huán)始終到i=num時結(jié)束。4系統(tǒng)實(shí)現(xiàn)各模塊核心代碼及算法解釋:主調(diào)函數(shù)代碼解釋:這是main函數(shù)里各個函數(shù)調(diào)用狀況。fileopen(string);//從硬盤中讀取文獻(xiàn) num=jsq(string,cnt,str);//記錄字符種類及各類字符浮現(xiàn)頻率 DhuffmanTree(HT,cnt,str); printf("HuffmanTree初態(tài):\n"); print1(HT);//輸出哈夫曼樹初態(tài) ChuffmanTree(HT,HC,cnt,str);//建立哈夫曼樹 HuffmanEncoding(HT,HC);//生成哈夫曼編碼 printf("HuffmanTree終態(tài):\n"); print2(HT);//輸出哈夫曼樹終態(tài) s=decode(HC);//讀編碼文獻(xiàn)譯碼 printf("譯碼后字符串:\n"); printf("%s\n",s);//輸出譯碼后字符串建立HuffmanTree代碼解釋:該函數(shù)為在ht[1k]中選取parent為0且權(quán)值最小兩個根結(jié)點(diǎn)算法,其序號為s1和s2。voidselect(HuffmanTreeT,intk,int&s1,int&s2){ inti,j;intmin1=101;for(i=1;i<=k;i++) if(T[i].weight<min1&&T[i].parent==0) { j=i;min1=T[i].weight; } s1=j;min1=32767; for(i=1;i<=k;i++) if(T[i].weight<min1&&T[i].parent==0&&i!=s1) { j=i;min1=T[i].weight; } s2=j;}代碼解釋:下面函數(shù)用來記錄字符串中各種字母個數(shù)以及字符種類。當(dāng)字符在A和Z之間時即被計(jì)數(shù),并用str[j]保存字母到數(shù)組中,用cnt[j]記錄每種字符個數(shù)。j返回總共讀取字符數(shù)目。intjsq(char*s,intcnt[],charstr[]){ inti,j,k; char*p; inttemp[27]; for(i=1;i<=26;i++) temp[i]=0; for(p=s;*p!='\0';p++) { { if(*p>='A'&&*p<='Z') k=*p-64; temp[k]++; } }//記錄各種字符個數(shù) for(i=1,j=0;i<=26;++i) if(temp[i]!=0) { j++; str[j]=i+64;//送相應(yīng)字母到數(shù)組中 cnt[j]=temp[i];//存入相應(yīng)字母權(quán)值 } returnj;//j是輸入字母總數(shù)}代碼解釋:下面函數(shù)用來構(gòu)造哈夫曼樹HT。一方面初始化哈夫曼樹,然后輸入前面記錄各結(jié)點(diǎn)權(quán)值,用for循環(huán)來構(gòu)造哈夫曼樹。voidChuffmanTree(HuffmanTreeHT,HuffmanCodeHC,intcnt[],charstr[]){ inti,s1,s2;for(i=1;i<=2*num-1;i++)//初始化HT,2*num-1是指哈夫曼//所有結(jié)點(diǎn)數(shù)目 { HT[i].lchild=0;HT[i].rchild=0; HT[i].parent=0;HT[i].weight=0; } for(i=1;i<=num;i++)//輸入num個葉結(jié)點(diǎn)權(quán)值 HT[i].weight=cnt[i]; for(i=num+1;i<=2*num-1;i++) { select(HT,i-1,s1,s2); HT[s1].parent=i;HT[s2].parent=i; HT[i].lchild=s1;HT[i].rchild=s2; HT[i].weight=HT[s1].weight+HT[s2].weight; }//在ht[1k]中選取parent為0且權(quán)值最小//兩個根結(jié)點(diǎn),其序號為s1和s2,i為雙親for(i=0;i<=num;i++)//輸入字符集中字符 HC[i].ch=str[i];//字符種類 i=1;while(i<=num) printf("字符%c次數(shù):%d\n",HC[i].ch,cnt[i++]);}//輸出記錄狀況生成Huffman編碼并寫入文獻(xiàn)代碼解釋:依照哈夫曼樹T求哈夫曼編碼H。voidHuffmanEncoding(HuffmanTreeT,HuffmanCodeH){ intc,p,i;//c和p分別批示t中孩子和雙親 charcd[n];//暫時存儲編碼串 intstart;//批示碼在cd中起始位置 cd[num]='\0';//最后一位(第num個)放上串結(jié)束符 for(i=1;i<=num;++i) { start=num;//初始位置 c=i;//從葉子結(jié)點(diǎn)t[i]開始上溯 while((p=T[c].parent)>0)//直至上溯到t[c]是樹根為止 { cd[--start]=(T[p].lchild==c)?'0':'1'; c=p; }//若t[c]是t[p]左孩子//則生成0;否則生成底碼1 strcpy(H[i].bits,&cd[start]); H[i].len=num-start; }}代碼解釋:對str所代表字符串進(jìn)行編碼并寫入文獻(xiàn)。將翻譯二進(jìn)制碼寫入文本文獻(xiàn)。voidcoding(HuffmanCodeHC,char*str){ inti,j; FILE*fp; fp=fopen("codefile.txt","w"); while(*str) { for(i=1;i<=num;i++) if(HC[i].ch==*str){ for(j=0;j<=HC[i].len;j++) fputc(HC[i].bits[j],fp); break; } str++; }fclose(fp);}電文譯碼代碼解釋:代碼文獻(xiàn)codefile.txt譯碼,將翻譯二進(jìn)制碼譯成本來字符。char*decode(HuffmanCodeHC){ FILE*fp; charstr[254];//假設(shè)遠(yuǎn)文本文獻(xiàn)不超過254個字符 char*p; staticcharcd[n+1]; inti,j,k=0,cjs;fp=fopen("codefile.txt","r");//一只讀方式打開文本文檔//codefile.txtwhile(!feof(fp))//feof(fp)判斷文獻(xiàn)與否真正結(jié)束,//feof(fp)=1時文獻(xiàn)結(jié)束{ cjs=0; for(i=0;i<num&&cjs==0&&!feof(fp);i++) { cd[i]='';cd[i+1]='\0'; cd[i]=fgetc(fp);//數(shù)組接受從fp指針?biāo)赶蛭墨I(xiàn)中讀//入一種字符for(j=1;j<=num;j++) if(strcmp(HC[j].bits,cd)==0) { str[k]=HC[j].ch; k++; cjs=1;break;}//haffman編碼和密碼譯碼相比較}} str[k]='\0';p=str; returnp;}5系統(tǒng)調(diào)試本次測試是在我電腦E盤中建立一種名為file1.txt文本文檔,其中有大寫字母IAMASTUDENT,盼望程序能將其讀出至界面并實(shí)現(xiàn)其她有關(guān)功能。運(yùn)營程序后,咱們可以見到一下運(yùn)營界面。從硬盤中讀出已有文本文獻(xiàn)(見圖5.1):圖5.1輸出哈夫曼樹存儲構(gòu)造初態(tài)(見圖5.2):圖5.2輸出所讀字符種類和每種字符個數(shù)(見圖5.3):圖5.3輸出哈夫曼樹存儲構(gòu)造終態(tài)(見圖5.4):圖5.4輸出譯碼后字符(見圖5.5)圖5.5由此可見,本次測試很成功。咱們可以將文本文檔file1.txt中文段讀出,并將其記錄并輸出字符種類和每種字符浮現(xiàn)頻率。同步輸出哈夫曼樹存儲構(gòu)造初態(tài)和終態(tài)。然后輸出譯碼后字符。小結(jié)通過兩周課程設(shè)計(jì)使我對哈夫曼樹以及哈夫曼編碼有了更深結(jié)識和理解,也使我更加明白哈夫曼編碼譯碼在信息技術(shù)中重要性和地位。一方面我談?wù)勎以谠O(shè)計(jì)期間我遇到難點(diǎn)。開始時候,代碼中有許多錯誤,特別是有一種“無法找到文獻(xiàn)”錯誤讓我束手無策,最后還是屏蔽了定義四個頭文獻(xiàn)然后慢慢地改正錯誤才讓我又看到了但愿。然后在實(shí)現(xiàn)文章讀入時,由于對文獻(xiàn)不是太熟悉,只得翻開C語言課本仿照其模式編寫,但日后進(jìn)入了死循環(huán),最后解決方式是把main函數(shù)里一種do…while循環(huán)去掉。在程序中,我還此外加了一種功能輸出哈夫曼樹存儲構(gòu)造初態(tài)和終態(tài)。這使得我更加明白了哈夫曼究竟是怎么存儲信息。許多錯誤讓我明白了一種道理細(xì)心是非常重要。同步,對于編程者而言,思路清晰是相稱重要。在恰當(dāng)時候和同窗一起交流探討是一種十分好學(xué)習(xí)機(jī)會。請教教師也很重要,由于畢竟咱們是新手,對于某些問題很難弄清晰。并且,某些錯誤對于咱們來說有時候想半天都弄不來,但教師幾下下就搞好了,這樣就更加有效地節(jié)約了時間。這次課程設(shè)計(jì)不但讓我學(xué)得了某些編程知識,還學(xué)會了系統(tǒng)做一份課程設(shè)計(jì)報告,學(xué)會了如何截圖,學(xué)會了如何更好畫流程圖,明白了做事情只有認(rèn)真,才干真正做得更好!這段時間里,可謂是酸甜苦辣都嘗過。有時,為了一種錯誤而焦頭爛額;有時,編程熬夜到凌晨兩點(diǎn);有時,連吃飯都是匆匆了事;但一旦程序運(yùn)營成功,總會讓我興奮不已。通過這次課程設(shè)計(jì),我看清晰了自己編程功底和動手能力還不如人意,這重要是平時實(shí)踐太少緣故。我想,在將來暑假中,我會努力嘗試編寫某些程序。雖然咱們信息管理專業(yè)學(xué)生,但當(dāng)前編程能力太差了,畢竟多精通一門技術(shù)總是好事。在這個程序中,尚有許多地方值得完善。例如,讀出文本只能是大寫文檔,空格和小寫不能辨認(rèn),更不用說是任意ASCⅡ碼字符了。由于時間問題,暫時不能實(shí)現(xiàn)了。我想在暑假里好好研究這個問題。參照文獻(xiàn)[1]嚴(yán)蔚敏.數(shù)據(jù)構(gòu)造(C語言版).清華大學(xué)出版社,[2]蘇仕華.數(shù)據(jù)構(gòu)造課程設(shè)計(jì).機(jī)械工業(yè)出版社,[3]譚浩強(qiáng).C語言程序設(shè)計(jì)教程.高等教誨出版社,附錄源程序#include<stdio.h>#include<string.h>#include<stdlib.h>#include<fstream.h>//*************************類型有關(guān)變量定義****************************** #definen100//葉子結(jié)點(diǎn)數(shù)#definem2*n-1//哈夫曼樹中結(jié)點(diǎn)樹typedefstruct{ charch; charbits[9];//存儲編碼位串 intlen;}CodeNode;typedefCodeNodeHuffmanCode[n+1];typedefstruct{ intweight;//權(quán)值 intlchild,rchild,parent;//左右孩子幾雙親指針}HTNode;typedefHTNodeHuffmanTree[m+1];//0號單元不用intnum;//**********************************建立HuffmanTree*************************voidselect(HuffmanTreeT,intk,int&s1,int&s2){//在ht[1k]中選取parent為0且權(quán)值最小兩個根結(jié)點(diǎn)算法 //其序號為s1和s2 inti,j;intmin1=101;for(i=1;i<=k;i++) if(T[i].weight<min1&&T[i].parent==0) { j=i;min1=T[i].weight; } s1=j;min1=32767; for(i=1;i<=k;i++) if(T[i].weight<min1&&T[i].parent==0&&i!=s1) { j=i;min1=T[i].weight; } s2=j;}intjsq(char*s,intcnt[],charstr[]){//記錄字符串中各種字母個數(shù)以及字符種類 inti,j,k; char*p; inttemp[27]; for(i=1;i<=26;i++) temp[i]=0; for(p=s;*p!='\0';p++) { {//記錄各種字符個數(shù) if(*p>='A'&&*p<='Z') k=*p-64; temp[k]++; } } for(i=1,j=0;i<=26;++i) if(temp[i]!=0) { j++; str[j]=i+64;//送相應(yīng)字母到數(shù)組中 cnt[j]=temp[i];//存入相應(yīng)字母權(quán)值 } returnj;//j是輸入字母總數(shù)}voidChuffmanTree(HuffmanTreeHT,HuffmanCodeHC,intcnt[],charstr[]){//構(gòu)造哈夫曼樹HT inti,s1,s2; for(i=1;i<=2*num-1;i++)//初始化HT,2*num-1是指哈夫曼樹所有結(jié)點(diǎn)數(shù)目 { HT[i].lchild=0;HT[i].rchild=0; HT[i].parent=0;HT[i].weight=0; } for(i=1;i<=num;i++)//輸入num個葉結(jié)點(diǎn)權(quán)值 HT[i].weight=cnt[i]; for(i=num+1;i<=2*num-1;i++) {//在ht[1k]中選取parent為0且權(quán)值最小兩個根結(jié)點(diǎn) //其序號為s1和s2 //i為雙親 select(HT,i-1,s1,s2); HT[s1].parent=i;HT[s2].parent=i; HT[i].lchild=s1;HT[i].rchild=s2; HT[i].weight=HT[s1].weight+HT[s2].weight; } for(i=0;i<=num;i++)//輸入字符集中字符 HC[i].ch=str[i];//字符種類 i=1;while(i<=num) printf("字符%c次數(shù):%d\n",HC[i].ch,cnt[i++]); }//*************************生成Huffman編碼并寫入文獻(xiàn)************************voidHuffmanEncoding(HuffmanTreeT,HuffmanCodeH){//依照哈夫曼樹T求哈夫曼編碼H intc,p,i;//c和p分別批示t中孩子和雙親 charcd[n];//暫時存儲編碼串 intstart;//批示碼在cd中起始位置 cd[num]='\0';//最后一位(第num個)放上串結(jié)束符 for(i=1;i<=num;++i) { start=num;//初始位置 c=i;//從葉子結(jié)點(diǎn)t[i]開始上溯 while((p=T[c].parent)>0)//直至上溯到t[c]是樹根為止 {//若t[c]是t[p]左孩子,則生成0;否則生成底碼1 cd[--start]=(T[p].lchild==c)?'0':'1'; c=p; } strcpy(H[i].bits,&cd[start]); H[i].len=num-start; }}voidcoding(HuffmanCodeHC,char*str){//對str所代表字符串進(jìn)行編碼并寫入文獻(xiàn) inti,j; FILE*fp; fp=fopen("codefile.txt","w"); while(*str) { for(i=1;i<=num;i++) if(HC[i].ch==*str){ for(j=0;j<=HC[i].len;j++) fputc(HC[i].bits[j],fp); break; } str++; }fclose(fp);}//*************************電文譯碼****************************************char*decode(HuffmanCodeHC){//代碼文獻(xiàn)codefile.txt譯碼 FILE*fp; charstr[254];//假設(shè)遠(yuǎn)文本文獻(xiàn)不超過254個字符 char*p; staticcharcd[n+1]; inti,j,k=0,cjs; fp=fopen("codefile.txt","r");//一只讀方式打開文本文檔codefile.txt while(!feof(fp))//feof(fp)判斷文獻(xiàn)與否真正結(jié)束,feof(fp)=1時文獻(xiàn)結(jié)束 { cjs=0; for(i=0;i<num&&cjs==0&&!feof(fp);i++) { cd[i]='';cd[i+1]='\0'; cd[i]=fgetc(fp);//數(shù)組接受從fp指針?biāo)赶蛭墨I(xiàn)中讀入一種字符for(j=1;j<=num;j++) if(strcmp(HC[j].bits,cd)==0)//haffman編碼和密碼譯碼相比較 { str[k]=HC[j].ch; k++; cjs=1;break; } } } str[k]='\0'; p=str; returnp;}//*************************輸出HuffmanTree存儲構(gòu)造*************************voidprint1(HuffmanTreeHT){ intx; for(x=1;x<=2*num-1;x++) { HT[x].parent=0; HT[x].lchild=0; HT[x].rchild=0; printf("%11d%d\t%d\t%d\n",HT[x].we

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論