版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 成績:__________________</p><p><b> 算法與數(shù)據(jù)結(jié)構(gòu)</b></p><p><b> 課程設(shè)計(jì)報(bào)告</b></p><p><b> 目錄</b></p><p> 1、模塊2:一元多項(xiàng)式計(jì)算</p>
2、<p> 2、模塊8:建立二叉樹,層序、先序遍歷</p><p> 3、模塊9:赫夫曼樹的建立</p><p> 1、模塊2:一元多項(xiàng)式計(jì)算</p><p><b> ?。?)系統(tǒng)分析</b></p><p> 建立一元多項(xiàng)式并按照指數(shù)降序排列輸出多項(xiàng)式,將一元多項(xiàng)式輸入并存儲(chǔ)在內(nèi)存中,能夠完成
3、兩個(gè)多項(xiàng)式的加減運(yùn)算并輸出結(jié)果</p><p><b> (2)概要設(shè)計(jì)</b></p><p> 存儲(chǔ)結(jié)構(gòu):一元多項(xiàng)式的表示在計(jì)算機(jī)內(nèi)可以用鏈表來表示,為了節(jié)省存儲(chǔ)空間,只存儲(chǔ)多項(xiàng)式中系數(shù)非零的項(xiàng)。鏈表中的每一個(gè)結(jié)點(diǎn)存放多項(xiàng)式的一個(gè)系數(shù)非零項(xiàng),它包含三個(gè)域,分別存放該項(xiàng)的系數(shù)、指數(shù)以及指向下一個(gè)多項(xiàng)式項(xiàng)結(jié)點(diǎn)的指針。創(chuàng)建一元多項(xiàng)式鏈表,對(duì)一元多項(xiàng)式的運(yùn)算中會(huì)出現(xiàn)的
4、各種可能情況進(jìn)行分析,實(shí)現(xiàn)一元多項(xiàng)式的相加、相減操作。</p><p> 1. 單連表的抽象數(shù)據(jù)類型定義:</p><p> ADT List{ 數(shù)據(jù)對(duì)象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥0} 數(shù)據(jù)關(guān)系:R1={<ai-1,ai>| ai-1, ai∈D,i=2,…,n} </p><p><b> 基本操作:&
5、lt;/b></p><p> InitList(&L)</p><p> //操作結(jié)果:構(gòu)造一個(gè)空的線性表 </p><p> CreatPolyn(&L) </p><p> //操作結(jié)果:構(gòu)造一個(gè)以單連表存儲(chǔ)的多項(xiàng)試 </p><p> DispPolyn(L) </p>&
6、lt;p> //操作結(jié)果:顯示多項(xiàng)試 </p><p> Polyn(&pa,&pb) </p><p> //操作結(jié)果:顯示兩個(gè)多項(xiàng)試相加,相減的結(jié)果 </p><p> } ADT List </p><p> 2. 本程序包含模塊: typedef struct LNode //定義單鏈表 </p&
7、gt;<p><b> {</b></p><p> }LNode,*LinkList; </p><p> void InitList(LinkList &L) //定義一個(gè)空表</p><p><b> { } </b></p><p> void CreatPo
8、lyn(LinkList &L) //用單鏈表定義一個(gè)多項(xiàng)式</p><p><b> { } </b></p><p> void DispPolyn(LinkList L) //顯示輸入的多項(xiàng)式</p><p><b> { } </b></p><p> void Polyn(
9、LinkList &pa,LinkList &pb) </p><p><b> {} </b></p><p> void main() </p><p><b> { </b></p><p> //定義一個(gè)單連表; </p><p> cout
10、<<endl<<" *****************歡迎來到一元多項(xiàng)式計(jì)算程序 </p><p> *************** "<<endl; </p><p> LNode *L1,*L2;</p><p> Polyn(L1,L2); } </p><p> 2.1
11、加,減操作模塊——實(shí)現(xiàn)加減操作</p><p> 各模塊之間的調(diào)用關(guān)系如下:</p><p><b> 主程序模塊 </b></p><p> 加法操作模塊 減法操作模塊</p><p><b> 基本算法:</b></p><p><b> 1、輸入輸出
12、</b></p><p> (1)功能:將要進(jìn)行運(yùn)算的多項(xiàng)式輸入輸出。</p><p> (2)數(shù)據(jù)流入:要輸入的多項(xiàng)式的系數(shù)與指數(shù)。</p><p> ?。?)數(shù)據(jù)流出:合并同類項(xiàng)后的多項(xiàng)式。</p><p> ?。?)程序流程圖:多項(xiàng)式輸入流程圖如圖1所示。</p><p> ?。?)測(cè)試要點(diǎn):輸入
13、的多項(xiàng)式是否正確,若輸入錯(cuò)誤則重新輸入</p><p><b> 2、多項(xiàng)式的加法</b></p><p> ?。?)功能:將兩多項(xiàng)式相加。</p><p> ?。?)數(shù)據(jù)流入:輸入函數(shù)。</p><p> ?。?)數(shù)據(jù)流出:多項(xiàng)式相加后的結(jié)果。</p><p> ?。?)程序流程圖:多項(xiàng)式的加
14、法流程圖如圖2所示。</p><p> ?。?)測(cè)試要點(diǎn):兩多項(xiàng)式是否為空,為空則提示重新輸入,否則,進(jìn)行運(yùn)算。</p><p><b> 圖表 2</b></p><p><b> 3、多項(xiàng)式的減法</b></p><p> ?。?)功能:將兩多項(xiàng)式相減。</p><p&g
15、t; ?。?)數(shù)據(jù)流入:調(diào)用輸入函數(shù)。</p><p> (3)數(shù)據(jù)流出:多項(xiàng)式相減后的結(jié)果。</p><p> ?。?)程序流程圖:多項(xiàng)式的減法流程圖如圖3所示。</p><p> ?。?)測(cè)試要點(diǎn):兩多項(xiàng)式是否為空,為空則提示重新輸入,否則,進(jìn)行運(yùn)算。</p><p> 1. 根據(jù)題目要求采用單連表存儲(chǔ)結(jié)構(gòu)</p>&l
16、t;p> typedef struct LNode //定義單鏈表</p><p><b> {</b></p><p> }LNode,*LinkList;</p><p> void InitList(LinkList &L) //定義一個(gè)空表</p><p><b> { } &l
17、t;/b></p><p> void CreatPolyn(LinkList &L) //用單鏈表定義一個(gè)多項(xiàng)式</p><p><b> { } </b></p><p> void DispPolyn(LinkList L) //顯示輸入的多項(xiàng)式 </p><p><b> { }&
18、lt;/b></p><p> void Polyn(LinkList &pa,LinkList &pb) </p><p><b> {} </b></p><p> 2.主函數(shù) main</p><p> void main() </p><p><b>
19、; { </b></p><p> LNode *L1,*L2; </p><p> Polyn(L1,L2);</p><p><b> } </b></p><p> 2. 函數(shù)的調(diào)用關(guān)系層次結(jié)構(gòu)</p><p> 多項(xiàng)式 Polyn 用單鏈表定義多項(xiàng)式 CreatPo
20、lyn 定義一個(gè)空表 InitList 顯示輸入的多項(xiàng)式 DispPolyn</p><p><b> }</b></p><p><b> 五. 調(diào)試分析</b></p><p> 采用單連表形式按照指數(shù)降序排列建立并輸出多項(xiàng)式;在相加,相減的過程 中如果指數(shù)相同就執(zhí)行系數(shù)相加,相減,否則就把大的項(xiàng)直接寫入。完成兩
21、個(gè)多 項(xiàng)式的相加、相減;將從新得到的單連表結(jié)果輸出;該算法的時(shí)間復(fù)雜度為兩個(gè) 多項(xiàng)式的項(xiàng)式之和</p><p><b> (3)詳細(xì)設(shè)計(jì)</b></p><p> #include<stdio.h></p><p> #include<malloc.h></p><p> typedef
22、struct Polynomial{</p><p> float coef;</p><p><b> int expn;</b></p><p> struct Polynomial *next;</p><p> }*Polyn,Polynomial; //Polyn為結(jié)點(diǎn)指針類
23、型</p><p> void Insert(Polyn p,Polyn h){ </p><p> if(p->coef==0) free(p); //系數(shù)為0的話釋放結(jié)點(diǎn)</p><p><b> else{</b></p><p> Polyn q1,q2;</p>
24、<p> q1=h;q2=h->next;</p><p> while(q2&&p->expn<q2->expn){ //查找插入位置</p><p><b> q1=q2;</b></p><p> q2=q2->next;</p><p><
25、b> }</b></p><p> if(q2&&p->expn==q2->expn){ //將指數(shù)相同相合并</p><p> q2->coef+=p->coef;</p><p><b> free(p);</b></p><p> if(!
26、q2->coef){ //系數(shù)為0的話釋放結(jié)點(diǎn)</p><p> q1->next=q2->next;</p><p><b> free(q2);</b></p><p><b> }</b></p><p><b> }</b&g
27、t;</p><p> else{ //指數(shù)為新時(shí)將結(jié)點(diǎn)插入</p><p> p->next=q2;</p><p> q1->next=p;</p><p><b> }</b></p><p><b> }&l
28、t;/b></p><p><b> }//Insert</b></p><p> Polyn CreatePolyn(Polyn head,int m){//建立一個(gè)頭指針為head、項(xiàng)數(shù)為m的一元多項(xiàng)式</p><p><b> int i;</b></p><p><b>
29、; Polyn p;</b></p><p> p=head=(Polyn)malloc(sizeof(struct Polynomial));</p><p> head->next=NULL;</p><p> for(i=0;i<m;i++){</p><p> p=(Polyn)malloc(size
30、of(struct Polynomial));//建立新結(jié)點(diǎn)以接收數(shù)據(jù)</p><p> printf("請(qǐng)輸入第%d項(xiàng)的系數(shù)與指數(shù):",i+1);</p><p> scanf("%f %d",&p->coef,&p->expn);</p><p> Insert(p,head); //
31、調(diào)用Insert函數(shù)插入結(jié)點(diǎn)</p><p><b> }</b></p><p> return head;</p><p> }//CreatePolyn</p><p> void DestroyPolyn(Polyn p){//銷毀多項(xiàng)式p</p><p> Polyn q1,q
32、2;</p><p> q1=p->next;</p><p> q2=q1->next;</p><p> while(q1->next){</p><p><b> free(q1);</b></p><p> q1=q2;//指針后移</p><
33、;p> q2=q2->next;</p><p><b> }</b></p><p><b> }</b></p><p> void PrintPolyn(Polyn P){ </p><p> Polyn q=P->next; </p><p&g
34、t; int flag=1;//項(xiàng)數(shù)計(jì)數(shù)器</p><p> if(!q) { //若多項(xiàng)式為空,輸出0</p><p> putchar('0'); </p><p> printf("\n");</p><p><b> return;</b></p>&l
35、t;p><b> } </b></p><p> while (q){</p><p> if(q->coef>0&&flag!=1) putchar('+'); //系數(shù)大于0且不是第一項(xiàng)</p><p> if(q->coef!=1&&q->coef!
36、=-1){//系數(shù)非1或-1的普通情況</p><p> printf("%g",q->coef); </p><p> if(q->expn==1) putchar('X');</p><p> else if(q->expn) printf("X^%d",q->expn);&l
37、t;/p><p><b> }</b></p><p><b> else{</b></p><p> if(q->coef==1){</p><p> if(!q->expn) putchar('1'); </p><p> else if
38、(q->expn==1) putchar('X'); </p><p> else printf("X^%d",q->expn);</p><p><b> }</b></p><p> if(q->coef==-1){</p><p> if(!q->
39、expn) printf("-1"); </p><p> else if(q->expn==1) printf("-X"); </p><p> else printf("-X^%d",q->expn);</p><p><b> }</b></p>
40、<p><b> }</b></p><p> q=q->next; </p><p><b> flag++;</b></p><p><b> }//while</b></p><p> printf("\n");</p&
41、gt;<p> }//PrintPolyn</p><p> int compare(Polyn a,Polyn b){</p><p><b> if(a&&b){</b></p><p> if(!b||a->expn>b->expn) return 1;</p><
42、;p> else if(!a||a->expn<b->expn) return -1;</p><p> else return 0;</p><p><b> }</b></p><p> else if(!a&&b) return -1;//a多項(xiàng)式已空,但b多項(xiàng)式非空</p>
43、<p> else return 1;//b多項(xiàng)式已空,但a多項(xiàng)式非空</p><p> }//compare</p><p> Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多項(xiàng)式a+b,返回其頭指針</p><p> Polyn qa=pa->next;</p><p> Po
44、lyn qb=pb->next;</p><p> Polyn headc,hc,qc;</p><p> hc=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結(jié)點(diǎn)</p><p> hc->next=NULL;</p><p><b> headc=hc;</
45、b></p><p> while(qa||qb){</p><p> qc=(Polyn)malloc(sizeof(struct Polynomial));</p><p> switch(compare(qa,qb)){</p><p><b> case 1:</b></p><
46、p><b> {</b></p><p> qc->coef=qa->coef;</p><p> qc->expn=qa->expn;</p><p> qa=qa->next;</p><p><b> break;</b></p>&
47、lt;p><b> }</b></p><p><b> case 0:</b></p><p><b> { </b></p><p> qc->coef=qa->coef+qb->coef;</p><p> qc->expn=qa-
48、>expn;</p><p> qa=qa->next;</p><p> qb=qb->next;</p><p><b> break;</b></p><p><b> }</b></p><p><b> case -1:<
49、/b></p><p><b> {</b></p><p> qc->coef=qb->coef;</p><p> qc->expn=qb->expn;</p><p> qb=qb->next;</p><p><b> break;&
50、lt;/b></p><p><b> } </b></p><p><b> }//switch</b></p><p> if(qc->coef!=0){</p><p> qc->next=hc->next;</p><p> hc-&
51、gt;next=qc;</p><p><b> hc=qc;</b></p><p><b> }</b></p><p> else free(qc);//當(dāng)相加系數(shù)為0時(shí),釋放該結(jié)點(diǎn)</p><p><b> }//while</b></p><
52、;p> return headc;</p><p> }//AddPolyn</p><p> Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解并建立多項(xiàng)式a+b,返回其頭指針</p><p> Polyn h=pb;</p><p> Polyn p=pb->next;</p
53、><p><b> Polyn pd;</b></p><p> while(p){ //將pb的系數(shù)取反</p><p> p->coef*=-1;</p><p> p=p->next;</p><p><b> }</b></
54、p><p> pd=AddPolyn(pa,h);</p><p> for(p=h->next;p;p=p->next) //恢復(fù)pb的系數(shù)</p><p> p->coef*=-1;</p><p> return pd;</p><p> }//SubtractPolyn</p
55、><p> int main(){</p><p> int m,n,flag=0;</p><p><b> float x;</b></p><p> Polyn pa=0,pb=0,pc,pd,pe,pf;//定義各式的頭指針,pa與pb在使用前付初值NULL</p><p> pri
56、ntf("請(qǐng)輸入a的項(xiàng)數(shù):");</p><p> scanf("%d",&m);</p><p> pa=CreatePolyn(pa,m);//建立多項(xiàng)式a</p><p> printf("請(qǐng)輸入b的項(xiàng)數(shù):");</p><p> scanf("%d&
57、quot;,&n);</p><p> pb=CreatePolyn(pb,n);//建立多項(xiàng)式a</p><p><b> //輸出菜單</b></p><p> printf("**********************************************\n");</p>&l
58、t;p> printf("操作提示:\n\t1.輸出多項(xiàng)式a和b\n\t2.建立多項(xiàng)式a+b\n\t3.建立多項(xiàng)式a-b\n");</p><p> printf("\t4.退出\n**********************************************\n");</p><p> for(;;flag=0){<
59、/p><p> printf("執(zhí)行操作:");</p><p> scanf("%d",&flag);</p><p> if(flag==1){</p><p> printf("多項(xiàng)式a:");PrintPolyn(pa);</p><p>
60、 printf("多項(xiàng)式b:");PrintPolyn(pb);continue;</p><p><b> }</b></p><p> if(flag==2){</p><p> pc=AddPolyn(pa,pb);</p><p> printf("多項(xiàng)式a+b:"
61、;);PrintPolyn(pc);</p><p> DestroyPolyn(pc);continue;</p><p><b> }</b></p><p> if(flag==3){</p><p> pd=SubtractPolyn(pa,pb);</p><p> print
62、f("多項(xiàng)式a-b:");PrintPolyn(pd);</p><p> DestroyPolyn(pd);continue;</p><p><b> }</b></p><p> if(flag==4) break;</p><p> if(flag<1||flag>4) p
63、rintf("Error!!!\n");continue;</p><p><b> }//for</b></p><p> DestroyPolyn(pa);</p><p> DestroyPolyn(pb);</p><p><b> return 0;</b>&l
64、t;/p><p><b> }</b></p><p><b> (4)測(cè)試記錄</b></p><p><b> 測(cè)試的數(shù)據(jù)及結(jié)果</b></p><p><b> (5)總結(jié):</b></p><p> 算法的時(shí)間復(fù)雜度及
65、改進(jìn):</p><p> 一元多項(xiàng)式的加法運(yùn)算的時(shí)間復(fù)雜度為O(m+n),減法運(yùn)算的時(shí)間復(fù)雜度為O(m-n),其中m,n分別表示二個(gè)一元多項(xiàng)式的項(xiàng)數(shù)。</p><p> 問題和改進(jìn)思想:在設(shè)計(jì)該算法時(shí),出現(xiàn)了一些問題,例如在建立鏈表時(shí)頭指針的設(shè)立導(dǎo)致了之后運(yùn)用到相關(guān)的指針時(shí)沒能很好的移動(dòng)指針出現(xiàn)了數(shù)據(jù)重復(fù)輸出或是輸出系統(tǒng)缺省值,不能實(shí)現(xiàn)算法。實(shí)現(xiàn)加法時(shí)該鏈表并沒有向通常那樣通過建立第三
66、個(gè)鏈表來存放運(yùn)算結(jié)果,而是再度利用了鏈表之一來進(jìn)行節(jié)點(diǎn)的比較插入刪除等操作。為了使輸入數(shù)據(jù)按指數(shù)降序排列,可在數(shù)據(jù)的輸入后先做一個(gè)節(jié)點(diǎn)的排序函數(shù),通過對(duì)鏈表排序后再進(jìn)行之后加減運(yùn)算。</p><p> 一元多項(xiàng)式計(jì)算是一個(gè)的單鏈表的運(yùn)用, 通過這個(gè)程序可以測(cè)我們以前的學(xué)習(xí)情 況,看看我們是否對(duì)單鏈表真正的理解。</p><p> 一元多項(xiàng)式計(jì)算器的基本功能定為:</p>
67、<p> (1) 建立多項(xiàng)式 </p><p><b> (2) 輸出多項(xiàng)式</b></p><p> (3) 兩個(gè)多項(xiàng)式相加,建立并輸出和多項(xiàng)式 </p><p> (4) 兩 個(gè)多項(xiàng)式相減,建立并輸出差多項(xiàng)式能夠按照指數(shù)降序排列建立并輸出多項(xiàng)式;能夠完成兩個(gè)多項(xiàng)式的相加、相減,并將結(jié)果輸出;</p><
68、p> 2、模塊8:建立二叉樹,層序、先序遍歷</p><p><b> ?。?)系統(tǒng)分析</b></p><p> 要求能夠輸入樹的各個(gè)結(jié)點(diǎn),并能夠輸出用不同方法遍歷的遍歷序列;分別建立二叉樹存儲(chǔ)結(jié)構(gòu)的的輸入函數(shù)、輸出層序遍歷序列的函數(shù)、輸出先序遍歷序列的函數(shù);程序功能包括,建立二叉樹,輸出二叉樹,對(duì)二叉樹進(jìn)行層序遍歷和先序遍歷。</p>&l
69、t;p> ?。?)概要設(shè)計(jì)或程序流程圖</p><p><b> 主函數(shù)設(shè)計(jì)</b></p><p> void main ()</p><p><b> {</b></p><p> BTNode * b,*p;</p><p> CreateBTNode
70、(b,"a(b(d,e),c(f,g)) ");</p><p> printf("(1)輸出二叉樹:");DispBTNode (b);printf("\n");</p><p> printf("(2)層次遍歷序列:");TravLevel(b);printf("\n");</
71、p><p> printf("(3)先序遍歷序列:");PreOrder(b);printf("\n");}</p><p> 用遞歸算法的先序遍歷函數(shù)</p><p> void PreOrder(BTNode *b)</p><p><b> {</b></p>
72、<p> if(b!=NULL)</p><p><b> {</b></p><p> printf ("%c",b->data);</p><p> PreOrder(b->lchild);</p><p> PreOrder(b->rchild);<
73、;/p><p><b> }</b></p><p> ?。?)詳細(xì)設(shè)計(jì)或源代碼說明</p><p> #include <stdio.h></p><p> #include <malloc.h></p><p> #define MaxSize 100</p&
74、gt;<p> typedef char ElemType;</p><p> typedef struct node</p><p><b> {</b></p><p> ElemType data;</p><p> struct node *lchild;</p><p
75、> struct node *rchild;</p><p><b> }BTNode;</b></p><p> void CreateBTNode(BTNode *&b,char *str)//創(chuàng)建二叉樹</p><p><b> {</b></p><p> BTNod
76、e *St[MaxSize],*p=NULL;</p><p> int top=-1,k,j=0;</p><p><b> char ch;</b></p><p><b> b=NULL;</b></p><p> ch=str[j];</p><p> wh
77、ile (ch!='\0')</p><p><b> {</b></p><p> switch (ch)</p><p><b> {</b></p><p> case'(':top++;St[top]=p;k=1;break;</p>&
78、lt;p> case')':top--;break;</p><p> case',':k=2;break;</p><p> default:p=(BTNode *)malloc(sizeof(BTNode));</p><p> p->data=ch;</p><p> p->l
79、child=p->rchild=NULL;</p><p> if(b==NULL)</p><p><b> b=p;</b></p><p><b> else</b></p><p><b> {</b></p><p><b&
80、gt; switch(k)</b></p><p><b> {</b></p><p> case 1:St[top]->lchild=p;break;</p><p> case 2:St[top]->rchild=p;break;</p><p><b> }</b
81、></p><p><b> }</b></p><p><b> }</b></p><p><b> j++;</b></p><p> ch=str[j];</p><p><b> }</b></p&g
82、t;<p><b> }</b></p><p> void DispBTNode(BTNode *b)//括號(hào)表示法輸出二叉樹</p><p><b> {</b></p><p> if (b!=NULL)</p><p><b> {</b><
83、;/p><p> printf ("%C",b->data);</p><p> if(b->lchild!=NULL||b->rchild!=NULL)</p><p><b> {</b></p><p> printf("(");</p>
84、<p> DispBTNode(b->lchild);</p><p> if(b->rchild!=NULL)printf(",");</p><p> DispBTNode(b->rchild);</p><p> printf(")");</p><p><
85、;b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void TravLevel(BTNode *b)//層次遍歷</p><p><b> {</b></p><p&
86、gt; BTNode *Qu[MaxSize];</p><p> int front,rear;</p><p> front=rear=0;</p><p> if(b!=NULL)</p><p> printf("%c",b->data);</p><p><b>
87、 rear++;</b></p><p> Qu[rear]=b;</p><p> while (rear!=front)</p><p><b> {</b></p><p> front=(front+1)%MaxSize;</p><p> b=Qu[front];
88、</p><p> if(b->lchild!=NULL)</p><p> {printf("%c",b->lchild->data);</p><p> rear=(rear+1)%MaxSize;</p><p> Qu[rear]=b->lchild;</p><
89、p><b> }</b></p><p> if(b->rchild!=NULL)</p><p><b> {</b></p><p> printf ("%c",b->rchild->data);</p><p> rear=(rear+1)
90、%MaxSize;</p><p> Qu[rear]=b->rchild;</p><p><b> }</b></p><p><b> }</b></p><p> printf("\n");</p><p><b> }&
91、lt;/b></p><p> void PreOrder(BTNode *b)//用遞歸算法的先序遍歷函數(shù)</p><p><b> {</b></p><p> if(b!=NULL)</p><p><b> {</b></p><p> printf
92、("%c",b->data);</p><p> PreOrder(b->lchild);</p><p> PreOrder(b->rchild);</p><p><b> }</b></p><p><b> }</b></p>&l
93、t;p> void main ()</p><p><b> {</b></p><p> BTNode * b,*p;</p><p> CreateBTNode (b,"a(b(d,e),c(f,g)) ");</p><p> printf("(1)輸出二叉樹:&quo
94、t;);DispBTNode (b);printf("\n");</p><p> printf("(2)層次遍歷序列:");TravLevel(b);printf("\n");</p><p> printf("(3)先序遍歷序列:");PreOrder(b);printf("\n")
95、;</p><p><b> }</b></p><p><b> 測(cè)試記錄</b></p><p><b> ?。?)總結(jié)</b></p><p> 因?yàn)楸境绦蜃罱K要與其他兩個(gè)程序合并在一起,在主界面進(jìn)行選擇。所以在進(jìn)入主界面時(shí)要在本程序的主函數(shù)處修改字符,否則在調(diào)用本
96、程序時(shí)主函數(shù)會(huì)發(fā)生沖突。</p><p> 3、模塊9:赫夫曼樹的建立</p><p><b> ?。?)系統(tǒng)分析</b></p><p> 建立函數(shù)輸入二叉樹,能夠輸出所輸入權(quán)值的赫夫曼編碼。</p><p> ?。?)概要設(shè)計(jì)或程序流程圖</p><p> 通過控制臺(tái)輸入的形式得到建立赫
97、夫曼樹需要的參數(shù)——>調(diào)用生成赫夫曼樹的算法來生成赫夫曼樹,這個(gè)過程中還不斷的調(diào)用select方法來尋找當(dāng)前結(jié)點(diǎn)中權(quán)值最小的結(jié)點(diǎn)來生成樹的新結(jié)點(diǎn),然后添加到樹中去——>通過用戶的選擇來輸出赫夫曼樹,其輸出的形式為:每個(gè)自符對(duì)應(yīng)的赫夫曼編碼。</p><p> 詳細(xì)設(shè)計(jì)或源代碼說明</p><p> # include <stdio.h></p>&
98、lt;p> # include <malloc.h></p><p> # include <iostream.h></p><p> # include <conio.h></p><p> # include <string.h></p><p> # define MAX_
99、LENGTH 100</p><p> typedef char **HuffmanCode;</p><p><b> //數(shù)據(jù)結(jié)構(gòu)</b></p><p> typedef struct </p><p><b> { </b></p><p> int
100、 weight; //權(quán)值</p><p> int parent,lchild,rchild; //雙親,左右孩子</p><p> }HTNode,*HuffmanTree;</p><p> //select函數(shù)</p><p> void Select(HuffmanTree HT,int i,int &s1,int
101、&s2) </p><p> //在建立赫夫曼樹的所有結(jié)點(diǎn)中選擇權(quán)值最小的兩個(gè)結(jié)點(diǎn)存放在s1,s2中</p><p><b> {</b></p><p> int j,k=1;</p><p> while(HT[k].parent!=0) </p><p><b>
102、 k++;</b></p><p><b> s1=k;</b></p><p> for(j=1;j<=i;++j)</p><p> if(HT[j].parent==0&&HT[j].weight<HT[s1].weight)</p><p><b> s1
103、=j;</b></p><p><b> k=1;</b></p><p> while((HT[k].parent!=0||k==s1))</p><p><b> k++;</b></p><p><b> s2=k;</b></p>&l
104、t;p> for(j=1;j<=i;++j)</p><p> if(HT[j].parent==0&&HT[j].weight<HT[s2].weight&&j!=s1)</p><p><b> s2=j;</b></p><p><b> } </b><
105、/p><p><b> //構(gòu)建赫夫曼樹</b></p><p> void HuffmanCoding(HuffmanTree &HT,HuffmanCode&HC,int *w,int n) </p><p><b> {</b></p><p> int m,i,s1,s2
106、,start,c,f;</p><p> HuffmanTree p;</p><p><b> if(n<=1)</b></p><p><b> return;</b></p><p> m=2*n-1; //由得到的葉子數(shù)而計(jì)算結(jié)點(diǎn)總數(shù)</p
107、><p> HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//分配存儲(chǔ)空間</p><p> for(p=HT+1,i=1;i<=n;++i,++p,++w) </p><p><b> { </b></p><p> p->weight=*w;
108、 //為結(jié)點(diǎn)初始化權(quán)值</p><p> p->parent=0;</p><p> p->lchild=0;</p><p> p->rchild=0;</p><p><b> }</b></p><p> for(;i<=m;++i,++p) <
109、/p><p><b> {</b></p><p> p->weight=0;</p><p> p->parent=0;</p><p> p->lchild=0;</p><p> p->rchild=0;</p><p> }
110、 //初始化雙親和左右孩子,使他們成為孤立的</p><p> for(i=n+1;i<=m;++i)</p><p><b> { </b></p><p> Select(HT,i-1,s1,s2); //調(diào)用select函數(shù)</p><p> HT[s1].pare
111、nt=HT[s2].parent=i;</p><p> HT[i].lchild=s1;</p><p> HT[i].rchild=s2;</p><p> HT[i].weight=HT[s1].weight+HT[s2].weight;//新結(jié)點(diǎn)的權(quán)值是s1和s2權(quán)值的和</p><p><b> }</b&g
112、t;</p><p><b> //赫夫曼編碼</b></p><p> HC=(HuffmanCode)malloc((n+1)*sizeof(char *));</p><p><b> char *cd;</b></p><p> cd=(char *)malloc(n*sizeof(
113、char));</p><p> cd[n-1]='\0';</p><p> cout<<endl<<"HuffmanTree編碼是:"<<endl;</p><p> for(i=1;i<=n;++i) //從底下往上尋回編碼</p><p>&
114、lt;b> {</b></p><p> start=n-1;</p><p> for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)</p><p> if(HT[f].lchild==c)</p><p> cd[--start]='0';</p&
115、gt;<p><b> else</b></p><p> cd[--start]='1';</p><p> HC[i]=(char*)malloc((n-start)*sizeof(char));</p><p> strcpy(HC[i],&cd[start]);</p><
116、;p> cout<<"HT[i] Huffman code is: "<<HC[i]<<endl;</p><p><b> }</b></p><p><b> free(cd);</b></p><p><b> } ;</b>
117、</p><p><b> //主函數(shù)部分</b></p><p> void main() </p><p><b> { </b></p><p> HuffmanTree HT;</p><p> HuffmanCode HC;<
118、;/p><p><b> int n,i;</b></p><p> int *w,W[MAX_LENGTH];</p><p> cout<<"***********本程序?qū)崿F(xiàn)的是赫夫曼樹的建立以及編碼*********";</p><p> cout<<endl<
119、<"請(qǐng)輸入赫夫曼樹元素的個(gè)數(shù): ";</p><p><b> cin>>n;</b></p><p> cout<<"請(qǐng)輸入各元素的權(quán)值:"<<endl;</p><p> for(i=0;i<n;++i)</p><p>&
120、lt;b> {</b></p><p> cout<<"HT["<<i<<"].weight=";</p><p> cin>>W[i];</p><p><b> }</b></p><p><b&g
121、t; w=W;</b></p><p> HuffmanCoding(HT,HC,w,n);}</p><p><b> 測(cè)試記錄</b></p><p> 當(dāng)建立一個(gè)含有5個(gè)初始結(jié)點(diǎn),權(quán)值分別為2,4,6,8,10的赫夫曼樹的測(cè)試結(jié)果:</p><p><b> ?。?)總結(jié)</b&
122、gt;</p><p> 算法時(shí)間復(fù)雜度:O(n2)</p><p> 此處只是赫夫曼樹的建立和輸出算法的實(shí)現(xiàn),一個(gè)完整的赫夫曼編/譯碼系統(tǒng)其實(shí)可以進(jìn)一步完善,并且可以實(shí)現(xiàn)相關(guān)編碼解碼的功能。這也是赫夫曼樹在生活中用到最多的地方。</p><p><b> 總程序:</b></p><p> # include
123、<stdio.h></p><p> # include <malloc.h></p><p> # include <iostream.h></p><p> # include <conio.h></p><p> # include <string.h></p&g
124、t;<p> # define MAX_LENGTH 100</p><p> typedef char **HuffmanCode;</p><p><b> void e();</b></p><p> //-------------------------模塊2----------------------------
125、--------</p><p> void a(); </p><p> typedef struct Polynomial{</p><p> float coef;</p><p><b> int expn;</b></p><p> struct Polynomial *nex
126、t;</p><p> }*Polyn,Polynomial; //Polyn為結(jié)點(diǎn)指針類型</p><p> void Insert(Polyn p,Polyn h){ </p><p> if(p->coef==0) free(p); //系數(shù)為0的話釋放結(jié)點(diǎn)</p><p>&
127、lt;b> else{</b></p><p> Polyn q1,q2;</p><p> q1=h;q2=h->next;</p><p> while(q2&&p->expn<q2->expn){ //查找插入位置</p><p><b> q1=q2;&
128、lt;/b></p><p> q2=q2->next;</p><p><b> }</b></p><p> if(q2&&p->expn==q2->expn){ //將指數(shù)相同相合并</p><p> q2->coef+=p->coef;</
129、p><p><b> free(p);</b></p><p> if(!q2->coef){ //系數(shù)為0的話釋放結(jié)點(diǎn)</p><p> q1->next=q2->next;</p><p><b> free(q2);</b></p>
130、<p><b> }</b></p><p><b> }</b></p><p> else{ //指數(shù)為新時(shí)將結(jié)點(diǎn)插入</p><p> p->next=q2;</p><p> q1->next=p;</p
131、><p><b> }</b></p><p><b> }</b></p><p><b> }//Insert</b></p><p> Polyn CreatePolyn(Polyn head,int m){//建立一個(gè)頭指針為head、項(xiàng)數(shù)為m的一元多項(xiàng)式</
132、p><p><b> int i;</b></p><p><b> Polyn p;</b></p><p> p=head=(Polyn)malloc(sizeof(struct Polynomial));</p><p> head->next=NULL;</p>&l
133、t;p> for(i=0;i<m;i++){</p><p> p=(Polyn)malloc(sizeof(struct Polynomial));//建立新結(jié)點(diǎn)以接收數(shù)據(jù)</p><p> printf("請(qǐng)輸入第%d項(xiàng)的系數(shù)與指數(shù):",i+1);</p><p> scanf("%f %d",&
134、;p->coef,&p->expn);</p><p> Insert(p,head); //調(diào)用Insert函數(shù)插入結(jié)點(diǎn)</p><p><b> }</b></p><p> return head;</p><p> }//CreatePolyn</p><p&g
135、t; void DestroyPolyn(Polyn p){//銷毀多項(xiàng)式p</p><p> Polyn q1,q2;</p><p> q1=p->next;</p><p> q2=q1->next;</p><p> while(q1->next){</p><p><b>
136、; free(q1);</b></p><p> q1=q2;//指針后移</p><p> q2=q2->next;</p><p><b> }</b></p><p><b> }</b></p><p> void PrintPolyn(
137、Polyn P){ </p><p> Polyn q=P->next; </p><p> int flag=1;//項(xiàng)數(shù)計(jì)數(shù)器</p><p> if(!q) { //若多項(xiàng)式為空,輸出0</p><p> putchar('0'); </p><p> printf("\
138、n");</p><p><b> return;</b></p><p><b> } </b></p><p> while (q){</p><p> if(q->coef>0&&flag!=1) putchar('+'); /
139、/系數(shù)大于0且不是第一項(xiàng)</p><p> if(q->coef!=1&&q->coef!=-1){//系數(shù)非1或-1的普通情況</p><p> printf("%g",q->coef); </p><p> if(q->expn==1) putchar('X');</p>
140、;<p> else if(q->expn) printf("X^%d",q->expn);</p><p><b> }</b></p><p><b> else{</b></p><p> if(q->coef==1){</p><p&g
141、t; if(!q->expn) putchar('1'); </p><p> else if(q->expn==1) putchar('X'); </p><p> else printf("X^%d",q->expn);</p><p><b> }</b><
142、;/p><p> if(q->coef==-1){</p><p> if(!q->expn) printf("-1"); </p><p> else if(q->expn==1) printf("-X"); </p><p> else printf("-X^%d&q
143、uot;,q->expn);</p><p><b> }</b></p><p><b> }</b></p><p> q=q->next; </p><p><b> flag++;</b></p><p><b>
144、 }//while</b></p><p> printf("\n");</p><p> }//PrintPolyn</p><p> int compare(Polyn a,Polyn b){</p><p><b> if(a&&b){</b></p&g
145、t;<p> if(!b||a->expn>b->expn) return 1;</p><p> else if(!a||a->expn<b->expn) return -1;</p><p> else return 0;</p><p><b> }</b></p>
146、<p> else if(!a&&b) return -1;//a多項(xiàng)式已空,但b多項(xiàng)式非空</p><p> else return 1;//b多項(xiàng)式已空,但a多項(xiàng)式非空</p><p> }//compare</p><p> Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多項(xiàng)式a+b,返回其
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ì)報(bào)告
- 算法與數(shù)據(jù)結(jié)構(gòu)-課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)與算法分析課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)
- 算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---迷宮算法
- 數(shù)據(jù)結(jié)構(gòu)及其應(yīng)用(算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì))
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)報(bào)告---圖的算法實(shí)現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)與算法分析課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)題目
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---prim算法
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論