版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)</b></p><p><b> 哈夫曼編碼</b></p><p> 學(xué) 院:計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 </p><p> 專(zhuān) 業(yè):計(jì)算機(jī)科學(xué)與技術(shù) </p><p> 學(xué) 生: </p
2、><p> 學(xué) 號(hào): </p><p> 指導(dǎo)教師: </p><p> 2013年4月16日</p><p><b> 目錄</b></p><p> 課程設(shè)計(jì)的目的、功能及要求--------------1</p>
3、<p> 主要功能模塊流程圖----------------------2</p><p> 算法的基本思想--------------------------3</p><p> 系統(tǒng)測(cè)試--------------------------------6</p><p> 結(jié)論-----------------------------------
4、-7</p><p> 源程序----------------------------------8</p><p> 一、課程設(shè)計(jì)的目的、功能及要求</p><p><b> 目的:</b></p><p> 解并掌握數(shù)據(jù)結(jié)構(gòu)與算法的設(shè)計(jì)方法,具備初步的獨(dú)立分析和設(shè)計(jì)能力; </p><p&
5、gt; 件開(kāi)發(fā)過(guò)程的問(wèn)題分析、系統(tǒng)設(shè)計(jì)、程序編碼、測(cè)試等基本方法和技能; </p><p> .合運(yùn)用所學(xué)的理論知識(shí)和方法獨(dú)立分析和解決問(wèn)題的能力; </p><p> 用系統(tǒng)的觀點(diǎn)和軟件開(kāi)發(fā)一般規(guī)范進(jìn)行軟件開(kāi)發(fā),培養(yǎng)軟件工作者所應(yīng)具備的科學(xué)的工作方法和作風(fēng)。</p><p><b> 功能:</b></p><p&
6、gt; 1首先讀入待壓縮源文件; </p><p> 2然后建立并分析字母表,對(duì)每種字符的出現(xiàn)頻度進(jìn)行統(tǒng)計(jì),以頻度作為建立Huffman 樹(shù)的權(quán)值; </p><p> 3頻度表建好后,就可以根據(jù)算法建立Huffman 樹(shù),對(duì)出現(xiàn)的每種字符進(jìn)行Huffman編碼; </p><p> 4此時(shí),再次讀入源文件,逐字節(jié)編碼,將得到的編碼流寫(xiě)入到磁盤(pán)文件,并
7、且計(jì)算壓縮率。</p><p><b> 要求:</b></p><p> 1、核心數(shù)據(jù)結(jié)構(gòu)用到的結(jié)構(gòu)體要采用動(dòng)態(tài)內(nèi)存分配和鏈表結(jié)構(gòu)。 </p><p> 2 、不同的功能使用不同的函數(shù)實(shí)現(xiàn)(模塊化),對(duì)每個(gè)函數(shù)的功能和調(diào)用接口要注釋清楚。對(duì)程序其它部分也進(jìn)行必要的注釋。 </p><p> 3 、對(duì)系統(tǒng)進(jìn)行
8、功能模塊分析、畫(huà)出總流程圖和各模塊流程圖。 </p><p> 、用戶界面要求使用方便、簡(jiǎn)潔明了、美觀大方、格式統(tǒng)一。 </p><p> 所有程序需調(diào)試通過(guò)。 </p><p> 二、主要功能模塊流程圖</p><p><b> 三、算法的基本思想</b></p><p> ?。?
9、)構(gòu)造Hufffman樹(shù)的方法—Hufffman算法</p><p> 構(gòu)造Huffman樹(shù)步驟:</p><p> 根據(jù)給定的n個(gè)權(quán)值{w1,w2,……wn},構(gòu)造n棵只有根結(jié)點(diǎn)的二叉樹(shù),令起權(quán)值為wj。</p><p> 在森林中選取兩棵根結(jié)點(diǎn)權(quán)值最小的樹(shù)作左右子樹(shù),構(gòu)造一棵新的二叉樹(shù),置新二叉樹(shù)根結(jié)點(diǎn)權(quán)值為其左右子樹(shù)根結(jié)點(diǎn)權(quán)值之和</p>
10、<p> 在森林中刪除這兩棵樹(shù),同時(shí)將新得到的二叉樹(shù)加入森林中。</p><p> 重復(fù)上述兩步,直到只含一棵樹(shù)為止,這棵樹(shù)即哈夫曼樹(shù)。</p><p> ?。?)Huffman編碼:數(shù)據(jù)通信用的二進(jìn)制編碼</p><p> 思想:根據(jù)字符出現(xiàn)頻率編碼,使電文總長(zhǎng)最短</p><p> 編碼:根據(jù)字符出現(xiàn)頻率構(gòu)造Huffma
11、n樹(shù),然后將樹(shù)中結(jié)點(diǎn)引向其左孩子的分支標(biāo)“0”,引向其右孩子的分支標(biāo)“1”;每個(gè)字符的編碼即為從根到每個(gè)葉子的路徑上得到的0、1序列。</p><p><b> 流程圖:</b></p><p><b> 部分程序:</b></p><p><b> 構(gòu)造哈夫曼樹(shù)</b></p>
12、<p> void HaffmanTree(HNodeType HuffNode[MAXNODE]) </p><p><b> {</b></p><p> int i,j,m1,m2,x1,x2;</p><p> for(i=0;i<MAXNODE;i++)</p><
13、;p><b> {</b></p><p> HuffNode[i].parent=-1;</p><p> HuffNode[i].lchild=-1;</p><p> HuffNode[i].rchild=-1;</p><p><b> }</b></p>&l
14、t;p> for(i=0;i<num-1;i++)</p><p><b> {</b></p><p> m1=m2=MAXVALUE;</p><p><b> x1=x2=0;</b></p><p> for(j=0;j<num+i;j++)</p>
15、<p><b> {</b></p><p> if(HuffNode[j].parent==-1&&HuffNode[j].weight<m1)</p><p><b> {</b></p><p><b> m2=m1;</b></p>&l
16、t;p><b> x2=x1;</b></p><p> m1=HuffNode[j].weight;</p><p><b> x1=j;</b></p><p><b> }</b></p><p><b> else</b></
17、p><p> if(HuffNode[j].parent==-1&&HuffNode[j].weight<m2)</p><p><b> {</b></p><p> m2=HuffNode[j].weight;</p><p><b> x2=j;</b></p&
18、gt;<p><b> }</b></p><p><b> }</b></p><p> HuffNode[x1].parent=num+i;</p><p> HuffNode[x2].parent=num+i;</p><p> HuffNode[num+i].weig
19、ht=HuffNode[x1].weight+HuffNode[x2].weight;</p><p> HuffNode[num+i].lchild=x1;</p><p> HuffNode[num+i].rchild=x2;</p><p><b> }</b></p><p><b> }<
20、;/b></p><p><b> (2)哈夫曼編碼</b></p><p> LinkList Bianma(LinkList l,Code code[MAXNODE]) //寫(xiě)編碼文件</p><p><b> {</b></p><p> LinkList p,q,p1,p2;
21、</p><p><b> int i,j;</b></p><p> p=l->next ;</p><p> q=new LNode;</p><p> q->next=NULL;</p><p> p1=new LNode;</p><p>&l
22、t;b> p2=q;</b></p><p><b> while(p)</b></p><p><b> {</b></p><p> for(i=0;i<num;i++)</p><p> if(p->data==code[i].data)</p&
23、gt;<p><b> { </b></p><p><b> j=0;</b></p><p> while(code[i].bit[j]!='\0')</p><p><b> {</b></p><p> p1->data
24、=code[i].bit[j];</p><p><b> j++;</b></p><p> p2->next=p1;</p><p><b> p2=p1;</b></p><p> p1=new LNode;</p><p><b> }<
25、;/b></p><p><b> }</b></p><p> p=p->next ;</p><p><b> }</b></p><p> p2->next=NULL;</p><p><b> return q;</b>
26、;</p><p><b> }</b></p><p> SeqStack Init()</p><p><b> {</b></p><p> SeqStack s;</p><p> s=new StackNode;</p><p>
27、 s->top=-1;</p><p><b> return s;</b></p><p><b> }</b></p><p> void HaffmanCode(HNodeType HuffNode[MAXNODE],HCodeType HuffCode[MAXLEAF]) //哈夫曼編碼算法</p
28、><p><b> {</b></p><p> int i,j,c,p;</p><p> HCodeType cd;</p><p> for(i=0;i<num;i++)</p><p><b> {</b></p><p> cd
29、.start=MAXBIT-1;</p><p><b> c=i;</b></p><p> p=HuffNode[c].parent ;</p><p> while(p!=-1)</p><p><b> {</b></p><p> if(HuffNode[
30、p].lchild==c)</p><p> cd.bit[cd.start]='0';</p><p><b> else</b></p><p> cd.bit[cd.start]='1';</p><p> cd.start --;</p><p>&
31、lt;b> c=p;</b></p><p> p=HuffNode[c].parent;</p><p><b> }</b></p><p> for(j=cd.start+1;j<MAXBIT;j++)</p><p> HuffCode[i].bit[j]=cd.bit[j];&
32、lt;/p><p> HuffCode[i].start=cd.start ;</p><p><b> }</b></p><p><b> }</b></p><p><b> 四、系統(tǒng)測(cè)試</b></p><p><b> 1、主界
33、面</b></p><p><b> 2、輸入并保存編碼</b></p><p><b> 五、結(jié)論</b></p><p> 本次課程設(shè)計(jì)的目的是:把一個(gè)隨機(jī)輸入的字符串中不同字符作為葉子結(jié)點(diǎn)元素,把其在該字符串中出現(xiàn)的次數(shù)作為權(quán)值構(gòu)造一個(gè)赫夫曼樹(shù),并得到各個(gè)葉子結(jié)點(diǎn)的赫夫曼編碼和整個(gè)輸入的字符串的赫夫
34、曼編碼。在寫(xiě)代碼前,首先,對(duì)問(wèn)題進(jìn)行了分析,明確了目標(biāo),列出了大的框架,然后逐漸細(xì)化,劃分出不同的功能模塊,由具體的子函數(shù)去實(shí)現(xiàn),先在紙上編寫(xiě)代碼,寫(xiě)好后進(jìn)行了反復(fù)的邏輯推理,發(fā)現(xiàn)并解決邏輯問(wèn)題,然后,上機(jī)調(diào)試,方法是:一個(gè)一個(gè)功能模塊分開(kāi)進(jìn)行調(diào)試,主要看調(diào)試的模塊能否達(dá)到預(yù)期的結(jié)果,這樣可以縮小排錯(cuò)的范圍,便以糾錯(cuò)和提高編程的效率,當(dāng)每個(gè)功能模塊都調(diào)試好后,就把各個(gè)部分組合起來(lái),再進(jìn)行調(diào)試,主要檢查各函數(shù)接口是否正確,當(dāng)達(dá)到預(yù)期的結(jié)果
35、,調(diào)試結(jié)束,編程部分完成,然后按實(shí)驗(yàn)要求完成實(shí)驗(yàn)報(bào)告。</p><p> 由于寫(xiě)代碼前做了充分的準(zhǔn)備工作,所以寫(xiě)起代碼來(lái)比較順利,使編程的效率有不少的提高并且最終達(dá)到實(shí)驗(yàn)預(yù)期的結(jié)果。</p><p><b> 心得體會(huì):</b></p><p> 每一次的課程設(shè)計(jì)對(duì)我來(lái)說(shuō)都是一個(gè)不小的提高,哲學(xué)上說(shuō):“實(shí)踐是檢驗(yàn)真理正確性的唯一標(biāo)準(zhǔn)”,尤
36、其是學(xué)編程,自己不動(dòng)手操作,只看書(shū)永遠(yuǎn)都編不出像Windows之類(lèi)的東西,正如老師說(shuō)的那樣,課程設(shè)計(jì)非常鍛煉人,每完成一個(gè)項(xiàng)目,不僅是知識(shí)體系的完善和知識(shí)的驗(yàn)證,更是編程技術(shù)的提升,當(dāng)自己編的多了,就會(huì)開(kāi)始摸索編程的捷徑,想著用更高效的方法去完成一個(gè)個(gè)項(xiàng)目,就這樣在一次次的鍛煉中自己會(huì)從一個(gè)菜鳥(niǎo)迅速的成長(zhǎng),終將成為一個(gè)優(yōu)秀的軟件工程師。</p><p> 一個(gè)成功的項(xiàng)目必須在寫(xiě)代碼前,先要對(duì)課題有充分的思考和規(guī)
37、劃,否則即使完成了項(xiàng)目也會(huì)浪費(fèi)很多的時(shí)間和精力,我認(rèn)為科學(xué)合理的編程方法是我這次課程設(shè)計(jì)的最大收獲。</p><p><b> 六、源程序</b></p><p> #include<iostream></p><p> #include<fstream></p><p> #includ
38、e"heads.h"</p><p> #define NULL 0</p><p> #define MAXVALUE 10000 //最大權(quán)值</p><p> #define MAXLEAF 100 //葉子結(jié)點(diǎn)個(gè)數(shù)</p><p> #define MAXNOD
39、E MAXLEAF*2-1 //哈夫曼樹(shù)結(jié)點(diǎn)個(gè)數(shù)</p><p> #define MAXBIT 12 //最大長(zhǎng)度</p><p> using namespace std;</p><p><b> int num;</b></p><p> int power(int
40、 x)//2的x次方</p><p><b> {</b></p><p><b> int i;</b></p><p> for(i=1;i<=x;i++)</p><p><b> {</b></p><p><b> i
41、*=2;</b></p><p><b> }</b></p><p><b> return i;</b></p><p><b> }</b></p><p> float pration(int a,int b)//計(jì)算壓縮率,a為壓縮前字長(zhǎng),b為壓縮
42、后字長(zhǎng)</p><p><b> {</b></p><p><b> float s;</b></p><p> s=(float)((float)b/(float)a);</p><p><b> return s;</b></p><p>
43、<b> }</b></p><p> void Show(LinkList l) //輸出</p><p><b> {</b></p><p> LinkList p=l->next;</p><p><b> while(p)</b></p>
44、<p><b> {</b></p><p> cout<<p->data ;</p><p> p=p->next;</p><p><b> }</b></p><p> cout<<endl;</p><p>&
45、lt;b> }</b></p><p> LinkList Create() //寫(xiě)入字符串</p><p><b> {</b></p><p> int total=0;</p><p> int x=1,y;</p><p><b> int p
46、=0;</b></p><p> LinkList l,p1,p2;</p><p> l=new LNode;</p><p> l->next=NULL;</p><p> cout<<"請(qǐng)輸入:"<<endl<<endl;</p><p
47、> cout<<"1.輸入并存入文檔\n2.從文檔讀取,并計(jì)算出壓縮率!"<<endl<<endl;</p><p> cout<<"請(qǐng)輸入要進(jìn)行的操作:"<<endl;</p><p> int choose;</p><p> cin>>
48、choose;</p><p> if(choose!=1&&choose!=2)</p><p><b> {</b></p><p> cout<<"輸入錯(cuò)誤,請(qǐng)重新輸入!"<<endl;</p><p> cin>>choose;<
49、;/p><p><b> }</b></p><p> if(choose==1)</p><p><b> {</b></p><p> ofstream outfile;</p><p> outfile.open("code.txt",ios
50、::out);</p><p> if(!outfile)</p><p><b> {</b></p><p> cout<<"輸出時(shí)打開(kāi)code文檔出錯(cuò)!"<<endl;</p><p><b> exit(1);</b></p>
51、<p><b> }</b></p><p> cout<<"請(qǐng)輸入所要編譯的字符串,以#結(jié)束:"<<endl;</p><p> p1=new LNode;</p><p><b> p2=l;</b></p><p> cin&g
52、t;>p1->data;outfile<<p1->data;</p><p> while(p1->data!='#')</p><p><b> {</b></p><p> p2->next=p1;</p><p><b> p2=p1;&
53、lt;/b></p><p> p1=new LNode;</p><p> cin>>p1->data;outfile<<p1->data;</p><p><b> }</b></p><p> p2->next=NULL;</p><p&g
54、t;<b> p2=l;</b></p><p><b> return l;</b></p><p><b> }</b></p><p><b> else{</b></p><p> ifstream infile("wenjia
55、n.txt",ios::in);</p><p> if(!infile)</p><p><b> {</b></p><p> cout<<"輸出時(shí)打開(kāi)文檔出錯(cuò)!\n或文檔不存在!"<<endl;</p><p> cout<<"請(qǐng)確
56、認(rèn)本目錄下有相關(guān)文件后再重試!"<<endl;</p><p><b> exit(1);</b></p><p><b> }</b></p><p> l=Read("wenjian.txt");</p><p> p1=new LNode;&l
57、t;/p><p><b> p2=l;</b></p><p> infile>>p1->data;</p><p> while(infile.eof())</p><p><b> {</b></p><p> p2->next=p1;<
58、;/p><p><b> p2=p1;</b></p><p> p1=new LNode;</p><p> infile>>p1->data;</p><p><b> }</b></p><p> p1->data='#';
59、</p><p> p1->next=NULL;</p><p> infile.close();</p><p> printf("讀取完成!\n");</p><p><b> Show(l);</b></p><p> /*****************
60、以下計(jì)算壓縮率*******************/</p><p><b> p2=l;</b></p><p><b> while(p2)</b></p><p><b> {</b></p><p><b> total++;</b>&l
61、t;/p><p> p2=p2->next;</p><p><b> }</b></p><p> for(;power(x)<total;)</p><p><b> {</b></p><p><b> x++;</b></
62、p><p> p=x; //記錄正常編碼一個(gè)字符需要的比特位數(shù)</p><p><b> }</b></p><p> y=(total-1)*x;//正常所需的總比特?cái)?shù)</p><p> printf("y is %d\n",y);</p><p> /*****
63、******編碼后的位數(shù)計(jì)算********************/</p><p><b> int c;</b></p><p><b> FILE *fp;</b></p><p> if((fp=fopen("Code.txt","rb"))==NULL)</p
64、><p><b> {</b></p><p> printf("文件打開(kāi)失??!\n");</p><p><b> exit(0);</b></p><p><b> }</b></p><p> while(!feof(fp
65、))</p><p><b> {</b></p><p> c=fgetc(fp);</p><p><b> x=x+1;</b></p><p><b> }</b></p><p> printf("x is %d"
66、,x);</p><p> /*****************計(jì)算完成**************************/</p><p> printf("壓縮率為%4.2f%%",pration(y,x)*100);</p><p><b> return l;</b></p><p>
67、<b> }</b></p><p><b> }</b></p><p> void Write(LinkList l,char wenjian[])</p><p><b> {</b></p><p> LinkList p1;</p><p
68、> ofstream outfile(wenjian,ios::out);</p><p> p1=l->next ;</p><p><b> while(p1)</b></p><p><b> {</b></p><p> outfile<<p1->da
69、ta;</p><p> p1=p1->next;</p><p><b> }</b></p><p> outfile<<"#";</p><p> outfile.close();</p><p><b> }</b>&l
70、t;/p><p> LinkList Read(char wenjian[]) //讀文件中字符串</p><p><b> {</b></p><p> LinkList l,p1,p2;</p><p> l=new LNode;</p><p> l->next=NULL;&l
71、t;/p><p> p1=new LNode;</p><p><b> p2=l;</b></p><p> ifstream infile(wenjian,ios::in);</p><p> if(!infile)</p><p><b> {</b></p
72、><p> cout<<"打開(kāi)文檔出錯(cuò)!\n或文檔不存在!"<<endl;</p><p> cout<<"請(qǐng)確認(rèn)本目錄下有相關(guān)文件后再重試!"<<endl;</p><p><b> exit(1);</b></p><p>&l
73、t;b> }</b></p><p> infile>>p1->data;</p><p> while(p1->data!='#')</p><p><b> {</b></p><p> p2->next=p1;</p><
74、p><b> p2=p1;</b></p><p> p1=new LNode;</p><p> infile>>p1->data;</p><p><b> }</b></p><p> p2->next=NULL;</p><p>
75、; infile.close();</p><p><b> return l;</b></p><p><b> }</b></p><p> void Create(HNodeType a[MAXNODE],LinkList l) //統(tǒng)計(jì)字符個(gè)數(shù),做出哈夫曼樹(shù)的結(jié)點(diǎn) </p>
76、<p><b> {</b></p><p> LinkList p;</p><p><b> int i;</b></p><p> p=l->next ;</p><p> //全局變量num在這里的作用</p><p><b>
77、 while(p)</b></p><p><b> {</b></p><p> for(i=0;i<num;i++)</p><p> if(a[i].data==p->data)</p><p><b> {</b></p><p>
78、 a[i].weight++;</p><p><b> break; </b></p><p><b> }</b></p><p> if(i==num)</p><p><b> {</b></p><p> a[i].data=p-&g
79、t;data;</p><p> a[i].weight=1;</p><p><b> num++;</b></p><p><b> }</b></p><p> p=p->next;</p><p><b> }</b></p
80、><p> //printf("num is %d ",num);可以看到num在這里的作用</p><p> for(i=0;i<num;i++)</p><p><b> {</b></p><p> a[i].lchild=NULL;</p><p> a[i
81、].rchild=NULL;</p><p> a[i].parent=-1;</p><p><b> }</b></p><p><b> }</b></p><p> void HaffmanTree(HNodeType HuffNode[MAXNODE]) //構(gòu)造哈夫曼樹(shù)
82、</p><p><b> {</b></p><p> int i,j,m1,m2,x1,x2;</p><p> for(i=0;i<MAXNODE;i++)</p><p><b> {</b></p><p> HuffNode[i].parent=-
83、1;</p><p> HuffNode[i].lchild=-1;</p><p> HuffNode[i].rchild=-1;</p><p><b> }</b></p><p> for(i=0;i<num-1;i++)</p><p><b> {</b
84、></p><p> m1=m2=MAXVALUE;</p><p><b> x1=x2=0;</b></p><p> for(j=0;j<num+i;j++)</p><p><b> {</b></p><p> if(HuffNode[j].p
85、arent==-1&&HuffNode[j].weight<m1)</p><p><b> {</b></p><p><b> m2=m1;</b></p><p><b> x2=x1;</b></p><p> m1=HuffNode[j]
86、.weight;</p><p><b> x1=j;</b></p><p><b> }</b></p><p><b> else</b></p><p> if(HuffNode[j].parent==-1&&HuffNode[j].weight
87、<m2)</p><p><b> {</b></p><p> m2=HuffNode[j].weight;</p><p><b> x2=j;</b></p><p><b> }</b></p><p><b> }&l
88、t;/b></p><p> HuffNode[x1].parent=num+i;</p><p> HuffNode[x2].parent=num+i;</p><p> HuffNode[num+i].weight=HuffNode[x1].weight+HuffNode[x2].weight;</p><p> HuffN
89、ode[num+i].lchild=x1;</p><p> HuffNode[num+i].rchild=x2;</p><p><b> }</b></p><p><b> }</b></p><p><b> //哈夫曼編碼</b></p><
90、;p> LinkList Bianma(LinkList l,Code code[MAXNODE]) //寫(xiě)編碼文件</p><p><b> {</b></p><p> LinkList p,q,p1,p2;</p><p><b> int i,j;</b></p><p>
91、 p=l->next ;</p><p> q=new LNode;</p><p> q->next=NULL;</p><p> p1=new LNode;</p><p><b> p2=q;</b></p><p><b> while(p)</b&g
92、t;</p><p><b> {</b></p><p> for(i=0;i<num;i++)</p><p> if(p->data==code[i].data)</p><p><b> { </b></p><p><b> j
93、=0;</b></p><p> while(code[i].bit[j]!='\0')</p><p><b> {</b></p><p> p1->data=code[i].bit[j];</p><p><b> j++;</b></p>
94、<p> p2->next=p1;</p><p><b> p2=p1;</b></p><p> p1=new LNode;</p><p><b> }</b></p><p><b> }</b></p><p>
95、 p=p->next ;</p><p><b> }</b></p><p> p2->next=NULL;</p><p><b> return q;</b></p><p><b> }</b></p><p> SeqSt
96、ack Init()</p><p><b> {</b></p><p> SeqStack s;</p><p> s=new StackNode;</p><p> s->top=-1;</p><p><b> return s;</b></p&
97、gt;<p><b> }</b></p><p> void HaffmanCode(HNodeType HuffNode[MAXNODE],HCodeType HuffCode[MAXLEAF]) //哈夫曼編碼算法</p><p><b> {</b></p><p> int i,j,c,p;
98、</p><p> HCodeType cd;</p><p> for(i=0;i<num;i++)</p><p><b> {</b></p><p> cd.start=MAXBIT-1;</p><p><b> c=i;</b></p>
99、<p> p=HuffNode[c].parent ;</p><p> while(p!=-1)</p><p><b> {</b></p><p> if(HuffNode[p].lchild==c)</p><p> cd.bit[cd.start]='0';</p&
100、gt;<p><b> else</b></p><p> cd.bit[cd.start]='1';</p><p> cd.start --;</p><p><b> c=p;</b></p><p> p=HuffNode[c].parent;<
101、/p><p><b> }</b></p><p> for(j=cd.start+1;j<MAXBIT;j++)</p><p> HuffCode[i].bit[j]=cd.bit[j];</p><p> HuffCode[i].start=cd.start ;</p><p>&
102、lt;b> }</b></p><p><b> }</b></p><p> void bianma(HCodeType HuffCode[MAXLEAF],HNodeType a[MAXNODE],Code code[MAXNODE]) //字符編碼</p><p><b> {</
103、b></p><p> int i,j,k;</p><p> for(i=0;i<num;i++)</p><p><b> { </b></p><p> code[i].data=a[i].data;</p><p> for(j=HuffCode[i].start
104、+1,k=0;j<MAXBIT;j++,k++)</p><p><b> {</b></p><p> code[i].bit[k]=HuffCode[i].bit[j];</p><p><b> }</b></p><p> code[i].bit[k]='\0'
105、;</p><p><b> }</b></p><p><b> }</b></p><p> int panduan(char a[MAXBIT],char b[MAXBIT])</p><p><b> {</b></p><p> if
106、(strcmp(a,b)==0)</p><p><b> return 1;</b></p><p><b> else</b></p><p><b> return 0;</b></p><p><b> }</b></p>&
107、lt;p> void bianma(Code code[MAXNODE],LinkList l)//讀取編碼</p><p><b> {</b></p><p> int i,flag;</p><p> SeqStack s;</p><p><b> s=Init();</b>
108、</p><p> LinkList p;</p><p> p=l->next;</p><p><b> while(p)</b></p><p><b> {</b></p><p><b> s->top++;</b><
109、;/p><p><b> flag=0;</b></p><p> s->data[s->top]=p->data;</p><p> s->data[s->top+1]='\0';</p><p> for(i=0;i<num;i++)</p>&l
110、t;p> if(panduan(s->data,code[i].bit)==1)</p><p><b> { </b></p><p> cout<<code[i].data;</p><p><b> flag=1;</b></p><p><b>
111、break;</b></p><p><b> }</b></p><p><b> if(flag)</b></p><p><b> {</b></p><p><b> s=Init();</b></p><
112、p><b> }</b></p><p> p=p->next;</p><p><b> }</b></p><p> cout<<endl;</p><p><b> }</b></p><p> void Sho
113、wTree(HNodeType node[MAXNODE])</p><p> {printf("輸出");</p><p><b> int i;</b></p><p> cout.width(8);</p><p> cout.setf(ios::left);</p>&l
114、t;p> cout<<"統(tǒng)計(jì)字符頻率結(jié)果為:"<<endl;</p><p> cout<<"頻率 ";</p><p> cout.width(8);</p><p> cout<<"字符"<<endl;</p>
115、<p> for(i=0;i<num;i++)</p><p><b> {</b></p><p> cout.width(8);</p><p> cout<<node[i].weight;</p><p> cout.width(8);</p><p>
116、; cout<<node[i].data<<endl;</p><p><b> }</b></p><p> cout<<endl;</p><p> cout<<"哈弗曼樹(shù)編碼為:"<<endl;</p><p> cout&l
117、t;<"字符";</p><p> cout<<" ";</p><p> cout<<"編碼";</p><p> cout<<endl;</p><p><b> }</b></p>&l
118、t;p> void ShowCode(Code cood[MAXNODE])</p><p><b> {</b></p><p> for(int i=0;i<num;i++)</p><p> cout<<cood[i].data<<"\t"<<cood[i].bi
119、t<<endl;</p><p><b> }</b></p><p> void bianma(HNodeType node[MAXNODE],HCodeType code[MAXLEAF],Code CODE[MAXNODE])</p><p><b> {</b></p><p&
120、gt; LinkList l,c;</p><p> l=Create(); //寫(xiě)字符串</p><p> Write(l,"wenjian.txt");</p><p> l=Read("wenjian.txt");</p><p> cout&
121、lt;<"文件內(nèi)容:"<<endl;</p><p><b> Show(l);</b></p><p> Create(node,l); //統(tǒng)計(jì)字符個(gè)數(shù)</p><p> HaffmanTree(node); //構(gòu)造哈夫曼樹(shù)</
122、p><p> ShowTree(node); //輸出哈夫曼樹(shù)</p><p> HaffmanCode(node,code); //哈夫曼編碼算法</p><p> bianma(code,node,CODE); //字符編碼 </p><p> ShowCode(C
123、ODE); //輸出編碼規(guī)則</p><p> c=Bianma(l,CODE);</p><p> cout<<"編碼文件為:"<<endl;</p><p> Show(c); </p><p> Write(c,"Cod
124、e.txt");</p><p><b> }</b></p><p> void yima(Code CODE[MAXNODE])//譯碼</p><p><b> {</b></p><p> LinkList l;</p><p> l=Read(&
125、quot;Code.txt"); //讀取編碼文件</p><p> cout<<"譯碼的文件為:"<<endl;</p><p> Show(l); //顯示編碼文件</p><p> cout<<"譯碼文件為:"<<endl;
126、</p><p> bianma(CODE,l); //譯碼</p><p><b> }</b></p><p> int Menu_Select()</p><p><b> {</b></p><p><b> int i;</b
127、></p><p> cout<<"1.編碼信息\n2.譯碼信息\n0.退出程序"<<endl;</p><p> cout<<"請(qǐng)選擇要進(jìn)行的操作:"<<endl;</p><p><b> cin>>i;</b></p>
128、;<p> while(i<0||i>2)</p><p><b> {</b></p><p> cout<<"輸入錯(cuò)誤!請(qǐng)重新輸入:";</p><p><b> cin>>i;</b></p><p><b&g
129、t; }</b></p><p><b> return i;</b></p><p><b> }</b></p><p> int main()</p><p><b> {</b></p><p> HNodeType no
130、de[MAXNODE];//哈夫曼節(jié)點(diǎn)數(shù)組</p><p> HCodeType Huffcode[MAXLEAF];//</p><p> Code code[MAXNODE];</p><p> cout<<"***************************************************************
131、**"<<endl;</p><p> cout<<"**************歡迎進(jìn)入Huffman樹(shù)編碼與譯碼系統(tǒng)********************"<<endl;</p><p><b> while(1)</b></p><p><b> {<
132、;/b></p><p> switch(Menu_Select())</p><p><b> {</b></p><p> case 1:bianma(node,Huffcode,code);break;</p><p> case 2:yima(code);break;</p><
溫馨提示
- 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ì)報(bào)告---赫夫曼編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) (赫夫曼編碼)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--赫夫曼編碼系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---- 赫夫曼編碼系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--赫夫曼編碼系統(tǒng)
- 赫夫曼編碼器數(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í)驗(yàn)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)實(shí)踐環(huán)節(jié)實(shí)驗(yàn)報(bào)告(課程設(shè)計(jì))
- 06年數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- 《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)》航班查詢(xún)系統(tǒng)實(shí)驗(yàn)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----huffman編碼
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告---有關(guān)查找的操作
- 數(shù)據(jù)結(jié)構(gòu)各種排序算法的課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---前綴編碼問(wèn)題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)圖書(shū)管理系統(tǒng)實(shí)驗(yàn)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)avl樹(shù)實(shí)現(xiàn)及其分析實(shí)驗(yàn)報(bào)告
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告--多種排序方式的比較
- 數(shù)據(jù)結(jié)構(gòu)-鄰接表存儲(chǔ)及遍歷-課程設(shè)計(jì)-實(shí)驗(yàn)報(bào)告
評(píng)論
0/150
提交評(píng)論