數(shù)據(jù)結(jié)構-基于鏈式表實現(xiàn)一元多項式的加減乘運算課程設計-實驗報告_第1頁
已閱讀1頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  數(shù) 據(jù) 結(jié) 構 課 程 設 計</p><p>  設計題目:基于鏈式表實現(xiàn)一元多項式的加減乘運算 </p><p> 課題名稱基于鏈式表實現(xiàn)一元多項式的加減乘運算</p><p> 院 系年級專業(yè)</p><p> 成 績</p>&

2、lt;p> 課題設計目的與設計意義1、課題設計目的:通過多項式運算程序設計(用C語言實現(xiàn)),使我們進一步掌握和利用C語言進行結(jié)構化程序設計的能力;進一步理解和運用結(jié)構化程設計的思想和方法;初步掌握開發(fā)一個小型系統(tǒng)程序設計的基本方法;學會調(diào)試一個較長程序的基本方法;學會利用流程圖或N-S圖表示算法;以及掌握書寫課程設計開發(fā)文檔的能力(書寫課程設計報告)??傊ㄟ^本課程設計加深對《C語言》及《數(shù)據(jù)結(jié)構》課程所學知識的理解,進一步鞏固

3、C語言語法規(guī)則,在程序中體現(xiàn)出算法的思想,提高程序的運行效率。學會編制結(jié)構清晰、風格良好、數(shù)據(jù)結(jié)構適當?shù)模谜Z言程序,從而具備解決綜合性實際問題的能力。2、課題設計意義:通過這次課程設計練習,使我更深刻地理解了C語言的精髓-----指針的使用。完成整個程序設計有,對指針掌握的更加熟練。同時通過直接對鏈表的操作,加深了對數(shù)據(jù)結(jié)構的理解和認識。并在完成課程設計的過程作主動查閱了相關資料,學到了不少課本上沒有的技術知識。經(jīng)過這次課程設計,我深刻

4、認識到算法在程序設計中的重要性,一個完整的程序總是由若干個函數(shù)構成的,這些相應的函數(shù)體現(xiàn)了算法的基本思想。另外也需要提出的是在這次程序設計</p><p><b>  目 錄 </b></p><p><b>  問題分析11</b></p><p>  1.1 問題描述1</p><p> 

5、 1.2 問題的數(shù)學模型1</p><p>  1.3 構造數(shù)據(jù)結(jié)構1</p><p><b>  2 系統(tǒng)分析2</b></p><p>  2.1 可行性研究2</p><p>  2.2 系統(tǒng)結(jié)構與主要功能模塊2</p><p><b>  3 系統(tǒng)設計4</b&

6、gt;</p><p>  3.1系統(tǒng)設計目的與要求4</p><p>  3.2系統(tǒng)設計內(nèi)容4</p><p>  3.3功能算法描述與數(shù)據(jù)結(jié)構說明4</p><p><b>  4 系統(tǒng)實現(xiàn)7</b></p><p>  5 調(diào)試及運行結(jié)果11</p><p>

7、;  6 收獲和體會12</p><p><b>  附錄13</b></p><p><b>  問題分析1 </b></p><p><b>  1.1 問題描述</b></p><p>  設計一個n元多項式程序,并完成多項式的乘法運算。從實際的角度出發(fā),這里設計的程

8、序是基于一元n次多項式的數(shù)學模型。</p><p>  1.2 問題的數(shù)學模型</p><p>  在數(shù)學上,一個一元多項式Pn(x)可按升冪寫成:Pn(x)=a 0+a1 x+a2 x^2 +…+an x^n-1 .它由n+1個系數(shù)惟一確定,因此,在計算機里,它可用一個線性表P來表示:Pn=(a0,a1,a2,…,an)每一項的指數(shù)i隱含在其系數(shù)ai的序號里。</p>&l

9、t;p>  多項式的乘法規(guī)則:多次運用單項式與多項式相乘的法則得到的.計算時(a+b)(m+n),先把(m+n)看成一個單項式,(a+b) 是一個多項式,運用單項式與多項式相乘的法則,得到(a+b)(m+n)=a(m+n)+b(m+n),然后再次運用單項式與多項式相乘的法則。</p><p>  1.3 構造數(shù)據(jù)結(jié)構</p><p>  通過分析多項式的特征,不難看出多項式是由單項式

