一元多項式相加完整實驗報告_第1頁
一元多項式相加完整實驗報告_第2頁
一元多項式相加完整實驗報告_第3頁
一元多項式相加完整實驗報告_第4頁
一元多項式相加完整實驗報告_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上 一元多項式相加 實驗報告 一元多項式的相加 一 實驗內(nèi)容根據(jù)所學(xué)的數(shù)據(jù)結(jié)構(gòu)中線性結(jié)構(gòu)(線性表)的邏輯特性和物理特性及相關(guān)算法,應(yīng)用于求解一個具體的實際問題-兩個多項式相加二 需求分析1掌握線性結(jié)構(gòu)的邏輯特性和物理特性。2建立一元多項式。3將一元多項式輸入,并存儲在內(nèi)存中,并按照指數(shù)降序排列輸出多項式。4能夠完成兩個多項式的加減運算,并輸出結(jié)果。三 概要設(shè)計1 本程序所用到的抽象數(shù)據(jù)類型: typedef OrderedLinkList polynomial; / 用帶表頭結(jié)點的有序鏈表表示多項式結(jié)點的數(shù)據(jù)元素類型定義為:typedef struct / 項的表示 f

2、loat coef; / 系數(shù) int expn; / 指數(shù) term, ElemType; Void AddPolyn(polynomail&Pa,polynomail&Pb) Position GetHead() Position NextPos(LinkList L,Link p) Elem GetCurElem(Link p) int cmp(term a term b) Status SetCurElem(Link&p, ElemType e) Status DelFirst(Link h, Link &q) Status ListEmpty(Link

3、List L) Status Append(LinkList&L, Link S) FreeNode()2 存儲結(jié)構(gòu)一元多項式的表示在計算機內(nèi)用鏈表來實現(xiàn),同時為了節(jié)省存儲空間,只存儲其中非零的項,鏈表中的每個節(jié)點存放多項式的系數(shù)非零項。它包含三個域,分別存放多項式的系數(shù),指數(shù),以及指向下一個項的指針。序數(shù)coef指數(shù)exp指針域next創(chuàng)建一元多項式鏈表,對運算中可能出現(xiàn)的各種情況進(jìn)行分析,實現(xiàn)一元多項式的相加相減操作。3 模塊劃分a) 主程序;2)初始化單鏈表;3)建立單鏈表; 4)相加多項式4 主程序流程圖開始申請結(jié)點空間輸入多項式各項的系數(shù)X,指數(shù)Y輸出已輸出的多項式合并同類項

4、結(jié)束是否輸入正確 否四 詳細(xì)設(shè)計根據(jù)一元多項式相加的運算規(guī)則:對于兩個一元多項式中所有指數(shù)相同的項,對應(yīng)系數(shù)相加,若其和不為零,則構(gòu)成“和多項式”中的一項,對于兩個一元多項式中所有指數(shù)不相同的項,則分別復(fù)抄到“和多項式”中去。核心算法PolyAdd是把分別由pa和pb所指的兩個多項式相加,結(jié)果為pa所指的多項式。運算規(guī)則如下:相加時,首先設(shè)兩個指針變量qa和qb分別從多項式的首項開始掃描(見圖2-5-1),比較qa和qb所指結(jié)點指數(shù)域的值,可能出現(xiàn)下列三種情況之一:(1)qa->exp大于qb->exp,則qa繼續(xù)向后掃描。(2)qa->exp等于qb->exp,則將其

5、系數(shù)相加。若相加結(jié)果不為零,將結(jié)果放入qa->coef中,并刪除qb所指結(jié)點,否則同時刪除qa和qb所指結(jié)點。然后qa、qb繼續(xù)向后掃描。(3)qa->exp小于qb->exp,則將qb所指結(jié)點插入qa所指結(jié)點之前,然后qa、qb繼續(xù)向后掃描。掃描過程一直進(jìn)行到qa或qb有一個為空為止,然后將有剩余結(jié)點的鏈表接在結(jié)果表上。所得pa指向的鏈表即為兩個多項式之和。五 源程序代碼#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define NULL 0typedef struct

