數(shù)據(jù)結構實驗報告,一元多項式_第1頁
數(shù)據(jù)結構實驗報告,一元多項式_第2頁
數(shù)據(jù)結構實驗報告,一元多項式_第3頁
數(shù)據(jù)結構實驗報告,一元多項式_第4頁
數(shù)據(jù)結構實驗報告,一元多項式_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 數(shù)據(jù)結構課程設計報告 課 題: 一元多項式 姓 名: XX 學 號: 201417030218 專業(yè)班級: XXXX 指導教師: XXXX 設計時間: 2015年12月30日星期三 評閱意見:評定成績: 指導老師簽名: 年 月 日 目錄一、 任務目標 3二、 概要設計 4三、 詳細設計 6四、 調試分析 8五、 源程序代碼 8六、 程序運行效果圖與說明 15七、 本次實驗小結 16八、 參考文獻 16一丶任務目標分析 (1) a.能夠按照指數(shù)降序排列建立并輸出多項式b.能夠完成兩個多項式的相加,相減,并將結果輸入要求:程序所能達到的功能: a.實現(xiàn)一元多項式的輸入;b.實現(xiàn)一元多項式的輸出;

2、 c.計算兩個一元多項式的和并輸出結果; d.計算兩個一元多項式的差并輸出結果;除任務要求外新增乘法:計算兩個一元多項式的乘積并輸出結果(2)輸入的形式和輸入值的范圍:輸入要求:分行輸入,每行輸入一項,先輸入多項式的指數(shù),再輸入多項式的系數(shù),以0 0為結束標志,結束一個多項式的輸入。輸入形式:2 3-1 23 01 20 0輸入值的范圍:系數(shù)為int型,指數(shù)為float型(3)輸出的形式:第一行輸出多項式1;第二行輸出多項式2;第三行輸出多項式1與多項式2相加的結果多項式;第四行輸出多項式1與多項式2相減的結果多項式;第五行輸出多項式1與多項式2相乘的結果多項式二、概要設計 程序實現(xiàn)a. 功能

3、:將要進行運算的二項式輸入輸出;b. 數(shù)據(jù)流入:要輸入的二項式的系數(shù)與指數(shù);c. 數(shù)據(jù)流出:合并同類項后的二項式;d. 程序流程圖:二項式輸入流程圖;e. 測試要點:輸入的二項式是否正確,若輸入錯誤則重新輸入。流程圖:開始申請結點空間輸入二項式各項的系數(shù) x, 指數(shù) y輸入二項式的項數(shù)輸出已輸入的二項式是否輸入正確合并同類項結束是否17三、詳細設計(1):存儲結構 一元多項式的表示在計算機內可以用鏈表來表示,為了節(jié)省存儲空間,只存儲多項式中系數(shù)非零的項。鏈表中的每一個結點存放多項式的一個系數(shù)非零項,它包含三個域,分別存放該項的系數(shù)、指數(shù)以及指向下一個多項式項結點的指針。創(chuàng)建一元多項式鏈表,對一

4、元多項式的運算中會出現(xiàn)的各種可能情況進行分析,實現(xiàn)一元多項式的相加、相減操作。(2):數(shù)據(jù)鏈表由于采用鏈表的方法,我們可以建立3條鏈;一條用于存放多項式HA,一條用于存放多項式HB,還有一條用于存放新形成的HC。此外,我們的程序應具備以下幾個功能:建立鏈表,撤銷鏈表,打印鏈表,按要求插入一個新的結點,復制鏈表;為了使上面程序結構分析進一步細化,為了使程序結構更加清晰,我們可以把上面的內容都編寫成函數(shù)形式。1、建立鏈表該程序建立鏈表的函數(shù)與大多數(shù)建立鏈表的操作基本一致,但是由于實體是一元多項式的關系。我們更希望,在處理客戶輸入的數(shù)據(jù)的同時,能對數(shù)據(jù)進行適當?shù)奶幚?。也就是?shù)學上所說的,“對一元多項

5、式進行化簡,并按照降冪排序?!庇捎谠谇懊娴木毩曋?,我們得知,在鏈表中插入一個結點的函數(shù),具有對鏈表的成員進行排序與合并的功能。如此一來,我們可以巧妙地處理,在建立鏈表的同時,調用”在鏈表中插入一個結點的函數(shù)”,對新建立的鏈表進行化簡。 該函數(shù)的算法描述如下;聲明指針變量,并作為頭指針的指針變量賦初值NULL;創(chuàng)建一個新的結點,并輸入鏈表的信息;若輸入的系數(shù)值與函數(shù)值同不為0時,調用”在鏈表中插入一個結點的insert函數(shù)”,將結點插入鏈表中;(注:這里建立鏈表的函數(shù)與以往的不同,我們是通過假想有一條空鏈,不斷地調用insert函數(shù)來實現(xiàn)建立鏈表的功能。簡言之;鏈表中成員的鏈接全都靠insert

6、函數(shù)來實現(xiàn),而該函數(shù)僅僅是不斷地提供建立鏈表所要的數(shù)據(jù)罷了。)若還要繼續(xù)插入結點,轉到步驟2繼續(xù)進行;否則,程序結束,把頭指針返回主程序。2、撤銷鏈表撤銷鏈表是為了把鏈表所占用的地址回收起來,防止造成浪費。我們該程序可以采用從鏈表的始端逐步銷去結點。在這個過程中,我們需要鏈表的頭地址作為形式參數(shù),還需要建立一個指針用來指向新頭地址。該函數(shù)的算法描述如下:指針變量;并把頭地址指針賦給新指針變量;把頭地址指針指向下一個結點;刪除新指針變量;若還要繼續(xù)刪除結點,轉到步驟1繼續(xù)執(zhí)行;否則,結束程序。3、按要求插入一個新的結點由于前面的建立鏈表的creat函數(shù),調用了該函數(shù),所以我們這個函數(shù)的設計思想也