10、構成的,而每個單項式都具有系數(shù)和指數(shù),當系數(shù)為0時,該項就失去了意義,在計算機內(nèi)要表示一個多項式,至少以下數(shù)據(jù)信息:系數(shù)信息、指數(shù)信息和指向下一個單項式的指針。通過指針,我們就可以把多個單項式連接起來,形式一個多項式,需要說明的是從廣義的角度講,單項式也是一個多項式?;谝陨系姆治?,我們定義多項式的數(shù)據(jù)結(jié)構為如下結(jié)構體形式:</p><p>  typedef struct Polynomial{</p&g

11、t;<p>  float coef;//系數(shù)</p><p>  int expn;//指數(shù)</p><p>  struct Polynomial *next;//指向下一個結(jié)點</p><p>  }*Polyn,Polynomial; //Polyn為結(jié)點指針類型</p><p><b&

12、gt;  2 系統(tǒng)分析</b></p><p><b>  2.1 可行性研究</b></p><p>  該程序主要從技術的角度來分析可行性。技術上的可行性研究主要分析技術條件能否順利完成開發(fā)工作,硬、軟件能否滿足開發(fā)者的需要等。該系統(tǒng)采用了Windows XP操作系統(tǒng)結(jié)合Visual C++ 6.0,TC 2.0等軟件開發(fā)平臺已成熟可行。硬件方面,科技

13、飛速發(fā)展的今天,硬件更新的速度越來越快,容量越來越大,可靠性越來越高,其硬件平臺也比較能滿足此系統(tǒng)的需要。此外,還有經(jīng)濟可行性,用戶使用可行性,法律可行性等可行性研究,這里從簡省去。</p><p>  2.2 系統(tǒng)結(jié)構與主要功能模塊</p><p>  從實現(xiàn)多項式式運算過程的角度來分析,至少需要這樣一些子功能模塊。如:</p><p>  1. 多項式創(chuàng)建功能;

14、</p><p>  2. 多項式運算功能;</p><p>  3. 操作界面顯示功能;</p><p>  4. 銷毀多項式的功能;</p><p>  5. 多項式復制功能等。</p><p>  系統(tǒng)的整體流程和主要功能模塊如圖2-1所示</p><p><b>  3 系統(tǒng)設

15、計</b></p><p>  3.1系統(tǒng)設計目的與要求</p><p>  通過多項式運算程序設計(用C語言實現(xiàn)),使我們進一步掌握和利用C語言進行結(jié)構化程序設計的能力;進一步理解和運用結(jié)構化程設計的思想和方法;初步掌握開發(fā)一個小型系統(tǒng)程序設計的基本方法;學會調(diào)試一個較長程序的基本方法;學會利用流程圖或N-S圖表示算法;以及掌握書寫課程設計開發(fā)文檔的能力(書寫課程設計報告)。

16、總之,通過本課程設計加深對《C語言》及《數(shù)據(jù)結(jié)構》課程所學知識的理解,進一步鞏固C語言語法規(guī)則,在程序中體現(xiàn)出算法的思想,提高程序的運行效率。學會編制結(jié)構清晰、風格良好、數(shù)據(jù)結(jié)構適當?shù)模谜Z言程序,從而具備解決綜合性實際問題的能力。</p><p><b>  3.2系統(tǒng)設計內(nèi)容</b></p><p>  多項式運算程序具有以下基本功能:</p><

17、;p>  1.界面輸出,提示如何輸入數(shù)據(jù)。要求先輸入多項式的項數(shù)。</p><p>  2.創(chuàng)建多項式。接收輸入的數(shù)據(jù),并保存到鏈表中。</p><p>  3.顯示程序的功能表,允許使用者選擇運算類型。</p><p>  4.顯示已經(jīng)創(chuàng)建好的多項式。</p><p><b>  6.實現(xiàn)加法運算。</b><

