數(shù)據(jù)結(jié)構(gòu)-實(shí)驗(yàn)一-一元多項(xiàng)式相加_第1頁
數(shù)據(jù)結(jié)構(gòu)-實(shí)驗(yàn)一-一元多項(xiàng)式相加_第2頁
數(shù)據(jù)結(jié)構(gòu)-實(shí)驗(yàn)一-一元多項(xiàng)式相加_第3頁
數(shù)據(jù)結(jié)構(gòu)-實(shí)驗(yàn)一-一元多項(xiàng)式相加_第4頁
數(shù)據(jù)結(jié)構(gòu)-實(shí)驗(yàn)一-一元多項(xiàng)式相加_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報告實(shí)驗(yàn)一:一元多項(xiàng)式相加姓 名: 周 成 學(xué) 號: 13083511 專 業(yè): 軟件工程 任 課 教 師: 馬慧珠 2013年12 月01 日1.實(shí)驗(yàn)名稱:一元多項(xiàng)式相加2.實(shí)驗(yàn)?zāi)康? 如何使用C語言實(shí)現(xiàn)鏈表的說明、創(chuàng)建以及結(jié)點(diǎn)的插入和刪除等操作。3.實(shí)驗(yàn)要求:對一元多項(xiàng)式能實(shí)現(xiàn)輸入、輸出,以及兩個一元多項(xiàng)式相加及結(jié)果顯示。4.實(shí)驗(yàn)內(nèi)容:一元多項(xiàng)式的表示在計算機(jī)內(nèi)用鏈表來實(shí)現(xiàn),同時為了節(jié)省存儲空間,只存儲其中非零的項(xiàng),鏈表中的每個節(jié)點(diǎn)存放多項(xiàng)式的系數(shù)非零項(xiàng)。它包含三個域,分別存放多項(xiàng)式的系數(shù),指數(shù),以及指向下一個項(xiàng)的指針。根據(jù)一元多項(xiàng)式相加的運(yùn)算規(guī)則:對于兩個一元多項(xiàng)式中所有指數(shù)

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

3、指結(jié)點(diǎn)。然后qa、qb繼續(xù)向后掃描。(3)qa->exp小于qb->exp,則將qb所指結(jié)點(diǎn)插入qa所指結(jié)點(diǎn)之前,然后qa、qb繼續(xù)向后掃描。掃描過程一直進(jìn)行到qa或qb有一個為空為止,然后將有剩余結(jié)點(diǎn)的鏈表接在結(jié)果表上。所得pa指向的鏈表即為兩個多項(xiàng)式之和。5.實(shí)驗(yàn)程序代碼及運(yùn)行結(jié)果:#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include<stdio.h> #define NULL 0typedef s