7、明朗多了,由于建立的鏈表是有序的,并且需要合并指數(shù)相同的結點,所以要新結點需要按指數(shù)值降冪的順序插入鏈表中。判斷鏈表是否為空,如果為空則直接插入即可;否則按照要插入結點指數(shù)值的大小在鏈表中尋找他要插入的位置,對于插入位置有第一個節(jié)點、最后一個結點和鏈表中間這三種情況分別進行處理。函數(shù)的形式參數(shù):鏈表的頭地址,指向要插入結點的指針;返回結果:插入結點后新鏈表的頭地址。該函數(shù)的算法描述如下:聲明指針變量并令它指向連頭結點;判斷指向要插入結點的指針是否為空;如果是,則不需要插入新結點,直接返回頭地址,程序結束;否則再判斷鏈表是否為空;如果是,則直接插入結點,然后返回鏈表的頭地址,程序結束;否則,在鏈

8、表中尋找待插入結點的插入位置:1,若鏈表中存在著與“插入的結點”的指數(shù)相同的情況,我們依然插入鏈中,只是把該結點的系數(shù)修改為”0”,把鏈中的結點系數(shù)修改為”兩系數(shù)之和”。(為了方便,我們并沒有把結點進行刪除的操作,只是在輸出的操作里加入權限設置。) 2,若鏈表中不存在著與“插入的結點”的指數(shù)相同的情況,我們正常地插入鏈中。返回插入結點后鏈表的頭地址,程序結束。4、主函數(shù)主函數(shù)主要負責輸出界面的指引語句,并合理地調用各個函數(shù),還要有適當?shù)难h(huán)操作以及停止循環(huán)的語句,以致可以方便地達到合并兩個一元多項式的功能。四、調試分析(1)調試過程中遇到的問題是如何解決的以及對設計與實現(xiàn)的回顧討論和分析:在輸

9、入諸如“0,3”,“2,0”時,程序無法正常運行或總是出錯.解決:對指數(shù)或系數(shù)為0的情況應單獨討論。為此,建立了delZeroCoef函數(shù)來解決問題。(2)算法的時間復雜度及改進算法的時間復雜度:一元多項式的加法運算的時間復雜度為O(m+n),減法運算的時間復雜度為O(m-n),其中m,n分別表示二個一元多項式的項數(shù)。問題和改進思想:在設計該算法時,出現(xiàn)了一些問題,例如在建立鏈表時頭指針的設立導致了之后運用到相關的指針時沒能很好的移動指針出現(xiàn)了數(shù)據(jù)重復輸出或是輸出系統(tǒng)缺省值,不能實現(xiàn)算法。實現(xiàn)加法時該鏈表并沒有向通常那樣通過建立第三個鏈表來存放運算結果,而是再度利用了鏈表之一來進行節(jié)點的比較插

10、入刪除等操作。為了使輸入數(shù)據(jù)按指數(shù)降序排列,可在數(shù)據(jù)的輸入后先做一個節(jié)點的排序函數(shù),通過對鏈表排序后再進行之后加減運算。五、 源程序代碼#include<stdlib.h> #include<stdio.h> #include<ctype.h> typedef struct LNode float coef; int expn; struct LNode *next; LNode; LNode* InitPolyn(LNode *La,int n) if(n <= 0) return NULL; LNode *h = La = (LNode*)mall

