2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  《數據結構》課程設計</p><p>  題 目 一元多項式的實現</p><p>  學 號 </p><p>  學生姓名 </p><p>  院 系 計算機</p><p>  專 業(yè) </p

2、><p>  指導教師 </p><p>  二O一二 年 12 月 17 日</p><p><b>  需求分析</b></p><p>  建立一元多項式并按照指數降序排列輸出多項式,將一元多項式輸入并存儲在內存中,能夠完成兩個多項式的加減運算并輸出結果</p><p&

3、gt;<b>  概要設計</b></p><p>  存儲結構:一元多項式的表示在計算機內可以用鏈表來表示,為了節(jié)省存儲空間,只存儲多項式中系數非零的項。鏈表中的每一個結點存放多項式的一個系數非零項,它包含三個域,分別存放該項的系數、指數以及指向下一個多項式項結點的指針。創(chuàng)建一元多項式鏈表,對一元多項式的運算中會出現的各種可能情況進行分析,實現一元多項式的相加、相減操作。</p>

4、;<p><b>  基本算法:</b></p><p><b>  1、輸入輸出</b></p><p> ?。?)功能:將要進行運算的多項式輸入輸出。</p><p> ?。?)數據流入:要輸入的多項式的系數與指數。</p><p> ?。?)數據流出:合并同類項后的多項式。<

5、;/p><p>  (4)程序流程圖:多項式輸入流程圖如圖1所示。</p><p> ?。?)測試要點:輸入的多項式是否正確,若輸入錯誤則重新輸入</p><p><b>  2、多項式的加法</b></p><p> ?。?)功能:將兩多項式相加。</p><p> ?。?)數據流入:輸入函數。&l

6、t;/p><p>  (3)數據流出:多項式相加后的結果。</p><p> ?。?)程序流程圖:多項式的加法流程圖如圖2所示。</p><p> ?。?)測試要點:兩多項式是否為空,為空則提示重新輸入,否則,進行運算。</p><p><b>  圖表 2</b></p><p><b>

7、  3、多項式的減法</b></p><p> ?。?)功能:將兩多項式相減。</p><p> ?。?)數據流入:調用輸入函數。</p><p> ?。?)數據流出:多項式相減后的結果。</p><p> ?。?)程序流程圖:多項式的減法流程圖如圖3所示。</p><p> ?。?)測試要點:兩多項式是否

8、為空,為空則提示重新輸入,否則,進行運算。</p><p><b>  詳細設計 </b></p><p>  #include<stdio.h></p><p>  #include<malloc.h></p><p>  typedef struct Polynomial{</p>

9、;<p>  float coef;</p><p><b>  int expn;</b></p><p>  struct Polynomial *next;</p><p>  }*Polyn,Polynomial; //Polyn為結點指針類型</p><p>  voi

10、d Insert(Polyn p,Polyn h){ </p><p>  if(p->coef==0) free(p); //系數為0的話釋放結點</p><p><b>  else{</b></p><p>  Polyn q1,q2;</p><p>  q1=h;q2=h->ne

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

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

13、/系數為0的話釋放結點</p><p>  q1->next=q2->next;</p><p><b>  free(q2);</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  el

14、se{ //指數為新時將結點插入</p><p>  p->next=q2;</p><p>  q1->next=p;</p><p><b>  }</b></p><p><b>  }</b></p><p&g

15、t;<b>  }//Insert</b></p><p>  Polyn CreatePolyn(Polyn head,int m){//建立一個頭指針為head、項數為m的一元多項式</p><p><b>  int i;</b></p><p><b>  Polyn p;</b></p

16、><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(sizeof(struct Polynomial));//建立

17、新結點以接收數據</p><p>  printf("請輸入第%d項的系數與指數:",i+1);</p><p>  scanf("%f %d",&p->coef,&p->expn);</p><p>  Insert(p,head); //調用Insert函數插入結點</p>&

18、lt;p><b>  }</b></p><p>  return head;</p><p>  }//CreatePolyn</p><p>  void DestroyPolyn(Polyn p){//銷毀多項式p</p><p>  Polyn q1,q2;</p><p>  q1

19、=p->next;</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;<