4、truct NODE float coef; /系¦Ì數(shù)ºy int expn; /指?數(shù)ºy 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);/*創(chuàng)ä¡ä建

5、61;§鏈¢¡ä表À¨ª*/NODE *Creat(int n) NODE *current, *previous, *head; int i; head = (NODE *)malloc(sizeof(NODE); /*創(chuàng)ä¡ä建¡§頭ª¡¤結(jié)¨¢點(diǎn)Ì?*/ previous = head; for(i = 0; i < n; i+) current = (NODE *)malloc(sizeof(NODE)

6、; printf("請?輸º?入¨?系¦Ì數(shù)ºy和¨ª指?數(shù)ºy : "); scanf("%f%d", &current->coef, &current->expn); previous->next = current; previous = current; previous->next = NULL; return head;/*一°?元a多¨¤項(xiàng)?式º?的Ì?想?加¨&

7、#174;,ê?總Á¨¹體¬?考?慮?,ê?可¨¦分¤?qa的Ì?指?數(shù)ºy比À¨¨qb小?,ê?或¨°等̨¨于®¨²pb(如¨?果?系¦Ì數(shù)ºy相¨¤加¨®等̨¨于®¨²0和¨ª不?等Ì

8、8;¨于®¨²0),或¨°大䨮于®¨²pb里¤?面?由®¨¦InsertBefore和¨ªDelfirst兩¢?個?小?模¡ê塊¨¦組Á¨¦成¨¦一°?部?分¤?*/NODE *AddPolyn(NODE *head1, NODE *head2) NODE *ha, *hb, *qa, *qb;

9、 int a, b; float sum; ha = head1; /*ha和¨ªhb指?向¨°頭ª¡¤結(jié)¨¢點(diǎn)Ì?*/ hb = head2; qa = ha->next; /*qa和¨ªqb指?向¨°頭ª¡¤結(jié)¨¢點(diǎn)Ì?的Ì?下?一°?個?結(jié)¨¢點(diǎn)Ì?*/ qb = hb->next; while(qa && qb)

10、 /*qa和¨ªqb均¨´非¤?空?*/ a = qa->expn; b = qb->expn; switch(compare(a, b) case -1 : /*qa->expn < qb->expn*/ ha = qa; qa = qa->next; break; case 0 : sum = qa->coef + qb->coef; /*系¦Ì數(shù)ºy的Ì?和¨ª*/ if(sum != 0.0) /*如¨?果?不?是

11、86;?0.0*/ qa->coef = sum; /*改?變À?系¦Ì數(shù)ºy*/ ha = qa; else free(Delfirst(ha, qa); free(Delfirst(hb, qb); qa = ha->next; qb = hb->next; /*qb釋º¨ª放¤?后¨®要°a重?新?賦3值¦Ì*/ break; case 1 : /*如¨?果?qa-> expn > qb -> expn*/ Del

12、first(hb, qb); InsertBefore(ha, qb); /*把ã?qb插?入¨?到Ì?ha下?一°?個?結(jié)¨¢點(diǎn)Ì?之?前¡ã*/ qb = hb->next; ha = ha->next; break; if(qb) ha->next = qb; /*插?入¨?剩º¡ê余®¨¤的Ì?pb*/ free(head2); return head1; /*比À¨¨較

13、?*/int compare(int a, int b) if(a < b) return -1; else if(a > b) return 1; else return 0;/*刪¦?除y結(jié)¨¢點(diǎn)Ì?q*/NODE *Delfirst(NODE *p1, NODE *q) p1 -> next = q -> next; return (q); /*插?入¨?結(jié)¨¢點(diǎn)Ì?,引°y入¨?結(jié)¨¢點(diǎn)Ì?p,可¨¦以°

14、?讓¨?p插?入¨?到Ì?p2和¨ªp1之?間?*/void InsertBefore(NODE *p1, NODE *p2) NODE *p; p = p1->next; p1->next = p2; p2->next = p;/*打䨰印®?,為a了¢?美¨¤觀?程¨¬序¨°分¤?開a打䨰印®?*/void print(NODE *head) NODE *cu

15、rrent; 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); /system(ꡧ"pause"); int main() NODE *head

16、1, *head2, *head3; int n1, n2; printf("請?輸º?入¨?你?需¨¨要°a的Ì?多¨¤項(xiàng)?式º?的Ì?項(xiàng)?數(shù)ºy n1 : "); scanf("%d", &n1); head1 = Creat(n1); printf("第̨²一°?個?多¨¤項(xiàng)?式º?的Ì?顯?示º? : n"); prin

17、t(head1); printf("n請?輸º?入¨?你?需¨¨要°a的Ì?多¨¤項(xiàng)?式º?的Ì?項(xiàng)?數(shù)ºy n2 : "); scanf("%d", &n2); head2 = Creat(n2); printf("n第̨²二t個?多¨¤項(xiàng)?式º?的Ì?顯?示º? : n"); print(head2); head3 = AddPolyn(head1, head2); printf("n合?并¡é后¨®的Ì?多¨¤項(xiàng)?式º?的Ì?顯?示º? : n"); print(head3); printf("n");運(yùn)行結(jié)果:實(shí)驗(yàn)數(shù)據(jù)1如圖:輸入一個四次二項(xiàng)式X3+2X4,一個五次二項(xiàng)式X4+2X5,輸出如圖:實(shí)驗(yàn)數(shù)據(jù)2如圖:輸入一個五次四項(xiàng)式X2+X3+X4+X5,還有一個五次五項(xiàng)式1+X+X3+2X4+2X5輸出如圖所示實(shí)驗(yàn)數(shù)據(jù)3如圖:輸入一個七次三項(xiàng)式1+2x5+3X7,還有一個五次四

溫馨提示

  • 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

提交評論