11、oc(sizeof(LNode), *Lb; La->coef = 0.0; int i; printf("依次輸入%d個非零項(每項前一個為系數(shù),后一個為指數(shù))n",n); for (i = 1; i <= n; +i) scanf("%f%d",&La->coef,&La->expn); if(La->coef) Lb = La; La = La->next = (LNode*)malloc(sizeof(LNode); Lb->next = NULL; free(La); return h;

12、 LNode* selsort(LNode *h) LNode *g, *La, *Lb; if(!h) return NULL; float f; int i, fini = 1; for(g = h;g->next&&fini;g = g->next) fini = 0; for(La = h,Lb = h->next;Lb;La = La->next,Lb = Lb->next) if (La->expn < Lb->expn) f = La->coef;i = La->expn; La->coef = L

13、b->coef;La->expn = Lb->expn; Lb->coef = f;Lb->expn = i; fini = 1; for(g = h,La = g->next;La;) if(g->expn=La->expn) g->coef += La->coef; g->next = La->next; Lb = La; La = La->next; free(Lb); else if(g->next) g = g->next; La = La->next; return h; void Pr

14、intfPoly(LNode *La) LNode *Lb = La; if(!Lb) putchar('0'); return; if(Lb->coef!=1) printf("%g",Lb->coef); if(Lb->expn=1) putchar('X'); else if(Lb->expn) printf("X%d",Lb->expn); else if(!Lb->expn) putchar('1'); else if(Lb->expn=1) putcha

15、r('X'); else printf("X%d",Lb->expn); Lb = Lb->next; while (Lb) if(Lb->coef > 0) putchar('+'); if(Lb->coef!=1) printf("%g",Lb->coef); if(Lb->expn=1) putchar('X'); else if(Lb->expn) printf("X%d",Lb->expn); else if(!Lb->

16、;expn) putchar('1'); else if(Lb->expn=1) putchar('X'); else printf("X%d",Lb->expn); Lb = Lb->next; Compare(LNode *a, LNode *b) if (a->expn < b->expn) return -1; if (a->expn > b->expn) return 1; return 0; LNode* AddPolyn(LNode *Pa, LNode *Pb) LNode

17、 *h, *qa = Pa, *qb = Pb, *La, *Lb; float sum; h = La = (LNode*)malloc(sizeof(LNode); La->next = NULL; while (qa && qb) switch (Compare(qa,qb) case -1: La->next = qb; La = qb; qb = qb->next; break; case 0: sum = qa->coef + qb->coef; if (sum != 0.0) La->next = qa; qa->coef

18、 = sum; La = qa; qa = qa->next; else Lb = qa; qa = qa->next; free(Lb); Lb = qb; qb = qb->next; free(Lb); break; case 1: La->next = qa; La = qa; qa = qa->next; break; if (Pa) La->next = qa; if (Pb) La->next = qb; Lb = h; h = h->next; free(Lb); return h; LNode* Add(LNode *Pa, L

19、Node *Pb) int n; puts("再輸入1個一元多項式的項數(shù)"); scanf("%d",&n); Pb = InitPolyn(Pb,n); Pb = selsort(Pb); PrintfPoly(Pa); if(Pb && Pb->coef>0) printf(" + "); PrintfPoly(Pb); Pa = AddPolyn(Pa,Pb); printf(" = "); Pa = selsort(Pa); PrintfPoly(Pa); return

20、Pa; LNode* SubtractPolyn(LNode *Pa, LNode *Pb) LNode *La = Pb; while(La) La->coef *= -1; La = La->next; return AddPolyn(Pa,Pb); LNode* Subtract(LNode *Pa, LNode *Pb) int n; puts("n再輸入1個一元多項式的項數(shù)"); scanf("%d",&n); Pb = InitPolyn(Pb,n); Pb = selsort(Pb); PrintfPoly(Pa); p

21、rintf(" - "); putchar('(');PrintfPoly(Pb);putchar(')'); Pa = SubtractPolyn(Pa,Pb); printf(" = "); Pa = selsort(Pa); PrintfPoly(Pa); return Pa; LNode* MultiplyPolyn(LNode *Pa, LNode *Pb) if(!Pb) return NULL; LNode *pa = Pa, *p, *q, *r, *s, *t; r = p = (LNode*)mallo

22、c(sizeof(LNode); while(pa) p->coef = pa->coef; p->expn = pa->expn; q = p; p = p->next = (LNode*)malloc(sizeof(LNode); pa = pa->next; q->next = NULL; free(p); pa = Pa; t = s = (LNode*)malloc(sizeof(LNode); while(pa) q = s; s = s->next = (LNode*)malloc(sizeof(LNode); pa = pa-&g

23、t;next; q->next = NULL; free(s); pa = Pa; while(pa) pa->coef *= Pb->coef; pa->expn += Pb->expn; pa = pa->next; Pb = Pb->next; while(Pb) p = r; s = t; while(p) s->coef = p->coef * Pb->coef; s->expn = p->expn + Pb->expn; p = p->next; s = s->next; Pa = AddPo

24、lyn(Pa,t); Pb = Pb->next; return Pa; LNode* Multiply(LNode *Pa, LNode *Pb) int n; puts("n再輸入1個一元多項式的項數(shù)"); scanf("%d",&n); Pb = InitPolyn(Pb,n); Pb = selsort(Pb); putchar('(');PrintfPoly(Pa);putchar(')'); printf("×"); putchar('(');Prin

25、tfPoly(Pb);putchar(')'); printf(" = "); Pa = MultiplyPolyn(Pa,Pb); Pa = selsort(Pa); PrintfPoly(Pa); return Pa; void main() LNode *A,*B; char s2; int i,n; printf("tttOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOn"); printf("ttt 一元多項式計算n "); printf("tttOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOn"); printf("ttt # 王偉 #n");puts("n輸入1個一元多項式的項數(shù)"); scanf("%d",&n); A = InitPolyn(A,n); A = selsort(A); PrintfPoly(A); p: puts(&qu

溫馨提示

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

評論

0/150

提交評論