18、;/p><p><b>  7.實現(xiàn)減法運算。</b></p><p><b>  8.實現(xiàn)乘法運算。</b></p><p>  9.清除內(nèi)存內(nèi)容,銷毀創(chuàng)建的鏈表,退出程序。</p><p>  3.3功能算法描述與數(shù)據(jù)結(jié)構說明</p><p>  該多項式程序除了main()

19、函數(shù)外,主要有以下函數(shù):</p><p>  void Insert(Polyn p,Polyn h)</p><p>  Polyn CreatePolyn(Polyn head,int m)</p><p>  void DestroyPolyn(Polyn p)</p><p>  void PrintPolyn(Polyn P)<

20、;/p><p>  int compare(Polyn a,Polyn b)</p><p>  Polyn AddPolyn(Polyn pa,Polyn pb)</p><p>  Polyn SubtractPolyn(Polyn pa,Polyn pb)</p><p>  Polyn MultiplyPolyn(Polyn pa,Pol

21、yn pb)</p><p>  下面對這些函數(shù)逐一介紹。</p><p>  3.3. 系統(tǒng)主要功能函數(shù)的詳細設計</p><p>  1. main()函數(shù)</p><p>  main函數(shù)用來實現(xiàn)提示使用者輸入、顯示功能列表、調(diào)用其他運算函數(shù)實現(xiàn)運算功能。</p><p>  在main()函數(shù)中,定義m、n用來

22、保存兩個多項式的項數(shù),pa、pb、pc、pd、pf定義程序所需鏈表的頭指針。在程序開始要求輸入兩個多項式的項數(shù),隨后根據(jù)項數(shù)創(chuàng)建兩個鏈表以保存多項式,再顯示出功能列表后通過if語句來實現(xiàn)功能的選擇,從而對整個程序流程進行控制。</p><p>  2. Polyn CreatePolyn(Polyn head,int m)</p><p>  該函數(shù)功能是創(chuàng)建新的多項式鏈表。int m保

23、存的多項式的項數(shù),使用for語句,控制輸入多項式的每一項。當創(chuàng)建的鏈表長度為m時,將不再提示用戶繼續(xù)輸入多項式的系數(shù)和指數(shù)。</p><p>  在該函數(shù)中要用到分配空間的函數(shù)malloc()為新建鏈表分配空間。</p><p>  3. void DestroyPolyn(Polyn p)</p><p>  該函數(shù)的功能是銷毀掉創(chuàng)建的兩個鏈表,釋放內(nèi)存。以輔助

24、退出程序。</p><p>  4. void Insert(Polyn p,Polyn h)</p><p>  該函數(shù)功能:將新的節(jié)點p插入到現(xiàn)有鏈表的后面,并確保多項式的指數(shù)exp是升序。將s節(jié)點插入到head所指向的鏈表。在該函數(shù)的操作中,要注意指針是如何移動的。</p><p>  5. Polyn AddPolyn(Polyn pa,Polyn pb

25、)</p><p>  該函數(shù)功能:實現(xiàn)兩個多項式pa、pb相加,并將計算結(jié)果存儲于新建立的pc中,</p><p>  它的原理是將指數(shù)相同的單項式相加,系數(shù)相加后為0,則pa、pb的指針都后移。在加法計算中要求pa,與pb的冪次序都是升序,否則可能得到錯誤的結(jié)果。</p><p>  該函數(shù)調(diào)用了int compare(Polyn a,Polyn b)的結(jié)果,用

26、來判斷多項式在同一指數(shù)下a、b是否有為系數(shù)為0。同樣也使用了malloc()關鍵字,為新鏈表創(chuàng)建空間。</p><p>  6. int compare(Polyn a,Polyn b)</p><p>  該函數(shù)功能:判斷兩個多項式在同一指數(shù)下是否有其中一個為系數(shù)為0。用來輔助加法和乘法運算。</p><p>  7. Polyn SubtractPolyn(

27、Polyn pa,Polyn pb)</p><p>  該函數(shù)功能:實現(xiàn)兩個多項式pa、pb相減,其原理根加法類似,將指數(shù)相同的指數(shù)相減。與加法不同的是在送在減法中,創(chuàng)建了新的鏈表來存放結(jié)果,并返回該鏈表的頭指針。</p><p>  8. void PrintPolyn(Polyn P)</p><p>  該函數(shù)功能:顯示多項式鏈表。在該函數(shù)中較復雜的是如何