6、NODE float coef; /系數(shù) int expn; /指數(shù) struct NODE *next; NODE;NODE *Creat(int n);void print(NODE *head);NODE *AddPolyn(NODE *head1, NODE *head2);NODE *Delfirst(NODE *head, NODE *q);void InsertBefore(NODE *p1, NODE *p2);int compare(int a, int b);main() NODE *head1, *head2, *head3; int n1, n2; printf(&qu

7、ot;請輸入你需要的多項數(shù)的數(shù)目 n1 : "); scanf("%d", &n1); head1 = Creat(n1); printf("第一個多項式的顯示 : n"); print(head1); printf("n請輸入你需要的多項數(shù)的數(shù)目 n2 : "); scanf("%d", &n2); head2 = Creat(n2); printf("n第二個多項式的顯示 : n"); print(head2); head3 = AddPolyn(head1, he

8、ad2); printf("n合并后的多項式的顯示 : n"); print(head3); printf("n");/*創(chuàng)建鏈表*/NODE *Creat(int n) NODE *current, *previous, *head; int i; head = (NODE *)malloc(sizeof(NODE); /*創(chuàng)建頭結(jié)點*/ previous = head; for(i = 0; i < n; i+) current = (NODE *)malloc(sizeof(NODE); printf("請輸入系數(shù)和指數(shù) : &qu

9、ot;); scanf("%f%d", &current->coef, &current->expn); previous->next = current; previous = current; previous->next = NULL; return head;/*一元多項式的想加,總體考慮,可分qa的指數(shù)比qb小,或等于pb(如果系數(shù)相加等于0和不等于0),或大于pb里面由InsertBefore和Delfirst兩個小模塊組成一部分*/NODE *AddPolyn(NODE *head1, NODE *head2) NODE

10、 *ha, *hb, *qa, *qb; int a, b; float sum; ha = head1; /*ha和hb指向頭結(jié)點*/ hb = head2; qa = ha->next; /*qa和qb指向頭結(jié)點的下一個結(jié)點*/ qb = hb->next; while(qa && qb) /*qa和qb均非空*/ a = qa->expn; b = qb->expn; switch(compare(a, b) case -1 : /*qa->expn < qb->expn*/ ha = qa; qa = qa->next;

11、break; case 0 : sum = qa->coef + qb->coef; /*系數(shù)的和*/ if(sum != 0.0) /*如果不是0.0*/ qa->coef = sum; /*改變系數(shù)*/ ha = qa; else free(Delfirst(ha, qa); free(Delfirst(hb, qb); qa = ha->next; qb = hb->next; /*qb釋放后要重新賦值*/ break; case 1 : /*如果qa-> expn > qb -> expn*/ Delfirst(hb, qb); Inse

12、rtBefore(ha, qb); /*把qb插入到ha下一個結(jié)點之前*/ qb = hb->next; ha = ha->next; break; if(qb) ha->next = qb; /*插入剩余的pb*/ free(head2); return head1; /*比較*/int compare(int a, int b) if(a < b) return -1; else if(a > b) return 1; else return 0;/*刪除結(jié)點q*/NODE *Delfirst(NODE *p1, NODE *q) p1 -> next

13、= q -> next; return (q); /*插入結(jié)點,引入結(jié)點p,可以讓p插入到p2和p1之間*/void InsertBefore(NODE *p1, NODE *p2) NODE *p; p = p1->next; p1->next = p2; p2->next = p;/*打印,為了美觀程序分開打印*/void print(NODE *head) NODE *current; current = head->next; while(current->next != NULL) printf("%0.f * x%d + ", current->coef, current->expn); current = current -> next; printf("%0.f * x%d", current->coef, current->expn); 六 調(diào)試分析如圖第八行,如果直接一次性輸完兩項的次數(shù)和項數(shù),還是會顯示“請輸入系數(shù)和指數(shù)”糾正辦法:輸入時輸完一項的系數(shù)和指數(shù),按回車后繼續(xù)輸入。七 測試結(jié)果輸入一個二次三項式X2+3X+1,一個三次四項式2X3+4X2+X+1輸出如圖:八 心得體會首先,我的C+學(xué)的不是很好,因此做這樣一個課程設(shè)計感覺有點吃力,還好我不斷的

溫馨提示

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

最新文檔

評論

0/150

提交評論