版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 數(shù)據(jù)結構課程設計報告</p><p> 利用線性表進行算式計算</p><p><b> 一:問題描述:</b></p><p> 在計算機中,算術表達式由常量、變量、運算符號和括號組成,由于不同的運算符具有不同的優(yōu)先級,又要考慮到括號,因此,算術表達式的求值不可能嚴格地從左往右進行,因而在程序設計時,借助棧實現(xiàn)。&
2、lt;/p><p> 算法要點:設置運算符棧和運算數(shù)隊列輔助分析算符優(yōu)先關系,在讀入表達式的字符序列的同時,完成運算符和運算數(shù)的識別處理,以及相應運算。</p><p><b> 二:需求分析</b></p><p> 1、輸入的形式和輸入值的范圍</p><p> 一個算術表達式,由常量、變量、運算符和括號組成(以
3、字符串的形式輸入)。為簡化,規(guī)定操作數(shù)只能為整數(shù),操作符為“+”、“-”、“*”、“/”、“%”,用“#”開始且用“#”結束,優(yōu)先級為:括號--%--*,/--+,-。</p><p><b> 2、輸出的形式</b></p><p> 即輸出表達式運算結果,本算法中輸出的形式為The end is:.....</p><p> 3、程序
4、所能達到的功能</p><p> 界面上出現(xiàn)一個文本框,輸入一個表達式(以“#”開始并以“#”結束,此表達式包括“+”、“-”、“*”、“/”、“%”、括號以及整數(shù)),點擊回車,顯示結果。</p><p><b> 4、測試結果</b></p><p> 正確的輸入一個表達式是指輸入一個正確的表達式即不能連續(xù)輸入兩個運算符(括號除外),切
5、以“#”開始以“#”結束,點擊回車界面上出現(xiàn)The end is:……即此表達式的結果。</p><p> 輸入表達式錯誤有兩種形式:</p><p> (1)、所輸入的表達式未以“#”開始則點擊回車,系統(tǒng)會提示“RROE!Please begin with "#“,“且下面輸出”Continue?(y/n):“,若輸入Y或者y,則再次進入主界面輸入表達式,若輸入N或者n,則
6、跳出系統(tǒng)。</p><p> ?。?)、所輸入的表達式錯誤,即連續(xù)輸入兩個運算符,此時系統(tǒng)會提示“ERROE!Please input another time!“,</p><p><b> 三:概要設計 </b></p><p><b> 主程序的流程圖為</b></p><p><
7、;b> 四:詳細設計</b></p><p> 1、本系統(tǒng)中所用到的抽象數(shù)據(jù)類型有棧的抽象數(shù)據(jù)類型以及隊列的抽象數(shù)據(jù)類型。</p><p> 棧的抽象數(shù)據(jù)類型定義:</p><p> ADT Stack{</p><p> 數(shù)據(jù)對象:D={ai| ai ∈ElemSet,i=1,2,3……n,n≥0}</p&
8、gt;<p> 數(shù)據(jù)關系:R1={ <ai-1, ai ∈D,i=2,3……n}</p><p><b> 基本操作:</b></p><p> InitStack(&S)</p><p> 操作結果:構造一個空棧</p><p> DestoryStack(&S)</
9、p><p> 初始條件:棧S已存在。</p><p> 操作結果:棧S被銷毀。</p><p> ClearStack(&S)</p><p> 初始條件:棧S已存在。</p><p> 操作結果:將S清為空棧。</p><p> StackEmpty(&S)</p
10、><p> 初始條件:棧S已存在。</p><p> 操作結果:若棧S為空棧,則返回TRUE,否則返回FALSE。</p><p> StackLength(&S)</p><p> 初始條件:棧S已存在。</p><p> 操作結果:返回S的元素個數(shù),即棧的長度。</p><p>
11、; GetTop(S,&e)</p><p> 初始條件:棧S已存在且非空。</p><p> 操作結果:用e返回S的棧頂元素。</p><p> Push(S,&e)</p><p> 初始條件:棧S已存在。</p><p> 操作結果:插入元素e為新的棧頂元素。</p>&
12、lt;p><b> Pop(S,&e)</b></p><p> 初始條件:棧S已存在且非空。</p><p> 操作結果:刪除S的棧頂元素,并用e返回其值。</p><p> StackTraverse(S,visit())</p><p> 初始條件:棧S已存在且非空。</p>
13、<p> 操作結果:從棧底到棧頂一次對S的每個元素調(diào)用函數(shù)visit()。一旦visit()失敗,則操作失敗。</p><p> }ADT stack</p><p> 隊列的抽象數(shù)據(jù)類型定義:</p><p> ADT Queue{</p><p> 數(shù)據(jù)對象:D={ai| ai ∈ElemSet,i=1,2,3……n,
14、n≥0}</p><p> 數(shù)據(jù)關系:R1={ <ai-1, ai ∈D,i=2,3……n}</p><p> 約定其中ai端為隊列頭,an端為隊列尾</p><p><b> 基本操作:</b></p><p> InitQueue(&Q)</p><p> 操作結果:構
15、造一個空隊列Q。</p><p> DestoryQueue(&Q)</p><p> 初始條件:隊列Q已存在。</p><p> 操作結果:隊列Q被銷毀。</p><p> ClearQueue(&Q)</p><p> 初始條件:隊列Q已存在。</p><p>
16、操作結果:將Q清為空隊列。</p><p> QueuekEmpty(&Q)</p><p> 初始條件:隊列Q已存在。</p><p> 操作結果:若隊列Q為空棧,則返回TRUE,否則返回FALSE。</p><p> QueueLength(Q)</p><p> 初始條件:隊列Q已存在。<
17、/p><p> 操作結果:返回Q的元素個數(shù),即隊列的長度。</p><p> GetHead(Q,&e)</p><p> 初始條件:隊列Q已存在且非空。</p><p> 操作結果:用e返回Q的隊頭元素。</p><p> EnQueue(Q,&e)</p><p>
18、初始條件:隊列Q已存在。</p><p> 操作結果:插入元素e為新的隊尾元素。</p><p> DeQueue(Q,&e)</p><p> 初始條件:隊列Q已存在且非空。</p><p> 操作結果:刪除Q的隊頭元素,并用e返回其值。</p><p> QueueTraverse(Q,visit
19、())</p><p> 初始條件:Q已存在且非空。</p><p> 操作結果:從隊頭到隊尾一次對Q的每個元素調(diào)用函數(shù)visit()。一旦visit()失敗,則操作失敗。</p><p> }ADT queue</p><p><b> 2、主要算法流程圖</b></p><p> 算
20、符間的優(yōu)先關系為如下圖,其中#代表表達式的結束符,為了算法簡潔,在表達式的最左邊也虛設一個“#“構成整個表達式的一對括號。</p><p> 3、各模塊間的層次調(diào)用</p><p><b> ?。?).算法思路 </b></p><p> a.若導入的是操作數(shù),則直接輸出到隊列。</p><p> b.若當前運算符
21、的優(yōu)先級高于棧頂運算符的優(yōu)先級,則入棧。</p><p> c.若當前運算符的優(yōu)先級低于棧頂運算符的優(yōu)先級,則棧頂運算符退棧,并輸出到隊列,當前運算符再與新的棧頂運算符比較。</p><p> d.若當前運算符的優(yōu)先級等于棧頂運算符的優(yōu)先級,且棧頂運算符為左括號,當前運算符為右括號,則棧頂運算符退棧,繼續(xù)讀下一個符號。</p><p> e.若當前運算符的優(yōu)先
22、級等于棧頂運算符的優(yōu)先級,且棧頂運算符為“#“,當前運算符也為”#“,則棧頂運算符退棧,輸出隊列中的數(shù)值即可。</p><p> ?。?).各個函數(shù)的含義</p><p> 頭函數(shù)結束以后用typedef struct snode{ }定義棧的結構體,void initiatels(slnode *h){ }此函數(shù)是對棧的初始化,即構造一個空棧,void pushls( slnode *
23、h,char *x){ }、char *popls( slnode *h,char *x){ },分別是進棧出棧函數(shù)的實現(xiàn)。typedef struct qnode{ }隊列的結構體定義,typedef struct{ }此函數(shù)是對隊列的初始化,即構造一個空隊列,void initiatelq(lqtype *q){ }、void enterlq(lqtype *q,char *x){ },分別是入隊列以及出隊列的實現(xiàn)。這就是函數(shù)模塊的
24、實現(xiàn),除此之外在主函數(shù)main()函數(shù)中利用函數(shù)while(c!=“#“){ }即可獲取屏幕上輸入的字符,數(shù)據(jù)和運算符并分別將其存放在結點中,利用函數(shù)while(x【0】!=35){ }來判斷x進入符號棧還是隊列,enterlq(operand,x);說明x是數(shù)據(jù)則進入隊列,利用函數(shù)if(a<=b){ }判斷如果x的優(yōu)先級大于當前棧頂元素的優(yōu)</p><p><b> 五:調(diào)試分析</b&
25、gt;</p><p> 本實驗要調(diào)試成功在此之前肯定遇到很多困難經(jīng)常會出現(xiàn)一些說明語法錯誤以及出現(xiàn)一些語法錯誤等各種各樣的問題,此時要檢查自己的代碼,找到自己代碼的問題所在,不折不撓多次調(diào)試即可。</p><p> 本實驗的時間復雜度是O(n),空間復雜度為O(n)。此實驗是利用一個棧和一個隊列,可以改進為兩個棧的運算,一個棧存放運算符,另外一個棧存放運算數(shù)據(jù)。</p>
26、<p> 本實驗算法采用了鏈式存儲結構,以開辟新空間為代價,有效降低了算法時間復雜度和空間復雜度,并且對表達式的長度沒有要求。</p><p><b> 六:測試結果</b></p><p> 調(diào)試成功后進入的頁面為</p><p><b> 輸入正確的表達式后</b></p><p
27、> 點擊y重新進入主頁面</p><p> 若輸入錯誤的表達式后</p><p><b> 七:附錄</b></p><p><b> 源程序</b></p><p> #include<stdio.h></p><p> #include &l
28、t;conio.h></p><p> #include<stdlib.h></p><p> #include<math.h></p><p> #include<string.h></p><p> #include<graphics.h></p><p&g
29、t; #define null 0</p><p> typedef struct snode //定義結構體</p><p><b> {</b></p><p> char data[11];</p><p> struct snode *next;</p><p><b&g
30、t; }slnode;</b></p><p> void initiatels(slnode *h) //初始化</p><p><b> {</b></p><p> h->next = null;</p><p> }void pushls( slnode *h,char *x) //壓
31、棧</p><p><b> {</b></p><p> slnode *p;</p><p> p = (slnode *)malloc(sizeof(slnode));</p><p> strcpy(p->data,x);</p><p> p->next = h-&
32、gt;next;</p><p> h->next = p;</p><p><b> }</b></p><p> char *popls( slnode *h,char *x) //出棧</p><p><b> {</b></p><p> slnod
33、e *p;</p><p> p = h->next;</p><p> if(p!=null)</p><p><b> {</b></p><p> h->next = p->next;</p><p> return(p->data);</p>
34、<p><b> }</b></p><p> return(x);</p><p><b> }</b></p><p> typedef struct qnode //定義鏈隊列結構體</p><p><b> {</b></p>&l
35、t;p> char data[11];</p><p> struct qnode *next;}qlnode;</p><p> typedef struct</p><p><b> {</b></p><p> qlnode *h;</p><p> qlnode *rea
36、r;</p><p><b> }lqtype;</b></p><p> void initiatelq(lqtype *q) //初始化</p><p><b> {</b></p><p> q->rear = q->h;</p><p> q-
37、>h->next = null;</p><p><b> }</b></p><p> void enterlq(lqtype *q,char *x) //入隊</p><p><b> {</b></p><p> qlnode *p;</p><p&g
38、t; p = (qlnode *)malloc(sizeof(qlnode));//申請新結點</p><p> strcpy(p->data,x); //新結點數(shù)據(jù)域賦值</p><p> p->next = null;</p><p> if(q->h==null)</p><p><b> q-&g
39、t;h = p;</b></p><p> q->rear->next = p;</p><p> q->rear = p; //修改尾指針</p><p><b> }</b></p><p> char *deletelq(lqtype *q,char *x) //出隊<
40、/p><p><b> {</b></p><p> qlnode *p;</p><p> p = q->h->next; // 暫存原隊頭指針</p><p> if(q->h->next!=null) //隊非空</p><p> { q->h-
41、>next=p->next; //刪除隊頭元素</p><p> if(q->h->next==null)</p><p> q->rear->next=null;</p><p> return(p->data);</p><p><b> }</b></p&g
42、t;<p> return(x);</p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p> char ch[8]={'#','+','-','
43、;*','/','%','(',')'};</p><p> char c,cc, x[11],y[11],z[11];</p><p> int i,j,a,b,n;</p><p><b> int t;</b></p><p> sln
44、ode *operater,*pp;</p><p> lqtype *mid,*operand;</p><p> qlnode *ee;</p><p><b> int mm;</b></p><p> operater = (slnode *)malloc(sizeof(slnode));</p&g
45、t;<p> mid = (lqtype *)malloc(sizeof(lqtype));</p><p> mid->h = (qlnode *)malloc(sizeof(qlnode));</p><p> mid->rear = (qlnode *)malloc(sizeof(qlnode));</p><p> oper
46、and = (lqtype *)malloc(sizeof(lqtype));</p><p> operand->h = (qlnode*)malloc(sizeof(qlnode));</p><p> operand->rear = (qlnode *)malloc(sizeof(qlnode));</p><p> textmode(C80
47、);</p><p> textbackground(3);</p><p><b> clrscr();</b></p><p> window(8,8,70,18);</p><p> textbackground(7);</p><p> textcolor(18);</p&
48、gt;<p><b> clrscr();</b></p><p><b> while(1)</b></p><p> { //初始化</p><p> initiatelq(mid);</p><p> initiatels(operater);&l
49、t;/p><p> initiatelq(operand);</p><p><b> j = 0;</b></p><p><b> a = 0;</b></p><p><b> b = 0;</b></p><p><b> n =
50、 0;</b></p><p> for(i=0;i<11;i++)</p><p> x[i]='\0';</p><p><b> clrscr();</b></p><p> cprintf( "\nPlease input the biaodashi(begin
51、 by\"#\"from left and stop by\"#\"from right)\n");</p><p> cprintf("\nThe string is:");</p><p> c = getchar();</p><p><b> x[0]=c;</b&g
52、t;</p><p> enterlq(mid,x); //將“#“進隊</p><p> c=getchar();</p><p><b> x[0]=c;</b></p><p><b> j=1;</b></p><p> c=getchar();</
53、p><p> while(c!='#') //獲取屏幕上輸入的字符,數(shù)據(jù)和運算符分別存放在結點中</p><p><b> {</b></p><p> if(c<48&&c!=46)</p><p><b> {</b></p><p
54、> if(x[0]!=0)</p><p><b> {</b></p><p> enterlq(mid,x);</p><p> for(i = 0;i < 11;i++)</p><p> x[i]='\0';</p><p><b> j
55、= 0;</b></p><p><b> continue;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p>&l
56、t;b> x[0] = c;</b></p><p><b> j = 1;</b></p><p> ee=mid->rear;</p><p> if(ee->data[0]!='(')</p><p><b> {</b></p&g
57、t;<p> enterlq(mid,x);</p><p> for(i = 0;i < 11;i++)</p><p> x[i]='\0';</p><p><b> j=0;</b></p><p><b> }</b></p>&
58、lt;p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> x[j] = c;</b></p&
59、gt;<p><b> j++;</b></p><p><b> }</b></p><p> c=getchar();</p><p><b> }</b></p><p> if(x[0]!=0)</p><p><b
60、> {</b></p><p> enterlq(mid,x);</p><p> for(i = 0; i < 11;i++)</p><p> x[i]='\0';</p><p><b> }</b></p><p><b> x
61、[0] = c;</b></p><p> enterlq(mid,x);</p><p> for(i = 0;i <11; i++)</p><p> x[i]='\0';</p><p> getchar();</p><p> ee = mid->h->n
62、ext; //表達式合法性檢驗</p><p> if(ee->data[0]!='#')</p><p><b> {</b></p><p> printf("\n ERROE!Please begin with \"#\"\n");</p>
63、<p> printf(" Continue?(y/n):",x);</p><p> cc = getchar();</p><p> getchar();</p><p> if(cc =='n'||cc=='N')</p><p><b>
64、 break;</b></p><p><b> else</b></p><p> if(cc =='y'||cc=='Y')</p><p><b> continue;</b></p><p><b> }</b><
65、;/p><p> while(ee->next!=null)</p><p><b> {</b></p><p> if(strlen(ee->data)==1&&ee->data[0]=='(')</p><p><b> a++;</b>&
66、lt;/p><p> if(strlen(ee->data)==1&&ee->data[0]==')')</p><p><b> b++;</b></p><p> if(strlen(ee->data)==1&&strlen(ee->next->data)==&
67、lt;/p><p> 1&&ee->data[0]<48&&ee->next->data[0]<48&&ee-></p><p> data[0]!=41&&ee->data[0]!=40&&ee->next->data[0]!=</p>&l
68、t;p> 41&&ee->next->data[0]!=40)</p><p><b> {</b></p><p><b> n=1;</b></p><p><b> break;</b></p><p><b> }&
69、lt;/b></p><p> ee = ee->next;</p><p><b> }</b></p><p> if(a!=b||n!=0)</p><p><b> {</b></p><p> printf("\n
70、 ERROE!Please input another time!");</p><p> printf("\n Continue?(y/n):",x);</p><p> cc = getchar();</p><p> getchar();</p><p> if(cc ==
71、9;n'||cc=='N')</p><p><b> break;</b></p><p><b> else</b></p><p> if(cc =='y'||cc=='Y')</p><p><b> continue
72、;</b></p><p><b> }</b></p><p> strcpy(x,deletelq(mid,z));</p><p> pushls(operater,x); //將“#“進入符號棧</p><p> strcpy(x,deletelq(mid,z));//依次將mid出隊<
73、;/p><p> while (x[0]!=35)//判斷x進入符號棧還是進入隊列</p><p><b> {</b></p><p> if(x[0]>47||x[1]>47)</p><p> enterlq(operand,x);//x是數(shù)據(jù)則進入隊列</p><p>
74、else if(x[0]!=41)</p><p><b> {</b></p><p> pp=operater->next;</p><p> strcpy(y,pp->data);</p><p> while(y[0]!=40)</p><p><b> {
75、</b></p><p> for(i=6;i>=0;i--)</p><p><b> {</b></p><p> if(ch[i]==x[0])</p><p><b> a=i;</b></p><p> if(ch[i]==y[0])&l
76、t;/p><p><b> b=i;</b></p><p><b> }</b></p><p><b> if(a<=b)</b></p><p><b> {</b></p><p> enterlq(operan
77、d,popls(operater,z));</p><p> pp=operater->next;</p><p> strcpy(y,pp->data);</p><p><b> continue;</b></p><p> } //如果x的優(yōu)先級大于當前棧頂元素的優(yōu)先級,則進棧</p&g
78、t;<p> pushls(operater,x);</p><p><b> break;</b></p><p><b> }</b></p><p> if(y[0]==40)</p><p><b> {</b></p><p
79、> pushls(operater,x);</p><p> strcpy(x,deletelq(mid,z));</p><p><b> continue;</b></p><p><b> }</b></p><p> } //x是“)“,則依次輸出符號棧的元素,放進隊列中,
80、知道遇到”(“為止</p><p><b> else</b></p><p><b> {</b></p><p> pp=operater->next;</p><p> strcpy(y,pp->data);</p><p> while(y[0]
81、!=40)</p><p><b> {</b></p><p> enterlq(operand,popls(operater,z));</p><p> pp=operater->next;</p><p> strcpy(y,pp->data);</p><p><
82、b> }</b></p><p> strcpy(y,popls(operater,z));</p><p><b> }</b></p><p> strcpy(x,deletelq(mid,z));</p><p><b> }</b></p><
83、p> pp=operater->next;</p><p> strcpy(y,pp->data);</p><p> //mid為空后,一次輸出符號棧的元素至隊列中,直到遇到“#“為止</p><p> while (y[0]!=35)</p><p><b> {</b></p>
84、;<p> enterlq(operand,popls(operater,z));</p><p> pp=operater->next;</p><p> strcpy(y,pp->data);</p><p> }//最終operand為后綴表達式</p><p> ee=operand->h-&
85、gt;next;//求出后綴表達式的值</p><p> while(operand->h->next->next!=null)</p><p><b> {</b></p><p> strcpy(x,ee->data);</p><p> strcpy(y,ee->next-&g
86、t;data);</p><p> if(ee->next->next!=null)</p><p> strcpy(z,ee->next->next->data);</p><p><b> else</b></p><p><b> {</b></p&
87、gt;<p> ee=operand->h->next;</p><p><b> continue;</b></p><p><b> }</b></p><p> if((x[0]>47||x[1]>47)&&(y[0]>47||y[1]>47)
88、&&(z[0]<</p><p> 48&&strlen(z)==1))</p><p><b> {</b></p><p> switch(z[0])</p><p><b> {</b></p><p> case
89、9;+':mm=atof(x)+atof(y);</p><p><b> break;</b></p><p> case '-':mm=atof(x)-atof(y);</p><p><b> break;</b></p><p> case '*
90、9;:mm=atof(x)*atof(y);</p><p><b> break;</b></p><p> case '/':mm=atof(x)/atof(y);</p><p><b> break;</b></p><p> case '%':mm=
91、atoi(x)%atoi(y);</p><p><b> break;</b></p><p><b> }</b></p><p> strcpy(ee->data,gcvt(mm,11,z)); ee->next=ee->next->n
92、ext->next;</p><p> ee=operand->h->next;</p><p><b> continue;</b></p><p><b> }</b></p><p> if(ee->next->next!=null)</p>
93、<p> ee=ee->next;</p><p><b> else</b></p><p> ee=operand->h->next;</p><p><b> }</b></p><p> strcpy(x,deletelq(operand,z)); /
94、/輸出最終結果</p><p> printf("\n The end:%s\n",x);</p><p> printf(" Continue?(y/n)",x);</p><p> cc=getchar();</p><p> getchar();</
95、p><p> if(cc=='n'||cc=='N')</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> 利用樹進行哈弗曼編
96、碼</p><p><b> 一:問題描述</b></p><p> 利用哈弗曼編碼進行通信可以大大提高信道的利用率,縮短信息傳輸時間,降低傳輸成本,但是,這要求發(fā)送端通過一個編碼系統(tǒng)對待傳數(shù)據(jù)預先編碼,在接收端將傳來的數(shù)據(jù)進行譯碼,對于雙工通道(即可以雙向傳輸?shù)男诺溃?,每端都要有一個完整的編碼譯碼系統(tǒng),因此可以設計一個編碼譯碼系統(tǒng)解決這樣一個問題。</p&
97、gt;<p><b> 二:實驗內(nèi)容</b></p><p> 文件conf.txt中保存了若干字母及其出現(xiàn)的頻度,要求所有頻度加起來要為1,否則載入時報錯。字母及其頻度保存的格式為:</p><p><b> a:0.1</b></p><p><b> b:0.2</b>&l
98、t;/p><p><b> c:0.3</b></p><p><b> ……</b></p><p> 界面上,首先出現(xiàn)一個按鈕,點擊,載入conf.txt。然后輸入一個字符串,由這些字母組成。點擊按鈕,顯示哈夫曼編碼的結果。同時,界面上如果輸入哈夫曼編碼,也能被翻譯成相應的字母。如果輸入格式錯誤,要求給予提示。<
99、;/p><p><b> 三:概要設計</b></p><p> 1、系統(tǒng)結構圖(功能模塊圖)</p><p><b> 2、功能模塊說明</b></p><p> (1)、編碼:讀取文件——建立哈夫曼樹——對文本進行哈弗曼編碼并輸出編碼</p><p> ?。?)、譯碼
100、:提示輸入需要譯碼的字符——利用建好的哈夫曼樹進行譯碼</p><p> (3)、退出:退出系統(tǒng),程序運行結束。</p><p><b> 四:詳細設計</b></p><p><b> 主要算法流程圖 </b></p><p><b> 創(chuàng)建哈夫曼樹</b><
101、/p><p><b> 編碼</b></p><p><b> 譯碼</b></p><p><b> 五:調(diào)試分析</b></p><p> 從葉子節(jié)點開始向上遍歷樹,獲得哈弗曼編碼;</p><p> 根據(jù)哈弗曼編碼遍歷哈夫曼樹直到葉子結點,得
102、到譯碼;</p><p> 算法時間復雜度的分析:時間復雜度為O(n2);</p><p> 算法空間復雜度的分析:空間復雜度為O(n)。</p><p><b> 六:測試結果</b></p><p> 由于本實驗是圖形化界面,故無法得到完整的圖形界面,但進入主頁面以后即可看到以下界面。</p>
103、<p> 這將是進入之后點擊譯碼所得到的界面</p><p> 再次點擊回車即可看到如圖所示</p><p><b> 七:附錄</b></p><p> #include<stdio.h></p><p> #include<string.h></p><
104、p> #include<graphics.h></p><p> #include<conio.h></p><p> #include<dos.h></p><p> #include<alloc.h></p><p> #include<ctype.h></
105、p><p> #define UP 50</p><p> #define DOWN 90</p><p> #define LEFT 60</p><p> #define RIGHT 55</p><p> #define ENTER 40</p><p> #define N 50
106、</p><p> #define M 2*N-1</p><p> #define SIZE 6</p><p> typedef struct //定義結構體存放哈夫曼碼</p><p><b> {</b></p><p> char data;</p><
107、p> float weight;</p><p> int parent,lchild,rchild;</p><p><b> }HTNode;</b></p><p> int choice;</p><p><b> int key()</b></p><p
108、><b> {</b></p><p> union REGS lf;</p><p> lf.h.ah=0;</p><p> int86(0x16,&lf,&lf);</p><p> return lf.h.ah;</p><p><b> }&l
109、t;/b></p><p> struct imformation</p><p><b> {</b></p><p><b> char ch;</b></p><p> float fre;</p><p><b> }</b>&l
110、t;/p><p> imfor[SIZE]={{'a',0.3},{'b',0.2},{'c',0.1},{'d',0.2},{'e',0.1},{'f',0.1}};</p><p> //給相關字符設置初值</p><p> typedef struct</p
111、><p><b> {</b></p><p> char cd[N];</p><p> int start;</p><p><b> }HCode;</b></p><p> void CreateHT(HTNode ht[],int n)</p>
112、<p><b> {</b></p><p> int i,k,lnode,rnode;</p><p> float min1,min2; for (i=0;i<2*n-1;i++)</p><p> ht[i].parent=ht[i].lchild=ht[i].rchild=-1;</p&
113、gt;<p> for (i=n;i<2*n-1;i++) //構造哈夫曼樹</p><p><b> {</b></p><p> min1=min2=1.1; //使用兩個最小權值的結點為左孩子和右孩子</p><p> lnode=rnode=-1;</p><p> for (k=
114、0;k<=i-1;k++)</p><p> if (ht[k].parent==-1)</p><p><b> {</b></p><p> if (ht[k].weight<min1)</p><p><b> {</b></p><p> min
115、2=min1;rnode=lnode;</p><p> min1=ht[k].weight;lnode=k;</p><p><b> }</b></p><p> else if (ht[k].weight<min2)</p><p><b> {</b></p>&
116、lt;p> min2=ht[k].weight;rnode=k;</p><p><b> }</b></p><p><b> }</b></p><p> ht[lnode].parent=i;ht[rnode].parent=i;</p><p> ht[i].weight=h
117、t[lnode].weight+ht[rnode].weight;</p><p> ht[i].lchild=lnode;ht[i].rchild=rnode;</p><p><b> }</b></p><p> getchar();</p><p><b> }</b></p&
118、gt;<p> void CreateHCode(HTNode ht[],HCode hcd[],int n)</p><p><b> {</b></p><p> int i,f,j,c;</p><p><b> HCode hc;</b></p><p> for (
119、i=0;i<n;i++) //根據(jù)哈夫曼樹求哈夫曼編碼</p><p><b> {</b></p><p> hc.start=n;</p><p><b> c=i;</b></p><p> f=ht[i].parent;</p><p> while
120、 (f!=-1) //回溯到樹根結點</p><p><b> {</b></p><p> if (ht[f].lchild==c) //遍歷做孩子結點</p><p> hc.cd[hc.start--]='0';</p><p> else //遍歷孩子的右結點</p>
121、<p> hc.cd[hc.start--]='1';</p><p> c=f;f=ht[f].parent;</p><p><b> }</b></p><p> hc.start++;</p><p> hcd[i]=hc;</p><p><b
122、> }</b></p><p><b> }</b></p><p> void huffmancode(HTNode ht[],HCode hcd[],int n)</p><p><b> {</b></p><p> char b[M],*p;</p>
123、<p> int i,j,m,k;</p><p> printf("please input the words:\n");</p><p> scanf("%s",b);</p><p> m=strlen(b);</p><p> for(i=0,p=b;i<m;i++
124、,p++)</p><p><b> {</b></p><p> for(j=0;j<n;j++)</p><p> if(ht[j].data==*p)</p><p> for (k=hcd[j].start;k<=n;k++)</p><p> printf(&quo
125、t;%c",hcd[j].cd[k]);</p><p><b> }</b></p><p><b> getch();</b></p><p> printf("\n");</p><p><b> }</b></p>&
126、lt;p> void words(HTNode ht[],int n)</p><p><b> {</b></p><p><b> int c;</b></p><p> char code[1000],*p;</p><p> printf("please input
127、 numbers:\n");</p><p> scanf("%s",code);</p><p> for(p=code,c=2*n-2;*p!='\0';p++)</p><p><b> {</b></p><p> if(*p=='0')<
128、;/p><p><b> {</b></p><p> c=ht[c].lchild;</p><p> if(ht[c].lchild==-1)</p><p><b> {</b></p><p> printf("%c",ht[c].data)
129、;</p><p><b> c=2*n-2;</b></p><p><b> continue;</b></p><p><b> }</b></p><p><b> }</b></p><p> else if(*
130、p=='1')</p><p><b> {</b></p><p> c=ht[c].rchild;</p><p> if(ht[c].lchild==-1)</p><p><b> {</b></p><p> printf("%c
131、",ht[c].data);</p><p><b> c=2*n-2;</b></p><p><b> continue;</b></p><p><b> }</b></p><p><b> }</b></p>&l
132、t;p><b> }</b></p><p><b> getch();</b></p><p> printf("\n");</p><p><b> }</b></p><p> mainmenu()</p><p&g
133、t;<b> {</b></p><p> cleardevice();</p><p> setbkcolor(3); //設置當前背景顏色</p><p> setcolor(2); //設置當前畫筆顏色</p><p> rectangle(40,60,600,440);</p>&l
134、t;p> line(40,100,600,100);</p><p> outtextxy(240,80,"Huffman");</p><p> rectangle(150,145,350,195);</p><p> setfillstyle(1,12);</p><p> floodfill(160,
135、150,14);</p><p> outtextxy(152,150,"a. Print huffman code");</p><p> outtextxy(152,200,"b. Print words");</p><p> outtextxy(152,250,"c. Quit");</
136、p><p><b> }</b></p><p> void change(char *select[],int n1,int n2,int x0,int len,int y0,int wid1,int wid2)</p><p> //完成兩個窗口間的互換</p><p><b> {</b>
137、</p><p> setviewport(x0,y0+wid2*n1,x0+len,y0+wid1+wid2*n1,1);</p><p> clearviewport();</p><p> setcolor(2); //設置當前背景顏色</p><p> settextstyle(4,0,10);</p>&l
138、t;p> outtextxy(2,5,select[n1]);</p><p> setviewport(x0,y0+wid2*n2,x0+len,y0+wid1+wid2*n2,1);</p><p> clearviewport();</p><p> setfillstyle(1,12);</p><p> setcol
139、or(2);</p><p> rectangle(0,0,len,wid1);</p><p> floodfill(30,5,1);</p><p> setcolor(1);</p><p> settextstyle(4,0,10);</p><p> outtextxy(2,5,select[n2]
140、);</p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p> int n=SIZE,i,a,j,n1=0,n2=0;</p><p> float sum=0;</p>&
141、lt;p> char *select[3]={"a.Print huffman code","b.Print words","c.Quit"};</p><p> HTNode ht[M];</p><p> HCode hcd[N];</p><p><b> FILE *fp;&
142、lt;/b></p><p> char b[M];</p><p> int graphdriver=DETECT,graphmode;</p><p> initgraph(&graphdriver,&graphmode,"\\TC++");</p><p> registerbgidri
143、ver(EGAVGA_driver);</p><p> cleardevice();</p><p> setbkcolor(1);</p><p> setviewport(0,0,639,479,1);</p><p> clearviewport();</p><p> setbkcolor(1);&
144、lt;/p><p> setcolor(2);</p><p> rectangle(250,200,390,280);//在圖形界面上畫一個矩形框</p><p> setfillstyle(1,5);</p><p> floodfill(300,240,14);</p><p> settextstyle(
145、4,0,10);</p><p> outtextxy(252,202,"ENTER");</p><p> outtextxy(200,10," THE HUFFMANCODE TRANSLATOR"); line(0,30,640,30);</p><p> getchar();<
溫馨提示
- 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ù)結構課程設計--基于線性表下的查找與排序
- 線性表數(shù)據(jù)結構試驗
- 數(shù)據(jù)結構實驗-線性表基本操作
- 算法與數(shù)據(jù)結構 線性表答案
- 數(shù)據(jù)結構 第2章 線性表
- 桂電數(shù)據(jù)結構實驗一-線性表
- 數(shù)據(jù)結構實驗(1)線性表及其應用
- 數(shù)據(jù)結構課程設計報告--課程表設計
- 課程設計1線性表課程設計
- 數(shù)據(jù)結構線性表多項式加減實驗報告
- 《數(shù)據(jù)結構》第二章線性表習題
- 數(shù)據(jù)結構-線性表輸入,輸出,插入,刪除,查找
- 數(shù)據(jù)結構課程設計報告
- 數(shù)據(jù)結構課程設計報告
- 數(shù)據(jù)結構課程設計報告
- 數(shù)據(jù)結構課程設計報告
- 數(shù)據(jù)結構課程設計報告
- 數(shù)據(jù)結構課程設計報告
- 數(shù)據(jù)結構課程設計報告
評論
0/150
提交評論