版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 計算機學院信息管理與信息系統(tǒng)專業(yè)</p><p><b> 數(shù)據(jù)結構課程設計</b></p><p> 題 目: 哈夫曼樹的應用 </p><p> 班 級: 信管09101班 </p><p> 姓 名:
2、 趙林芬 </p><p> 學 號: 200917020114 </p><p> 同組人姓名: 陳立芳 王紅 </p><p> 起 迄 日 期: 2011.03.01-03.04 </p><p> 課
3、程設計地點: 系辦公樓E3-A513 </p><p> 指導教師: 孫葉楓 </p><p> 完成日期:2011年3月4日</p><p><b> 目錄</b></p><p><b> 1、設計目的3</b><
4、/p><p><b> 2、需求分析4</b></p><p> 2.1選題的意義及背景4</p><p> 2.2 輸入/輸出形式和輸出值的范圍4</p><p><b> 3、概要設計4</b></p><p><b> 3.1設計思想4<
5、/b></p><p> 3.2函數(shù)間的關系4</p><p><b> 4、詳細設計5</b></p><p> 4.1哈夫曼的主要結構5</p><p> 4.1.1結構定義5</p><p> 4.1.2主要函數(shù)聲明及功能描述6</p><p&g
6、t;<b> 4.2源程序7</b></p><p> 4.2.1頭文件7</p><p> 4.2.2源文件8</p><p> 5、程序測試結果及問題分析17</p><p><b> 6、總結18</b></p><p><b> 7、參
7、考文獻18</b></p><p><b> 1.設計目的</b></p><p> 數(shù)據(jù)結構作為一門學科主要研究數(shù)據(jù)的各種邏輯結構和存儲結構,以及對數(shù)據(jù)的各種操作。因此,主要有三個方面的內(nèi)容:數(shù)據(jù)的邏輯結構;數(shù)據(jù)的物理存儲結構;對數(shù)據(jù)的操作(或算法)。通常,算法的設計取決于數(shù)據(jù)的邏輯結構,算法的實現(xiàn)取決于數(shù)據(jù)的物理存儲結構。數(shù)據(jù)結構是信息的一種組織
8、方式,其目的是為了提高算法的效率,它通常與一組算法的集合相對應,通過這組算法集合可以對數(shù)據(jù)結構中的數(shù)據(jù)進行某種操作。</p><p> 在當今信息時代,信息技術己成為當代知識經(jīng)濟的核心技術。我們時刻都在和數(shù)據(jù)打交道。比如人們在外出工作時找最短路徑,在銀行查詢存款、通過互聯(lián)網(wǎng)查新聞、以及遠程教育報名等,所有這些都在與數(shù)據(jù)發(fā)生關系。實際上,現(xiàn)實世界中的實體經(jīng)過抽象以后,就可以成為計算機上所處理的數(shù)據(jù)。</p&
9、gt;<p> 數(shù)據(jù)結構課程主要是研究非數(shù)值計算的程序設計問題中所出現(xiàn)的計算機操作對象以及它們之間的關系和操作的學科。數(shù)據(jù)結構是介于數(shù)學、計算機軟件和計算機硬件之間的一門計算機專業(yè)的核心課程,它是計算機程序設計、數(shù)據(jù)庫、操作系統(tǒng)、編譯原理及人工智能等的重要基礎,廣泛的應用于信息學、系統(tǒng)工程等各種領域。</p><p> 學習數(shù)據(jù)結構是為了將實際問題中所涉及的對象在計算機中表示出來并對它們進行處理
10、。通過課程設計可以提高學生的思維能力,促進學生的綜合應用能力和專業(yè)素質的提高。通過此次課程設計主要達到以下目的:</p><p> 了解并掌握數(shù)據(jù)結構與算法的設計方法,具備初步的獨立分析和設計能力;</p><p> 初步掌握軟件開發(fā)過程的問題分析、系統(tǒng)設計、程序編碼、測試等基本方法和技能;</p><p> 提高綜合運用所學的理論知識和方法獨立分析和解決問題
11、的能力;</p><p> 訓練用系統(tǒng)的觀點和軟件開發(fā)一般規(guī)范進行軟件開發(fā),培養(yǎng)軟件工作者所應具備的科學的工作方法和作風。</p><p><b> 2.需求分析</b></p><p> 2.1選題的意義及背景</p><p> 鍛煉我們的編碼能力,真正理解數(shù)據(jù)結構的編碼思想,并且鍛煉我們的動手能力和成員間的配
12、合,提高程序編寫能力。</p><p> 在信息傳遞時,希望長度能盡可能短,即采用最短碼。赫夫曼編碼的應用,就是采用這種有效的數(shù)據(jù)壓縮技術可以節(jié)省數(shù)據(jù)文件的存儲空間和計算機網(wǎng)絡的傳送時間。</p><p> 2.2 輸入/輸出形式和輸出值的范圍</p><p> 輸入信息以加載存檔的reading.txt文件為方式,加載不成功,提示出錯信息,加載成功后,系統(tǒng)對
13、其編碼,并按照選擇對各種相關信息存檔</p><p><b> 3.概要設計</b></p><p><b> 3.1設計思想</b></p><p> 哈夫曼樹用鄰接矩陣作為存儲結構,借助靜態(tài)鏈表來實現(xiàn)遍歷。 </p><p> 利用多重結構體的形式設計出所需的變量類型,還有基本的文件讀寫
14、知識,同時借助九大子函數(shù)結合一個主函數(shù)設計了此課程內(nèi)容,第一部分為信息的讀寫及統(tǒng)計;第二部分為哈夫曼樹及其編碼的建立,再將編碼信息寫進文件;第三部分為給信息加密在寫進文件,再在對其翻譯。最后的主函數(shù)是整個程序的組織者,利用switch選擇循環(huán)將九大子函數(shù)聯(lián)系起來,畫龍點睛。這樣整個程序的基本流出就出來了,再根據(jù)此流出設計出源程序。 </p><p><b> 3.2函數(shù)間的關系</b>&l
15、t;/p><p> 哈夫曼系統(tǒng),函數(shù)間的關系如圖所示:</p><p><b> 界面運行圖如下:</b></p><p><b> 4、詳細設計</b></p><p> 4.1哈夫曼的主要結構 </p><p> 4.1.1結構定義:</p><
16、;p> #define MAXVALUE 1000//定義最大權值</p><p> #define MAXBIT 100//定義哈夫曼樹中葉子結點個數(shù)</p><p> typedef struct</p><p><b> { </b></p><p> char data;//字符值<
17、/p><p> int num;//某個值的字符出現(xiàn)的次數(shù)</p><p> }TotalNode; //統(tǒng)計結點,包括字符種類和出現(xiàn)次數(shù)</p><p> typedef struct</p><p><b> { </b></p><p> TotalNode tot[300];/
18、/統(tǒng)計結點數(shù)組</p><p> int num;//統(tǒng)計數(shù)組中含有的字符個數(shù)</p><p> }Total; //統(tǒng)計結構體,包括統(tǒng)計數(shù)組和字符種類數(shù)</p><p> typedef struct</p><p><b> { </b></p><p> char mes[
19、300];//字符數(shù)組</p><p> int num;//總字符數(shù)</p><p> }Message; //信息結構體,包括字符數(shù)組和總字符數(shù)</p><p> typedef struct{</p><p> int locked[500];//密碼數(shù)組</p><p> int num;//密碼總數(shù)
20、</p><p> }Locking; //哈夫曼編碼后的密文信息</p><p> typedef struct</p><p><b> { </b></p><p> char data;//字符</p><p> int weight;//權值</p>&l
21、t;p> int parent;//雙親結點在數(shù)組HuffNode[]中的序號</p><p> int lchild;//左孩子結點在數(shù)組HuffNode[]中的序號</p><p> int rchild;//右孩子結點在數(shù)組HuffNode[]中的序號</p><p> }HNodetype; //哈夫曼樹結點類型,包括左右孩子,權值和信息<
22、;/p><p> typedef struct</p><p><b> { </b></p><p> int bit[MAXBIT];</p><p> int start;</p><p> }HCodetype; //哈夫曼編碼結構體,包括編碼數(shù)組和起始位</p>&l
23、t;p> 4.1.2主要函數(shù)聲明及功能描述如下:</p><p> void reading_file(Message *message);</p><p><b> 從文件中讀取信息</b></p><p> void writing_file(Message *message);</p><p><
24、;b> 將信息寫進文件</b></p><p> void total_message(Message *message,Total *total);</p><p> 統(tǒng)計信息中各字符的出現(xiàn)次數(shù)</p><p> void HaffmanTree(Total *total,HNodetype HuffNode[]);</p>
25、<p><b> 構建哈夫曼樹</b></p><p> void HaffmanCode(HNodetype HuffNode[],HCodetype HuffCode[],Total *total);</p><p><b> 建立哈夫曼編碼</b></p><p> void writing_HC
26、ode(HNodetype HuffNode[],HCodetype HuffCode[],Total *total);</p><p><b> 將編碼規(guī)則寫進文件</b></p><p> void lock(Message *message,HNodetype HuffNode[],HCodetype HuffCode[],Total *total,Lock
27、ing *locking);</p><p><b> 給文件信息加密編碼</b></p><p> void writing_lock(Locking *locking);</p><p> 將已編碼信息寫進文件</p><p> void writing_translate(Locking *locking,
28、HCodetype HuffCode[],HNodetype HuffNode[],Total *total);</p><p> 將已編碼信息翻譯過來并寫進文件</p><p><b> 4.2源程序 </b></p><p> 4.2.1頭文件head.h</p><p> #define MAXVALUE
29、1000//定義最大權值</p><p> #define MAXBIT 100//定義哈夫曼樹中葉子結點個數(shù)</p><p> typedef struct</p><p><b> { </b></p><p> char data;//字符值</p><p> int nu
30、m;//某個值的字符出現(xiàn)的次數(shù)</p><p> }TotalNode; //統(tǒng)計結點,包括字符種類和出現(xiàn)次數(shù)</p><p> typedef struct</p><p><b> { </b></p><p> TotalNode tot[300];//統(tǒng)計結點數(shù)組</p><p&
31、gt; int num;//統(tǒng)計數(shù)組中含有的字符個數(shù)</p><p> }Total; //統(tǒng)計結構體,包括統(tǒng)計數(shù)組和字符種類數(shù)</p><p> typedef struct</p><p><b> { </b></p><p> char mes[300];//字符數(shù)組</p>&l
32、t;p> int num;//總字符數(shù)</p><p> }Message; //信息結構體,包括字符數(shù)組和總字符數(shù)</p><p> typedef struct{</p><p> int locked[500];//密碼數(shù)組</p><p> int num;//密碼總數(shù)</p><p> }L
33、ocking; //哈夫曼編碼后的密文信息</p><p> typedef struct</p><p><b> { </b></p><p> char data;//字符</p><p> int weight;//權值</p><p> int parent;//雙親結
34、點在數(shù)組HuffNode[]中的序號</p><p> int lchild;//左孩子結點在數(shù)組HuffNode[]中的序號</p><p> int rchild;//右孩子結點在數(shù)組HuffNode[]中的序號</p><p> }HNodetype; //哈夫曼樹結點類型,包括左右孩子,權值和信息</p><p> typed
35、ef struct</p><p><b> { </b></p><p> int bit[MAXBIT];</p><p> int start;</p><p> }HCodetype; //哈夫曼編碼結構體,包括編碼數(shù)組和起始位</p><p> void reading_fil
36、e(Message *message);//從文件中讀取信息</p><p> void writing_file(Message *message);//將信息寫進文件</p><p> void total_message(Message *message,Total *total);//統(tǒng)計信息中各字符的次數(shù)</p><p> void HaffmanT
37、ree(Total *total,HNodetype HuffNode[]);//構建哈夫曼樹</p><p> void HaffmanCode(HNodetype HuffNode[],HCodetype HuffCode[],Total *total);//建立哈夫曼編碼</p><p> void writing_HCode(HNodetype HuffNode[],HCode
38、type HuffCode[],Total *total);//將編碼規(guī)則寫進文件</p><p> void lock(Message *message,HNodetype HuffNode[],HCodetype HuffCode[],Total *total,Locking *locking);//給文件信息加密編碼</p><p> void writing_lock(Lock
39、ing *locking);//將已編碼信息寫進文件</p><p> void writing_translate(Locking *locking,HCodetype HuffCode[],HNodetype HuffNode[],Total *total);//將已編碼信息翻譯過來并寫進文件</p><p> 4.2.2源文件source.cpp</p><p
40、> #include<iostream></p><p> #include<fstream></p><p> #include"head.h"</p><p> using namespace std;</p><p> int main()</p><p&g
41、t;<b> {</b></p><p> int i,j,choice,mark=0;//mark標記文件信息是否讀入到內(nèi)存中</p><p> HNodetype HuffNode[500];//保存哈夫曼樹中各結點信息</p><p> HCodetype HuffCode[300];</p><p>
42、Locking *locking;</p><p> Total *total;</p><p> Message *message;</p><p> locking=new Locking;</p><p> locking->num=0;</p><p> total=new Total;<
43、/p><p> total->num=0;</p><p> message=new Message;</p><p> message->num=0; //初始化變量</p><p><b> while(1)</b></p><p><b> {</b>
44、</p><p> cout<<"********************************************************************************";</p><p> cout<<"*1:從文件讀取信息 2:顯示編碼規(guī)則 3:將原文件信息寫進文件
45、 *";</p><p> cout<<"*4:將編碼規(guī)則寫進文件 5:將編碼后的信息寫進文件 6:將譯碼后的信息寫進文件 7:退出 *";</p><p> cout<<"***********************************************************************
46、*********";</p><p> cout<<endl;</p><p> cout<<"請輸入操作代碼:";</p><p> cin>>choice;</p><p> switch(choice)</p><p><b>
47、 {</b></p><p><b> case 1:</b></p><p> reading_file(message);//從文件中讀取信息</p><p><b> mark=1;</b></p><p><b> break;</b></p
48、><p> case 2://顯示編碼規(guī)則</p><p> if(mark==0)cout<<"請先從文件中讀取信息!"<<endl;</p><p><b> else</b></p><p><b> {</b></p><p
49、> total_message(message,total); HaffmanTree(total,HuffNode); HaffmanCode(HuffNode,HuffCode,total); </p><p> for(i=0;i<total->num;i++)//顯示編碼規(guī)則</p&
50、gt;<p><b> { </b></p><p> cout<<total->tot[i].data<<" ";</p><p> for(j=HuffCode[i].start+1;j<total->num;j++)</p><p> co
51、ut<<HuffCode[i].bit[j];</p><p> cout<<endl;</p><p><b> }</b></p><p><b> }</b></p><p> break; </p><p> case 3
52、://將原文件信息寫進文件</p><p> if(mark==0)cout<<"請先從文件中讀取信息!"<<endl;</p><p><b> else</b></p><p> writing_file(message);//將信息寫進文件</p><p><
53、b> break;</b></p><p> case 4://將編碼規(guī)則寫進文件</p><p> if(mark==0)cout<<"請先從文件中讀取信息!"<<endl;</p><p><b> else</b></p><p><b&g
54、t; {</b></p><p> total_message(message,total); </p><p> HaffmanTree(total,HuffNode); </p><p> HaffmanCode(HuffNode,HuffCode,total); writing_HCode(HuffNode,HuffCode,to
55、tal); </p><p><b> }</b></p><p><b> break;</b></p><p> case 5://將編碼后的信息寫進文件</p><p> if(mark==0)cout<<"請先從文件中讀取信息!"<<end
56、l;</p><p><b> else</b></p><p><b> {</b></p><p> total_message(message,total); </p><p> HaffmanTree(total,HuffNode); </p><p> H
57、affmanCode(HuffNode,HuffCode,total); </p><p> lock(message,HuffNode,HuffCode,total,locking); </p><p> writing_lock(locking);</p><p><b> }</b></p><p><
58、b> break;</b></p><p> case 6://將譯碼后的信息寫進文件</p><p> if(mark==0)cout<<"請先從文件中讀取信息!"<<endl;</p><p><b> else</b></p><p><b
59、> {</b></p><p> total_message(message,total); </p><p> HaffmanTree(total,HuffNode); </p><p> HaffmanCode(HuffNode,HuffCode,total); writing_transl
60、ate(locking,HuffCode,HuffNode,total);</p><p><b> }</b></p><p><b> break;</b></p><p><b> case 7:</b></p><p><b> exit(1);<
61、;/b></p><p><b> default:</b></p><p> cout<<"輸入錯誤,請重新選擇"<<endl;</p><p><b> }</b></p><p><b> }</b></p&
62、gt;<p> for(i=0;i<locking->num;i++)</p><p> if(locking->locked[i]==-1)cout<<" ";</p><p><b> else</b></p><p> cout<<locking->
63、locked[i]; </p><p> cout<<endl;</p><p> for(i=0;i<total->num;i++)</p><p> cout<<total->tot[i].data<<" "<<total->tot[i].num<<en
64、dl;</p><p> for(i=0;i<2*(total->num)-1;i++)</p><p> cout<<HuffNode[i].parent<<" ";</p><p> cout<<endl; </p><p><b> ret
65、urn 0;</b></p><p><b> }</b></p><p> void reading_file(Message *message)</p><p><b> { </b></p><p><b> int i=0;</b></p>
66、;<p><b> char ch;</b></p><p> ifstream infile("c:\\reading.txt",ios::in|ios::out);</p><p> if(!infile)//打開失敗則結束</p><p><b> {</b></p&g
67、t;<p> cout<<"打開c:\\reading.txt文件失敗"<<endl;</p><p><b> exit(1);</b></p><p><b> }</b></p><p><b> else</b></p&g
68、t;<p> cout<<"讀取文件成功"<<endl;</p><p> while(infile.get(ch) && ch!='#')//讀取字符直到遇到#</p><p><b> {</b></p><p> message->me
69、s[i]=ch; </p><p><b> i++;</b></p><p><b> }</b></p><p> message->num=i;//記錄總字符數(shù)</p><p> infile.close();//關閉文件</p><p> }//從
70、文件中讀取信息</p><p> void writing_file(Message *message)//將信息寫進文件</p><p><b> {</b></p><p><b> int i;</b></p><p> ofstream outfile("c:\\writi
71、ng.txt",ios::in|ios::out);//打開文件</p><p> if(!outfile)//打開失敗則結束</p><p><b> {</b></p><p> cout<<"打開c:\\writing.txt文件失敗"<<endl;</p><
72、;p><b> exit(1);</b></p><p><b> }</b></p><p> for(i=0;i<message->num;i++)//寫文件</p><p> outfile.put(message->mes[i]); </p><p> co
73、ut<<"信息寫進文件成功"<<endl;</p><p> outfile.close();//關閉文件</p><p> }//將原信息寫入文件</p><p> void total_message(Message *message,Total *total)</p><p><b
74、> {</b></p><p> int i,j,mark;</p><p> for(i=0;i<message->num;i++)//遍歷message中的所有字符信息</p><p><b> {</b></p><p> if(message->mes[i]!=
75、9; ')//字符不為空格時</p><p><b> {</b></p><p><b> mark=0;</b></p><p> for(j=0;j<total->num;j++)//在total中搜索當前字符</p><p> if(total->tot[j
76、].data==message->mes[i])</p><p> //搜索到,則此字符次數(shù)加1,mark標志為1</p><p><b> {</b></p><p> total->tot[j].num++;</p><p><b> mark=1;</b></p>
77、;<p><b> break;</b></p><p><b> }</b></p><p> if(mark==0)</p><p> //未搜索到,新建字符種類,保存進total中,字符類加1</p><p><b> {</b></p>
78、;<p> total->tot[total->num].data=message->mes[i];</p><p> total->tot[total->num].num=1;</p><p> total->num++;</p><p><b> }</b></p>&
79、lt;p><b> }</b></p><p><b> }</b></p><p> }//統(tǒng)計信息中各字符的出現(xiàn)次數(shù)</p><p> 通過各權值的一一比較選取最小和次小兩權值建立二叉樹,記錄節(jié)點的左右孩子及雙親的位置關系最終構建成哈夫曼樹,且記錄的左孩子權值比右孩子小</p><p&
80、gt; void HaffmanTree(Total *total,HNodetype HuffNode[])</p><p><b> {</b></p><p> int i,j,min1,min2,x1,x2;</p><p> 首先初始化哈夫曼樹并存入葉子結點權值和信息</p><p> for(i=0
81、;i<2*(total->num)-1;i++)</p><p><b> {</b></p><p> if(i<=total->num-1)HuffNode[i].data=total->tot[i].data;</p><p> HuffNode[i].weight=total->tot[i].n
82、um;</p><p> HuffNode[i].parent=-1;</p><p> HuffNode[i].lchild=-1;</p><p> HuffNode[i].rchild=-1;</p><p><b> } </b></p><p> for(i=0;i
83、<total->num-1;i++)</p><p><b> {</b></p><p> min1=min2=MAXVALUE;</p><p><b> x1=x2=0;</b></p><p> 接著選取最小x1和次小x2的兩權值</p><p>
84、 for(j=0;j<total->num+i;j++) </p><p><b> {</b></p><p> if(HuffNode[j].parent==-1&&HuffNode[j].weight<min1)</p><p><b> {</b></p>&
85、lt;p> min2=min1;</p><p><b> x2=x1;</b></p><p> min1=HuffNode[j].weight;</p><p><b> x1=j;</b></p><p><b> }</b></p><
86、;p><b> else</b></p><p> if(HuffNode[j].parent==-1&&HuffNode[j].weight<min2) </p><p> min2=HuffNode[j].wei
87、ght;</p><p><b> x2=j;</b></p><p><b> }</b></p><p> HuffNode[x1].parent=total->num+i;//修改親人結點位置</p><p> HuffNode[x2].parent=total->num+
88、i;</p><p> HuffNode[total->num+i].weight=HuffNode[x1].weight+HuffNode[x2].weight; 最后選出的左孩子比右孩子權值小</p><p> HuffNode[total->num+i].lchild=x1; </p><p> HuffNode[total->num+
89、i].rchild=x2;</p><p><b> }</b></p><p><b> }</b></p><p><b> 哈夫曼樹構建成功</b></p><p> 在建立的哈夫曼樹基礎上,利用數(shù)組使左分支為0,右分支為1,從葉結點向上直到根結點建立哈夫曼編碼,
90、并保存每個葉結點起始位。該函數(shù)利用了while的循環(huán)并多次利用for循環(huán)以完成目標</p><p> void HaffmanCode(HNodetype HuffNode[],HCodetype HuffCode[],Total *total)</p><p><b> {</b></p><p> int i,j,c,p;</p
91、><p> HCodetype cd;</p><p> for(i=0;i<total->num;i++)//建立葉子結點個數(shù)的編碼</p><p><b> {</b></p><p> cd.start=total->num-1;//起始位的初始化</p><p>
92、p=HuffNode[i].parent;</p><p><b> c=i;</b></p><p> while(p!=-1)//從葉結點向上爬直到到達根結點</p><p><b> {</b></p><p> if(HuffNode[p].lchild==c)//左分支都為0<
93、;/p><p> cd.bit[cd.start]=0;</p><p><b> else</b></p><p> cd.bit[cd.start]=1;//右分支都為1</p><p> cd.start--;//起始位向前移動</p><p><b> c=p;</b
94、></p><p> p=HuffNode[p].parent;</p><p><b> }</b></p><p> for(j=cd.start+1;j<total->num;j++)</p><p> //保存求出的每個葉結點編碼和起始位</p><p> Hu
95、ffCode[i].bit[j]=cd.bit[j];</p><p> HuffCode[i].start=cd.start;</p><p><b> }</b></p><p><b> }</b></p><p> 哈夫曼編碼的建立成功</p><p> 利
96、用文件的輸入輸出規(guī)則打開HCode文件,打開失敗則結束操作,否則將信息利用數(shù)組及for循環(huán)寫進文件</p><p> void writing_HCode(HNodetype HuffNode[],HCodetype HuffCode[],Total *total)</p><p><b> {</b></p><p><b>
97、 int i,j;</b></p><p> ofstream outfile("c:\\HCode.txt",ios::in|ios::out);</p><p> if(!outfile)//打開失敗則結束并輸出</p><p><b> {</b></p><p> cout
98、<<"打開c:\\HCode.txt文件失敗"<<endl;</p><p><b> exit(1);</b></p><p><b> }</b></p><p> for(i=0;i<total->num;i++)//寫文件</p><
99、p><b> {</b></p><p> outfile.put(HuffNode[i].data);</p><p> outfile<<" ";</p><p> for(j=HuffCode[i].start+1;j<total->num;j++)</p><
100、;p> outfile<<HuffCode[i].bit[j];</p><p> outfile<<endl;</p><p><b> } </b></p><p> cout<<"編碼規(guī)則寫進文件成功"<<endl;</p><p>
101、; outfile.close();//關閉文件</p><p><b> }</b></p><p> void lock(Message *message,HNodetype HuffNode[],HCodetype HuffCode[],Total *total,Locking *locking)</p><p><b>
102、 {</b></p><p> int i,j,m;</p><p> for(i=0;i<message->num;i++)//遍歷信息</p><p><b> {</b></p><p> if(message->mes[i]==' ')</p>
103、<p> //碰到空格則以-1形式保存進locked數(shù)組中</p><p><b> {</b></p><p> locking->locked[locking->num]=-1;</p><p> locking->num++;</p><p><b> }</
104、b></p><p><b> else</b></p><p> for(j=0;j<total->num;j++)//搜索信息對應的編碼</p><p><b> {</b></p><p> if(HuffNode[j].data==message->mes[i
105、])</p><p> for(m=HuffCode[j].start+1;m<total->num;m++)</p><p><b> {</b></p><p> locking->locked[locking->num]=HuffCode[j].bit[m];</p><p> lo
106、cking->num++;//locked數(shù)組總數(shù)加1</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> }//給文件信息加密編碼</p><p> voi
107、d writing_lock(Locking *locking)</p><p><b> {</b></p><p><b> int i;</b></p><p> ofstream outfile("c:\\locking.txt",ios::in|ios::out);</p>
108、<p> if(!outfile)//打開失敗則結束</p><p><b> {</b></p><p> cout<<"打開c:\\locking.txt文件失敗"<<endl;</p><p><b> exit(1);</b></p>&
109、lt;p><b> }</b></p><p> for(i=0;i<locking->num;i++)//寫文件</p><p> if(locking->locked[i]==-1)</p><p> outfile.put(' ');</p><p><b>
110、; else</b></p><p> outfile<<locking->locked[i];</p><p> cout<<"已編碼信息寫進文件成功"<<endl;</p><p> outfile.close();//關閉文件</p><p> }//將
111、哈夫曼編碼后的密文信息寫進文件</p><p> void writing_translate(Locking *locking,HCodetype HuffCode[],HNodetype HuffNode[],Total *total)</p><p><b> {</b></p><p> int i,j,mark[100],sta
112、rt[100],min,max;</p><p> ofstream outfile("c:\\translate.txt",ios::in|ios::out);//打開文件</p><p> if(!outfile)//打開失敗則結束</p><p><b> {</b></p><p>
113、cout<<"打開c:\\translate.txt文件失敗"<<endl;</p><p><b> exit(1);</b></p><p><b> }</b></p><p> for(i=0;i<total->num;i++)//start數(shù)組初始化&
114、lt;/p><p> start[i]=HuffCode[i].start+1;</p><p> for(i=0;i<total->num;i++)//mark數(shù)組初始化</p><p> mark[i]=1;</p><p><b> min=0;</b></p><p>
115、for(max=0;max<locking->num;max++)//寫文件</p><p><b> {</b></p><p> if(locking->locked[max]==-1)//碰到空格信息則直接輸出空格</p><p><b> {</b></p><p>
116、 outfile.put(' ');</p><p><b> min++;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p>&
117、lt;p> for(i=min;i<=max;i++)//查找從min開始到max的編碼對應的信息</p><p><b> {</b></p><p> for(j=0;j<total->num;j++) </p><p><b> {
118、</b></p><p> if(start[j]==total->num+1)</p><p> mark[j]=0;//對應編碼比所給編碼短則不在比較</p><p> if(mark[j]==1&&locking->locked[i]==HuffCode[j].bit[start[j]])</p>&
119、lt;p> start[j]++;</p><p><b> else</b></p><p> mark[j]=0;</p><p> } </p><p><b> }</b></p><p> for(
120、i=0;i<total->num;i++)//找到對應信息,則寫進文件</p><p><b> {</b></p><p> if(mark[i]==1&&start[i]==total->num)</p><p><b> {</b></p><p>
121、outfile.put(HuffNode[i].data);</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> if(i!=total->num)</p>&
122、lt;p> min=max+1;</p><p> for(i=0;i<total->num;i++)//start數(shù)組初始化 </p><p> start[i]=HuffCode[i].start+1; </p><p> for(i=0;i<total->num;i++)
123、//mark數(shù)組初始化</p><p> mark[i]=1;</p><p><b> }</b></p><p><b> }</b></p><p> cout<<"翻譯信息寫進文件成功"<<endl;</p><p>
124、; outfile.close();//關閉文件</p><p><b> ?。?lt;/b></p><p> 5.程序測試結果及問題分析</p><p> 5.1 程序測試結果</p><p> 在C盤中輸入一個reading的文本文檔</p><p> 運行后有如下界面再選擇操作代碼1:
125、</p><p> 再選擇2,即出現(xiàn)如下哈夫曼編碼界面:</p><p> 選擇代碼3,使程序運行,信息寫進文件:</p><p><b> 5.2 問題分析</b></p><p> 程序的設計過程中,我們遇到不少問題,比如對文件的讀寫不能精確的掌握,所以這部分的設計過程中總免不了要翻書,有的時侯會打開文件之后
126、忘記outfile.close();在哈夫曼編碼的時候,在reading的文件中的拼寫錯誤使我們運行過多次,但最終還是發(fā)現(xiàn)了,語法的錯誤導致浪費了很多時間,針對不同的電腦程序運行有的會出現(xiàn)不同的結果,比如:有的電腦只需要輸入一個reading文件就可以,但有的電腦運行就需要把writing等的都寫出來,才能運行,這可能是電腦的系統(tǒng)問題,但最終還是克服了。最主要的是編寫程序是的細節(jié)錯誤,但那是對算法的一種真正的考察,如果哈夫曼的算法不能熟
127、悉的寫出,說明其思想沒有滲透這才是問題的關鍵,但是我們還是齊心協(xié)力把它給寫出來了。</p><p><b> 6.總結</b></p><p> 通過本次數(shù)據(jù)結構的課程設計,我學習了很多在上課沒懂的知識,并對求哈夫曼樹及哈夫曼編碼/譯碼的算法有了更加深刻的了解,更鞏固了課堂中學習有關于哈夫曼編碼的知識,真正學會一種算法了。當求解一個算法時,不是拿到問題就不加思索地
128、做,而是首先要先對它有個大概的了解,接著再詳細地分析每一步怎么做,無論自己以前是否有處理過相似的問題,只要按照以上的步驟,必定會順利地做出來。</p><p> 這次課程設計,我在編輯中犯了不應有的錯誤,設計統(tǒng)計字符和合并時忘記應該怎樣保存保存數(shù)據(jù),在不斷分析后明確并改正了錯誤和疏漏,使我的程序有了更高的質量。這不僅是程序設計,更是鍛煉我們處理問題的能力,同時也使我們了解到團隊合作的可貴.編寫程序是件細心活,稍
129、不留神就會出錯,這就必須要求我們對待事情要認真!在編寫程序的過程中,錯誤不斷出現(xiàn),不同的類型(如少寫了一個符號,寫錯了字母,用錯了函數(shù)等等)層出不窮,這考驗我們待事細心,耐心,能不能堅持到底,不能半途而廢。</p><p> 三人行必有我?guī)?遇到問題我們一起討論,研究,錯了再寫,寫了在改.經(jīng)過多次的修改,調(diào)試,運行,添加,終于最后在大家的歡呼聲中,完成了我們的任務.雖說是累了點,但我們也從中找到了自己的快樂,每
130、當完成一個新的函數(shù)時,那心情是激動啊,這畢竟是自己弄出來的,同時也使我感受到了學習的快樂!</p><p><b> 7.參考文獻</b></p><p> [1]嚴蔚敏,吳偉民.《數(shù)據(jù)結構:C語言版》.北京:清華大學出版社.</p><p> [2]陳維興,林小茶.《C++面向對象程序設計教程(第三版)》北京:清華大學出版社. &l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 哈夫曼樹課程設計
- 哈夫曼樹課程設計
- 課程設計 哈夫曼樹及哈夫曼編碼
- 哈夫曼樹課程設計報告
- 哈夫曼樹_數(shù)據(jù)結構課程設計
- 哈夫曼樹_數(shù)據(jù)結構課程設計
- 哈夫曼編碼譯碼器課程設計--- 哈夫曼樹的建立與實現(xiàn)
- 應用數(shù)據(jù)結構課程設計---哈夫曼樹
- 課程設計-哈夫曼編碼
- 《哈夫曼編碼》課程設計
- 課程設計哈夫曼編碼
- 哈夫曼課程設計報告
- 哈夫曼編碼課程設計
- 課程設計哈夫曼編碼
- 數(shù)據(jù)結構課程設計---哈夫曼樹的應用
- 數(shù)據(jù)結構課程設計--哈夫曼樹的應用
- 哈夫曼樹和哈夫曼編碼
- 數(shù)據(jù)結構課程設計--- 哈夫曼樹的應用
- 哈弗曼樹課程設計
- 哈夫曼課程設計報告--哈夫曼編譯碼器
評論
0/150
提交評論