28、控制鏈表的輸出,尤其是第一項的輸出,同時還有符號的控制。在輸出第一項時要判斷是不是常數(shù)項,若是,則不要輸出字符x。</p><p>  9. Polyn MultiplyPolyn(Polyn pa,Polyn pb)</p><p>  函數(shù)功能:實現(xiàn)兩個多項式相乘,A(X) * B(x) 。計算時運用單項式與多項式相乘的法則,然后再次運用單項式與多項式相乘的法則。</p>

29、<p><b>  4 系統(tǒng)實現(xiàn)</b></p><p>  該程序?qū)崿F(xiàn)了多項式的創(chuàng)建、多項式的加法、減法、乘法運算以及多項式的清除。為完成這些功能,還用到了一些輔助函數(shù)。</p><p>  下面討論重要函數(shù)具體實現(xiàn)過程及其參數(shù)的意義:</p><p>  1. Polyn CreatePolyn(Polyn head,int

30、m)該函數(shù)的兩個參數(shù),head表示為創(chuàng)建的鏈表的頭指針,m表示為鏈表的長度,即多項式的項數(shù)。定義int i計數(shù),當i<m時,for語句反復提示用戶輸入該多項式的每一項的指數(shù)和系數(shù),并保存。當i=m時,輸入完畢,該鏈表也創(chuàng)建完畢。詳細的實現(xiàn)過程如下:</p><p>  Polyn CreatePolyn(Polyn head,int m){</p><p>  int i;//用來計

31、數(shù)</p><p>  Polyn p;//定義一個p鏈表</p><p>  p=head=(Polyn)malloc(sizeof(struct Polynomial));</p><p>  head->next=NULL;</p><p>  for(i=0;i<m;i++){</p><p>  

32、p=(Polyn)malloc(sizeof(struct Polynomial));//建立新結(jié)點以接收數(shù)據(jù)</p><p>  printf("請輸入第%d項的系數(shù)與指數(shù):",i+1);</p><p>  scanf("%f %d",&p->coef,&p->expn);</p><p>  

33、Insert(p,head); //調(diào)用Insert函數(shù)插入結(jié)點}</p><p>  return head;</p><p>  }//CreatePolyn</p><p>  2. void Insert(Polyn p,Polyn h) 該函數(shù)具有兩個參數(shù),用來實現(xiàn)鏈表的順序排列和合并相同的項。以下是實現(xiàn)插入的關鍵代碼:</p><

34、p>  void Insert(Polyn p,Polyn h){ </p><p>  if(p->coef==0) free(p); //系數(shù)為0的話釋放結(jié)點</p><p>  else{//如果系數(shù)不為0</p><p>  Polyn q1,q2;</p><p>  q1=h;q2=h->ne

35、xt;</p><p>  while(q2&&p->expn<q2->expn){ //查找插入位置</p><p><b>  q1=q2;</b></p><p>  q2=q2->next; }</p><p>  if(q2&&p->expn==

36、q2->expn){ //將指數(shù)相同相合并</p><p>  q2->coef+=p->coef;</p><p><b>  free(p);</b></p><p>  if(!q2->coef){ //系數(shù)為0的話釋放結(jié)點</p><p>  q1->

37、next=q2->next;</p><p>  free(q2); }</p><p><b>  }</b></p><p>  else{ //指數(shù)為新時將結(jié)點插入</p><p>  p->next=q2;</p><p> 

38、 q1->next=p; </p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }//Insert</b></p><p>  3. Polyn AddPolyn(Polyn pa,Polyn pb) 該函數(shù)有兩個參

39、數(shù),其類型均為polyn,分別表示要相加的兩個不同的多項式。其計算的結(jié)果存放在新建的pc所指向的鏈表中。函數(shù)中調(diào)用了int compare(Polyn a,Polyn b)的結(jié)果。下面是實現(xiàn)加法的關鍵代碼:</p><p>  Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多項式a+b,返回其頭指針</p><p>  Polyn qa=pa->n

40、ext;</p><p>  Polyn qb=pb->next;</p><p>  Polyn headc,hc,qc;</p><p>  hc=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結(jié)點</p><p>  hc->next=NULL;</p><p

41、><b>  headc=hc;</b></p><p>  while(qa||qb){</p><p>  qc=(Polyn)malloc(sizeof(struct Polynomial));</p><p>  switch(compare(qa,qb)){</p><p><b>  case

42、 1: {</b></p><p>  qc->coef=qa->coef;</p><p>  qc->expn=qa->expn;</p><p>  qa=qa->next;</p><p><b>  break;</b></p><p><

43、b>  }</b></p><p>  case 0: { </p><p>  qc->coef=qa->coef+qb->coef;</p><p>  qc->expn=qa->expn;</p><p>  qa=qa->next;</p><p>  qb

44、=qb->next;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case -1:{</b></p><p>  qc->coef=qb->coef;</p><p&

45、gt;  qc->expn=qb->expn;</p><p>  qb=qb->next;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }//switch</b></p>

46、<p>  if(qc->coef!=0){</p><p>  qc->next=hc->next;</p><p>  hc->next=qc;</p><p><b>  hc=qc;</b></p><p><b>  }</b></p>&

47、lt;p>  else free(qc);//當相加系數(shù)為0時,釋放該結(jié)點</p><p><b>  }//while</b></p><p>  return headc;</p><p>  }//AddPolyn</p><p>  int compare(Polyn a,Polyn b){</p&g

48、t;<p><b>  if(a&&b){</b></p><p>  if(!b||a->expn>b->expn) return 1;</p><p>  else if(!a||a->expn<b->expn) return -1;</p><p>  else retur

49、n 0;</p><p><b>  }</b></p><p>  else if(!a&&b) return -1;//a多項式已空,但b多項式非空</p><p>  else return 1;//b多項式已空,但a多項式非空</p><p>  }//compare</p><

50、;p>  4. Polyn MultiplyPolyn(Polyn pa,Polyn pb) 該函數(shù)同加法一樣,擁有相同的參數(shù)并且同樣將新建立的鏈表pf的指針返回,用來實現(xiàn)輸出乘法結(jié)果。下面給出關鍵代碼:</p><p>  Polyn MultiplyPolyn(Polyn pa,Polyn pb){</p><p>  Polyn hf,pf;</p><p&

51、gt;  Polyn qa=pa->next;</p><p>  Polyn qb=pb->next;</p><p>  hf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結(jié)點</p><p>  hf->next=NULL;</p><p>  for(;qa;qa=qa

52、->next){</p><p>  for(qb=pb->next;qb;qb=qb->next){</p><p>  pf=(Polyn)malloc(sizeof(struct Polynomial));</p><p>  pf->coef=qa->coef*qb->coef;</p><p> 

53、 pf->expn=qa->expn+qb->expn;</p><p>  Insert(pf,hf);//調(diào)用Insert函數(shù)以合并指數(shù)相同的項</p><p><b>  } </b></p><p><b>  }</b></p><p>  return hf;</

54、p><p>  }//MultiplyPolyn</p><p>  5. 其它函數(shù)的介紹請參見附錄中詳細代碼.</p><p><b>  5 調(diào)試及運行結(jié)果</b></p><p>  該程序在VC6.0中調(diào)試通過,沒有錯誤和警告,運行結(jié)果經(jīng)過檢驗為正確。以下圖5-1即為該程序運行結(jié)果效果圖。圖中采用的是計算多項式4x^

55、5+2x^2+3x和x^10+7x^2的加減乘三種運算進行演示:</p><p>  算法調(diào)試,運行結(jié)果圖 </p><p><b>  6 收獲和體會</b></p><p>  通過這次課程設計練習,使我更深刻地理解了C語言的精髓-----指針的使用。完成整個程序設計有,對指針掌握的更加熟練。</p><p>  同

56、時通過直接對鏈表的操作,加深了對數(shù)據(jù)結(jié)構的理解和認識。并在完成課程設計的過程作主動查閱了相關資料,學到了不少課本上沒有的技術知識。</p><p>  經(jīng)過這次課程設計,我深刻認識到算法在程序設計中的重要性,一個完整的程序總是由若干個函數(shù)構成的,這些相應的函數(shù)體現(xiàn)了算法的基本思想。</p><p>  編程是一件枯燥乏味工作,但是只要認真專研,我們會從中學到很多在課本上學不到或者無法在課堂

57、上掌握的知識,同時也能從中感受到編程的樂趣。興趣是可以培養(yǎng)的,只要堅持下去,面對困難我們總能夠找到解決問題的方法。</p><p>  計算多項式的加、減、乘法運算-----該程序雖然不是很大,這次還是由幾位同學合作才完成這一任務。在這個小組中我是組長,通過分工與合作,使我充分認識到在項目團隊開發(fā)過程中合作的重要性,也更加理解了溝通協(xié)作能力在軟件開發(fā)行業(yè)中的重要性。</p><p>  另

58、外也需要提出的是在這次程序設計的過程中,非常感謝老師對我們的耐心指導。老師在教學過程中表現(xiàn)出來的對學術專研一絲不茍的精神讓我非常有收獲。同樣也是老師的嚴格要求才使得小組成員能夠順利的完成任務。</p><p><b>  附錄</b></p><p>  #include<stdio.h></p><p>  #include<

59、;malloc.h></p><p>  /******************************************************/</p><p>  typedef struct Polynomial{</p><p>  float coef;//系數(shù)</p><p>  int expn;//指數(shù)</

60、p><p>  struct Polynomial *next;//指向下一個結(jié)點</p><p>  }*Polyn,Polynomial; //Polyn為結(jié)點指針類型</p><p>  /**********************************************************/</p><

61、;p>  void Insert(Polyn p,Polyn h){ </p><p>  if(p->coef==0) free(p); //系數(shù)為0的話釋放結(jié)點</p><p>  else{//如果系數(shù)不為0</p><p>  Polyn q1,q2;</p><p>  q1=h;q2=h->n

62、ext;</p><p>  while(q2&&p->expn<q2->expn){ //查找插入位置</p><p><b>  q1=q2;</b></p><p>  q2=q2->next;</p><p><b>  }</b></p&g

63、t;<p>  if(q2&&p->expn==q2->expn){ //將指數(shù)相同相合并</p><p>  q2->coef+=p->coef;</p><p><b>  free(p);</b></p><p>  if(!q2->coef){

64、//系數(shù)為0的話釋放結(jié)點</p><p>  q1->next=q2->next;</p><p><b>  free(q2);</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  e

65、lse{ //指數(shù)為新時將結(jié)點插入</p><p>  p->next=q2;</p><p>  q1->next=p;</p><p><b>  }</b></p><p><b>  }</b></p><p&

66、gt;<b>  }//Insert</b></p><p>  /*********************以下函數(shù)實現(xiàn)建立一個多項式****************/</p><p>  Polyn CreatePolyn(Polyn head,int m){//建立一個頭指針為head、項數(shù)為m的一元多項式</p><p>  //在主程

67、序初始時,先輸入的多項式中的項數(shù)m、n 在這里為m。主程序中的pa、pb在此為head</p><p>  int i;//用來計數(shù)</p><p>  Polyn p;//定義一個p鏈表</p><p>  p=head=(Polyn)malloc(sizeof(struct Polynomial));</p><p>  head->

68、;next=NULL;</p><p>  for(i=0;i<m;i++){</p><p>  p=(Polyn)malloc(sizeof(struct Polynomial));//建立新結(jié)點以接收數(shù)據(jù)</p><p>  printf("請輸入第%d項的系數(shù)與指數(shù):",i+1);</p><p>  sca

69、nf("%f %d",&p->coef,&p->expn);</p><p>  Insert(p,head); //調(diào)用Insert函數(shù)插入結(jié)點</p><p><b>  }</b></p><p>  return head;</p><p>  }//Creat

70、ePolyn</p><p>  /**********************以下函數(shù)實現(xiàn)多項式的銷毀**********************/</p><p>  void DestroyPolyn(Polyn p){//銷毀多項式p</p><p>  Polyn q1,q2;</p><p>  q1=p->next;<

71、;/p><p>  q2=q1->next;</p><p>  while(q1->next){</p><p><b>  free(q1);</b></p><p>  q1=q2;//指針后移</p><p>  q2=q2->next;</p><p&g

72、t;<b>  }</b></p><p><b>  }</b></p><p>  /*******************以下函數(shù)實現(xiàn)顯示輸出多項式**************** ***/</p><p>  void PrintPolyn(Polyn P){ </p><p>  Poly

73、n q=P->next; </p><p>  int flag=1;//項數(shù)計數(shù)器</p><p>  if(!q) { //若多項式為空,輸出0</p><p>  putchar('0'); </p><p>  printf("\n");</p><p><b&g

74、t;  return;</b></p><p><b>  } </b></p><p>  while (q){</p><p>  if(q->coef>0&&flag!=1) putchar('+'); //系數(shù)大于0且不是第一項</p><p>  if

75、(q->coef!=1&&q->coef!=-1){//系數(shù)非1或-1的普通情況</p><p>  printf("%g",q->coef); </p><p>  if(q->expn==1) putchar('X');</p><p>  else if(q->expn) pri

76、ntf("X^%d",q->expn);</p><p><b>  }</b></p><p><b>  else{</b></p><p>  if(q->coef==1){</p><p>  if(!q->expn) putchar('1

77、9;); </p><p>  else if(q->expn==1) putchar('X'); </p><p>  else printf("X^%d",q->expn);</p><p><b>  }</b></p><p>  if(q->coef==-1

78、){</p><p>  if(!q->expn) printf("-1"); </p><p>  else if(q->expn==1) printf("-X"); </p><p>  else printf("-X^%d",q->expn);</p><p>

79、;<b>  }</b></p><p><b>  }</b></p><p>  q=q->next; </p><p><b>  flag++;</b></p><p><b>  }//while</b></p><p&

80、gt;  printf("\n");</p><p>  }//PrintPolyn</p><p>  /*********************在下面的輔助乘法和加法運算****************/</p><p>  int compare(Polyn a,Polyn b){</p><p><b>

81、;  if(a&&b){</b></p><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

82、><b>  }</b></p><p>  else if(!a&&b) return -1;//a多項式已空,但b多項式非空</p><p>  else return 1;//b多項式已空,但a多項式非空</p><p>  }//compare</p><p>  /************

83、*********以下函數(shù)實現(xiàn)加法*********************/</p><p>  Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多項式a+b,返回其頭指針</p><p>  Polyn qa=pa->next;</p><p>  Polyn qb=pb->next;</p><

84、p>  Polyn headc,hc,qc;</p><p>  hc=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結(jié)點</p><p>  hc->next=NULL;</p><p><b>  headc=hc;</b></p><p>  while(q

85、a||qb){</p><p>  qc=(Polyn)malloc(sizeof(struct Polynomial));</p><p>  switch(compare(qa,qb)){</p><p><b>  case 1:</b></p><p><b>  {</b></p&g

86、t;<p>  qc->coef=qa->coef;</p><p>  qc->expn=qa->expn;</p><p>  qa=qa->next;</p><p><b>  break;</b></p><p><b>  }</b></

87、p><p><b>  case 0:</b></p><p><b>  { </b></p><p>  qc->coef=qa->coef+qb->coef;</p><p>  qc->expn=qa->expn;</p><p>  qa=

88、qa->next;</p><p>  qb=qb->next;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case -1:</b></p><p><b>

89、;  {</b></p><p>  qc->coef=qb->coef;</p><p>  qc->expn=qb->expn;</p><p>  qb=qb->next;</p><p><b>  break;</b></p><p><b

90、>  } </b></p><p><b>  }//switch</b></p><p>  if(qc->coef!=0){</p><p>  qc->next=hc->next;</p><p>  hc->next=qc;</p><p><

91、;b>  hc=qc;</b></p><p><b>  }</b></p><p>  else free(qc);//當相加系數(shù)為0時,釋放該結(jié)點</p><p><b>  }//while</b></p><p>  return headc;</p>&l

92、t;p>  }//AddPolyn</p><p>  /********************以下函數(shù)實現(xiàn)減法***********************/</p><p>  Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解并建立多項式a+b,返回其頭指針</p><p>  Polyn h=pb;</p&g

93、t;<p>  Polyn p=pb->next;</p><p><b>  Polyn pd;</b></p><p>  while(p){ //將pb的系數(shù)取反</p><p>  p->coef*=-1;</p><p>  p=p->next;</p&

94、gt;<p><b>  }</b></p><p>  pd=AddPolyn(pa,h);</p><p>  for(p=h->next;p;p=p->next) //恢復pb的系數(shù)</p><p>  p->coef*=-1;</p><p>  return pd;<

95、/p><p>  }//SubtractPolyn</p><p>  /*******************以下函數(shù)實現(xiàn)乘法*********************/</p><p>  Polyn MultiplyPolyn(Polyn pa,Polyn pb){//求解并建立多項式a*b,返回其頭指針(該函數(shù)實現(xiàn)乘法)</p><p>

96、  Polyn hf,pf;</p><p>  Polyn qa=pa->next;</p><p>  Polyn qb=pb->next;</p><p>  hf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結(jié)點</p><p>  hf->next=NULL;<

97、/p><p>  for(;qa;qa=qa->next){</p><p>  for(qb=pb->next;qb;qb=qb->next){</p><p>  pf=(Polyn)malloc(sizeof(struct Polynomial));</p><p>  pf->coef=qa->coef*qb

98、->coef;</p><p>  pf->expn=qa->expn+qb->expn;</p><p>  Insert(pf,hf);//調(diào)用Insert函數(shù)以合并指數(shù)相同的項</p><p><b>  }</b></p><p><b>  }</b></p&

99、gt;<p>  return hf;</p><p>  }//MultiplyPolyn</p><p>  /********************主函數(shù)實現(xiàn)顯示與功能選擇**********************/</p><p>  int main(){</p><p>  int m,n,flag=0;//m、

100、n為分別為a、b兩個多項式的項數(shù)</p><p>  Polyn pa=0,pb=0,pc,pd,pf;//定義各式的頭指針,pa與pb在使用前付初值NULL</p><p>  //pc頭指針所在的多項式用在加法中作為結(jié)果,pd用在加法中,pf乘法中</p><p>  printf("****************歡迎使用一元多項式運算程序*****

101、************\n");</p><p>  printf("請輸入第一個多項式a的項數(shù):");</p><p>  scanf("%d",&m);</p><p>  pa=CreatePolyn(pa,m);//建立第一個多項式a</p><p>  printf(&qu

102、ot;請輸入第二個多項式b的項數(shù):");</p><p>  scanf("%d",&n);</p><p>  pb=CreatePolyn(pb,n);//建立第二個多項式b</p><p><b>  //輸出菜單</b></p><p>  printf("****

103、******************************************\n");</p><p>  printf("情選擇您要進行的操作:\n\t1.輸出多項式a和b\n\t2.建立多項式a+b\n\t3.建立多項式a-b\n");</p><p>  printf("\t4.計算多項式a*b的值\n\t5.退出\n");&

104、lt;/p><p>  for(;;flag=0){</p><p>  printf("\n");</p><p>  scanf("%d",&flag);</p><p>  if(flag==1){</p><p>  printf("多項式a:")

105、;PrintPolyn(pa);</p><p>  printf("多項式b:");PrintPolyn(pb);continue;</p><p><b>  }</b></p><p>  if(flag==2){</p><p>  pc=AddPolyn(pa,pb);</p>

106、<p>  printf("多項式a+b:");PrintPolyn(pc);</p><p>  DestroyPolyn(pc);continue;</p><p><b>  }</b></p><p>  if(flag==3){</p><p>  pd=SubtractPoly

107、n(pa,pb);</p><p>  printf("多項式a-b:");PrintPolyn(pd);</p><p>  DestroyPolyn(pd);continue;</p><p><b>  }</b></p><p>  if(flag==4){</p><p&

108、gt;  pf=MultiplyPolyn(pa,pb);</p><p>  printf("多項式a*b:");PrintPolyn(pf);</p><p>  DestroyPolyn(pf);continue;</p><p><b>  }</b></p><p>  if(flag==5

109、) break;</p><p>  if(flag<1||flag>5) printf("Error!!!\n");continue;</p><p><b>  }//for</b></p><p>  DestroyPolyn(pa);</p><p>  DestroyPolyn(

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論