20、/p><p><b>  }</b></p><p><b>  }</b></p><p>  void PrintPolyn(Polyn P){ </p><p>  Polyn q=P->next; </p><p>  int flag=1;//項數計數器</

21、p><p>  if(!q) { //若多項式為空,輸出0</p><p>  putchar('0'); </p><p>  printf("\n");</p><p><b>  return;</b></p><p><b>  } </

22、b></p><p>  while (q){</p><p>  if(q->coef>0&&flag!=1) putchar('+'); //系數大于0且不是第一項</p><p>  if(q->coef!=1&&q->coef!=-1){//系數非1或-1的普通情況</p&g

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

24、;  }</b></p><p><b>  else{</b></p><p>  if(q->coef==1){</p><p>  if(!q->expn) putchar('1'); </p><p>  else if(q->expn==1) putchar(

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

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

27、></p><p>  q=q->next; </p><p><b>  flag++;</b></p><p><b>  }//while</b></p><p>  printf("\n");</p><p>  }//PrintPol

28、yn</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><p>  else if(!a||a->e

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

30、b多項式已空,但a多項式非空</p><p>  }//compare</p><p>  Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多項式a+b,返回其頭指針</p><p>  Polyn qa=pa->next;</p><p>  Polyn qb=pb->next;</p&g

31、t;<p>  Polyn headc,hc,qc;</p><p>  hc=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點</p><p>  hc->next=NULL;</p><p><b>  headc=hc;</b></p><p> 

32、 while(qa||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>

33、</p><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&

34、gt;</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&

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

36、<b>  {</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&

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

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

39、><p>  }//AddPolyn</p><p>  Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解并建立多項式a+b,返回其頭指針</p><p>  Polyn h=pb;</p><p>  Polyn p=pb->next;</p><p><b>  P

40、olyn pd;</b></p><p>  while(p){ //將pb的系數取反</p><p>  p->coef*=-1;</p><p>  p=p->next;</p><p><b>  }</b></p><p>  pd=AddPol

41、yn(pa,h);</p><p>  for(p=h->next;p;p=p->next) //恢復pb的系數</p><p>  p->coef*=-1;</p><p>  return pd;</p><p>  }//SubtractPolyn</p><p>  int main()

42、{</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>  printf("請輸入a的項數:");&

43、lt;/p><p>  scanf("%d",&m);</p><p>  pa=CreatePolyn(pa,m);//建立多項式a</p><p>  printf("請輸入b的項數:");</p><p>  scanf("%d",&n);</p>&

44、lt;p>  pb=CreatePolyn(pb,n);//建立多項式a</p><p><b>  //輸出菜單</b></p><p>  printf("**********************************************\n");</p><p>  printf("操作提示:

45、\n\t1.輸出多項式a和b\n\t2.建立多項式a+b\n\t3.建立多項式a-b\n");</p><p>  printf("\t4.退出\n**********************************************\n");</p><p>  for(;;flag=0){</p><p>  printf(&

46、quot;執(zhí)行操作:");</p><p>  scanf("%d",&flag);</p><p>  if(flag==1){</p><p>  printf("多項式a:");PrintPolyn(pa);</p><p>  printf("多項式b:")

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

48、;<p>  DestroyPolyn(pc);continue;</p><p><b>  }</b></p><p>  if(flag==3){</p><p>  pd=SubtractPolyn(pa,pb);</p><p>  printf("多項式a-b:");Prin

49、tPolyn(pd);</p><p>  DestroyPolyn(pd);continue;</p><p><b>  }</b></p><p>  if(flag==4) break;</p><p>  if(flag<1||flag>4) printf("Error!!!\n"

50、;);continue;</p><p><b>  }//for</b></p><p>  DestroyPolyn(pa);</p><p>  DestroyPolyn(pb);</p><p><b>  return 0;</b></p><p><b>

51、;  }</b></p><p><b>  調試結果</b></p><p><b>  測試的數據及結果</b></p><p>  算法的時間復雜度及改進</p><p>  算法的時間復雜度:一元多項式的加法運算的時間復雜度為O(m+n),減法運算的時間復雜度為O(m-n),其中

52、m,n分別表示二個一元多項式的項數。</p><p>  問題和改進思想:在設計該算法時,出現了一些問題,例如在建立鏈表時頭指針的設立導致了之后運用到相關的指針時沒能很好的移動指針出現了數據重復輸出或是輸出系統(tǒng)缺省值,不能實現算法。實現加法時該鏈表并沒有向通常那樣通過建立第三個鏈表來存放運算結果,而是再度利用了鏈表之一來進行節(jié)點的比較插入刪除等操作。為了使輸入數據按指數降序排列,可在數據的輸入后先做一個節(jié)點的排序

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論