數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)__多項(xiàng)式運(yùn)算_第1頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)__多項(xiàng)式運(yùn)算_第2頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)__多項(xiàng)式運(yùn)算_第3頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)__多項(xiàng)式運(yùn)算_第4頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)__多項(xiàng)式運(yùn)算_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余12頁可下載查看

付費(fèi)下載

下載本文檔

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

文檔簡(jiǎn)介

1、#include<stdio.h>#include<stdlib.h>#include"malloc.h"# defineOK1# defineERROR0# defineOVERFLOW-1# defineNULL0typedefintStatus;typedefstructElemTypefloatcoef;/多項(xiàng)式系數(shù)intexp;/多項(xiàng)式指數(shù)ElemType;/數(shù)據(jù)類型typedefstructPolynomialElemTypedata;structPolynomial*next;*Polyn,Polynomial;/多項(xiàng)式結(jié)構(gòu)體voidI

2、nsert(Polynp,Polynhead)/*將新的結(jié)點(diǎn)插入鏈表,如果系數(shù)為零,則釋放該結(jié)點(diǎn);如果指數(shù)為新時(shí)將結(jié)點(diǎn)直接插入;否則查找插入位置,方法:比較該結(jié)點(diǎn)指數(shù)與首元結(jié)點(diǎn)及其他結(jié)點(diǎn)的指數(shù),直到該結(jié)點(diǎn)指數(shù)大于等于鏈表內(nèi)某結(jié)點(diǎn)的指數(shù),相等則合并這兩項(xiàng);大于則插入到其前驅(qū)*/if(p->data.coef=0)free(p);p=NULL;/如果插入項(xiàng)的系數(shù)為零時(shí),釋放其結(jié)點(diǎn)將其刪除else(Polynq1,q2;q1=head;q2=head->next;while(q2&&p->data.exp<q2->data.exp)/查找多項(xiàng)式某項(xiàng)的插入

3、位置,使多項(xiàng)式按指數(shù)降嘉排列q1=q2;q2=q2->next;if(q2&&p->data.exp=q2->data.exp)/將多項(xiàng)式指數(shù)相同相進(jìn)行合并q2->data.coef+=p->data.coef;free(p);if(!q2->data.coef)/如果多項(xiàng)式的系數(shù)為零的話,將其刪除即釋放期結(jié)點(diǎn)q1->next=q2->next;free(q2);else/如果是新建的多項(xiàng)式,指數(shù)為新時(shí)將結(jié)點(diǎn)插入p->next=q2;q1->next=p;StatusCreatePolyn(Polyn&L,in

4、tm)/*建立一個(gè)頭指針為L(zhǎng),項(xiàng)數(shù)為m的一元多項(xiàng)式;先建立一個(gè)頭指針,再建立新結(jié)點(diǎn)來接收數(shù)據(jù),然后再調(diào)用Insert函數(shù)插入結(jié)點(diǎn)*/inti;Polynp;L=(Polyn)malloc(sizeof(Polynomial);if(!L)exit(OVERFLOW);L->next=NULL;for(i=1;i<=m;+i)p=(Polyn)malloc(sizeof(Polynomial);/建立新結(jié)點(diǎn)以接收數(shù)據(jù)if(exit(OVERFLOW);p->next=NULL;printf("請(qǐng)輸入第d項(xiàng)的系數(shù)與指數(shù)中間用空格隔開>:",i);scan

5、f("%f%d",&p->data.coef,&p->data.exp);getchar();Insert(p,L);/調(diào)用Insert函數(shù)插入新建的結(jié)點(diǎn)returnOK;voidDestroyPolyn(Polynp)/銷毀多項(xiàng)式pPolynq;while(q=p->next)p->next=q->next;free(q);q=NULL;free(p);p=NULL;)voidPrintPolyn(PolynP)/輸出多項(xiàng)式(Polynq=P->next;intflag=1;/項(xiàng)數(shù)計(jì)數(shù)器,用來判別第一項(xiàng)if(!q)/如果

6、多項(xiàng)式為空鏈表,輸出零putchar('0');printf("n");return;)while(q)if(q->data.coef>0&&flag!=1)putchar('+');/多項(xiàng)式系數(shù)大于0且不是第一項(xiàng)if(q->data.coef!=1&&q->data.coef!=-1)/多項(xiàng)式系數(shù)不是+1和-1的普通情況printf("%g",q->data.coef);if(q->data.exp=1)putchar('X');/多項(xiàng)式

7、系數(shù)不是1且指數(shù)為1時(shí),輸出Xelseif(q->data.exp)printf("XA%d",q->data.exp);/多項(xiàng)式系數(shù)不是1且指數(shù)不為1,輸出X的指數(shù)次事)elseif(q->data.coef=1)/多項(xiàng)式系數(shù)為1時(shí)if(!q->data.exp)putchar('l');/多項(xiàng)式指數(shù)為零時(shí),直接輸出1elseif(q->data.exp=1)putchar('X');/多項(xiàng)式指數(shù)為1時(shí),輸出Xelseprintf("XA%d",q->data.exp);)if(q-&

8、gt;data.coef=-1)/多項(xiàng)式系數(shù)為-1時(shí)(if(!q->data.exp)printf("-1");/多項(xiàng)式指數(shù)為零時(shí),直接輸出-1elseif(q->data.exp=1)printf("-X");/多項(xiàng)式指數(shù)為1時(shí),輸出Xelseprintf("-XA%d",q->data.exp);)q=q->next;flag+;)printf("n");)StatusAddPolyn(Polyn&pc,Polynpa,Polynpb)/求解并建立多項(xiàng)式a+b,并用pc帶回多項(xiàng)式

9、的和Polynqa=pa->next;Polynqb=pb->next;Polynhc,qc;intj;pc=(Polyn)malloc(sizeof(Polynomial);/建立頭結(jié)點(diǎn)if(!pc)exit(OVERFLOW);pc->next=NULL;hc=pc;while(qa|qb)/(while(qa&&qb)退出循環(huán)可以用hc=qa?qa:qb;),使用時(shí)對(duì)后面的減法造成影響(if(qa&&qb)(if(qa->data.exp>qb->data.exp)j=1;/a多項(xiàng)式某項(xiàng)指數(shù)大于b多項(xiàng)式某項(xiàng)指數(shù)elsei

10、f(qa->data.exp<qb->data.exp)j=-1;/b多項(xiàng)式某項(xiàng)指數(shù)大于a多項(xiàng)式某項(xiàng)指數(shù)elsej=0;/a多項(xiàng)式某項(xiàng)指數(shù)等于b多項(xiàng)式某項(xiàng)指數(shù)elseif(!qa&&qb)j=-1;/a多項(xiàng)式已空,但b多項(xiàng)式非空elsej=1;/b多項(xiàng)式已空,但a多項(xiàng)式非空qc=(Polyn)malloc(sizeof(Polynomial);/建立新結(jié)點(diǎn)來存放兩多項(xiàng)式相加和的某一項(xiàng)if(!qc)exit(OVERFLOW);qc->next=NULL;switch(j)case1:/a多項(xiàng)式某項(xiàng)指數(shù)大于b多項(xiàng)式指數(shù),則把其存入qc內(nèi)qc->dat

11、a.coef=qa->data.coef;qc->data.exp=qa->data.exp;qa=qa->next;break;case0:/兩多項(xiàng)式兩項(xiàng)指數(shù)相等,則把其和存入qc內(nèi)qc->data.coef=qa->data.coef+qb->data.coef;qc->data.exp=qa->data.exp;qa=qa->next;qb=qb->next;break;)case-1:/b多項(xiàng)式某項(xiàng)指數(shù)大于a多項(xiàng)式指數(shù),則把其存入qc內(nèi)(qc->data.coef=qb->data.coef;qc->d

12、ata.exp=qb->data.exp;qb=qb->next;break;)if(qc->data.coef!=0)/產(chǎn)生的和項(xiàng)式插入鏈表pc內(nèi)(hc->next=qc;hc=qc;)elsefree(qc);/當(dāng)相加系數(shù)為零時(shí),釋放該結(jié)點(diǎn))/hc->next=qa?qa:qb;/如果qa或qb空時(shí),把另一個(gè)多項(xiàng)式剩余的項(xiàng)連接到hcreturnOK;)StatusSubtractPolyn(Polyn&pd,Polynpa,Polynpb)/求解并建立多項(xiàng)式a-b,用pd帶回多項(xiàng)式的差Polynh=pb;Polynp=pb->next;while

13、(p)/將pb的系數(shù)取反,調(diào)用加法的函數(shù)實(shí)現(xiàn)減法p->data.coef*=-1;p=p->next;)AddPolyn(pd,pa,h);for(p=h->next;p;p=p->next)/為保證原多項(xiàng)式不變,恢復(fù)pb的系數(shù)p->data.coef*=-1;returnOK;)floatValuePolyn(Polynp,floatx)/輸入x值,計(jì)算并返回多項(xiàng)式的值Polynq=p->next;/指針q用來遍歷pinti;floatt;floatsum=0;while(q)t=1;i=q->data.exp;while(i)/來計(jì)算XAi的值if

14、(i<0)t/=x;i+;/如果多項(xiàng)式指數(shù)小于0時(shí),對(duì)X取倒數(shù)進(jìn)行除法elset*=x;i-;/如果指數(shù)大于0,則進(jìn)行乘法sum+=q->data.coef*t;q=q->next;returnsum;StatusDerivativePolyn(Polyn&hd,Polynp)/求解多項(xiàng)式的導(dǎo)函數(shù),并用hd帶回求導(dǎo)后的結(jié)果Polynq=p->next,p1,p2;hd=p1=(Polyn)malloc(sizeof(Polynomial);/建立頭結(jié)點(diǎn)if(!hd)exit(OVERFLOW);hd->next=NULL;while(q)if(q->

15、data.exp!=0)/如果多項(xiàng)式該項(xiàng)不是常數(shù)項(xiàng)時(shí),常數(shù)的話就不用參與下面的計(jì)算p2=(Polyn)malloc(sizeof(Polynomial);/開辟新的結(jié)點(diǎn)用來存放求導(dǎo)后的該項(xiàng)if(!p2)exit(OVERFLOW);p2->next=NULL;p2->data.coef=q->data.coef*q->data.exp;/求導(dǎo)后該項(xiàng)的系數(shù)=原項(xiàng)系數(shù)*原項(xiàng)指數(shù)p2->data.exp=q->data.exp-1;/求導(dǎo)后該項(xiàng)的指數(shù)=原項(xiàng)指數(shù)-1p1->next=p2;/將求導(dǎo)后的該項(xiàng)插入新鏈表p1=p2;q=q->next;retu

16、rnOK;StatusMultiplyPolyn(Polyn&hf,Polynpa,Polynpb)/求解多項(xiàng)式a*b,并用hf帶回乘積結(jié)果Polynpf;Polynqa=pa->next;/qa和qb用來遍歷多項(xiàng)式pa和pbPolynqb=pb->next;hf=(Polyn)malloc(sizeof(Polynomial);/建立頭結(jié)點(diǎn)if(!hf)exit(OVERFLOW);hf->next=NULL;while(qa)/利用兩個(gè)循環(huán)讓多項(xiàng)式pa和pb的任意兩項(xiàng)相乘for(qb=pb->next;qb;qb=qb->next)pf=(Polyn)

17、malloc(sizeof(Polynomial);if(!pf)exit(OVERFLOW);pf->next=NULL;pf->data.coef=qa->data.coef*qb->data.coef;/系數(shù)相乘pf->data.exp=qa->data.exp+qb->data.exp;/指數(shù)相乘Insert(pf,hf);/調(diào)用Insert函數(shù)以合并指數(shù)相同的項(xiàng),并按降嘉排序qa=qa->next;returnOK;StatusIndefinite_integralPolyn(Polyn&hd,Polynp)/求解多項(xiàng)式的不定積

18、分,并用hd帶回求導(dǎo)后的結(jié)果Polynq=p->next,p1,p2;hd=p1=(Polyn)malloc(sizeof(Polynomial);/建立頭結(jié)點(diǎn)if(!hd)exit(OVERFLOW);hd->next=NULL;while(q)(if(q->data.exp=-1)/如果含有-1次方的多項(xiàng)式,積分會(huì)涉及到ln(x),不好運(yùn)算及存儲(chǔ),則直接默認(rèn)積分結(jié)果為零(printf("n本程序不能對(duì)含有-1次方的多項(xiàng)式積分!n若還有-1次方,則積分結(jié)果默認(rèn)為零!n");DestroyPolyn(hd);hd=(Polyn)malloc(sizeof(

19、Polynomial);/重新建立頭結(jié)點(diǎn),方便輸出if(!hd)exit(OVERFLOW);hd->next=NULL;break;p2=(Polyn)malloc(sizeof(Polynomial);/建立新的結(jié)點(diǎn)來存放積分后某項(xiàng)的結(jié)果if(!p2)exit(OVERFLOW);p2->next=NULL;p2->data.coef=q->data.coef/(q->data.exp+1);/積分后該項(xiàng)的系數(shù)=原項(xiàng)的系數(shù):(原項(xiàng)的指數(shù)+1)p2->data.exp=q->data.exp+1;/積分后該項(xiàng)的指數(shù)=原項(xiàng)指數(shù)+1p1->next

20、=p2;/積分后該項(xiàng)的結(jié)果插入鏈表p1=p2;q=q->next;returnOK;doubleDefinite_integralPolyn(Polynp,floata,floatb)/用e帶回求定積分的結(jié)果求解多項(xiàng)式p的定積分,并doublee=0;Polynq;if(!p)exit(OVERFLOW);if(!p->next)return0;Indefinite_integralPolyn(q,p);/調(diào)用不定積分函數(shù)Indefinite_integralPolyn(),先計(jì)算多項(xiàng)式的不定積分e=ValuePolyn(q,b)-ValuePolyn(q,a);/調(diào)用求值函數(shù)Va

21、luePolyn,計(jì)算定積分的值returne;voidmain()intm,n,c=1;floatx,a,b;inttemp;doubleresult_a=0,result_b=0;Polynpa=0,pb=0,pc;printf(*printf("*n");printf("*數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)*n");printf("*n");printf("*、-n.printf("*姓名:XX*n");printf("*班級(jí):2010級(jí)2班*n");printf("*學(xué)號(hào):XXXXXX

22、X*n");printf("*專業(yè):電子信息科學(xué)與技術(shù)*n");printf(題目:一元多項(xiàng)式運(yùn)算器*n");printf(*n");printf("首先創(chuàng)建兩個(gè)一元多項(xiàng)式,即多項(xiàng)式a和b:n");printf("請(qǐng)輸入a的項(xiàng)數(shù):");scanf("%d",&m);/getchar();CreatePolyn(pa,m);/建立多項(xiàng)式aprintf("n多項(xiàng)式a=");PrintPolyn(pa);printf("n");printf(&

23、quot;請(qǐng)輸入b的項(xiàng)數(shù):");scanf("%d",&n);/getchar();CreatePolyn(pb,n);/建立多項(xiàng)式bprintf("n多項(xiàng)式b=");PrintPolyn(pb);printf("n");輸出菜單printf("*多項(xiàng)式操作菜單*n");printf("*n");printf("*1:顯小兩個(gè)一兀多項(xiàng)式*n");printf("*2:求兩個(gè)多項(xiàng)式的和即(a+b)*n");printf("*3:求

24、兩個(gè)多項(xiàng)式的差即(a-b)*n");printf("*4:求兩個(gè)多項(xiàng)式的積即(a*b)*n");printf("*5:帶入X求多項(xiàng)式的值*n");printf(*printf("*6:對(duì)多項(xiàng)式求導(dǎo)計(jì)算*n");printf("*7:對(duì)多項(xiàng)式不定定積分計(jì)算*n");printf("*8:對(duì)多項(xiàng)式定積分計(jì)算*n");printf("*9:銷毀所創(chuàng)建的一元多項(xiàng)式*n");printf("*10:重新創(chuàng)建兩個(gè)一元多項(xiàng)式*n");printf("

25、*11:退出程序(并且銷毀了多項(xiàng)式)*n");printf(*while(c)printf("n請(qǐng)選擇操作:");scanf("%d”,&temp);getchar();switch(temp)(case 1:(printf("n多項(xiàng)式a=");PrintPolyn(pa);printf("n多項(xiàng)式b=");PrintPolyn(pb);break;case 2:(AddPolyn(pc,pa,pb);printf("na+b=");PrintPolyn(pc);break;case 3

26、:(SubtractPolyn(pc,pa,pb);printf("na-b=");PrintPolyn(pc);break;)case 4:(MultiplyPolyn(pc,pa,pb);printf("na*b=");PrintPolyn(pc);break;)case 5:(printf("對(duì)于多項(xiàng)式a,輸入x求多項(xiàng)式的值!n");printf("輸入x的值:x=");scanf("%f",&x);printf("nx=%.3f時(shí),a=%.3fn",x,Val

27、uePolyn(pa,x);printf("對(duì)于多項(xiàng)式b,輸入x求多項(xiàng)式的值!n");printf("輸入x的值:x=");scanf("%f",&x);printf("nx=%.3f時(shí),b=%.3fn",x,ValuePolyn(pb,x);break;case 6:(DerivativePolyn(pc,pa);printf("n多項(xiàng)式a的導(dǎo)函數(shù)為:a'=");PrintPolyn(pc);DerivativePolyn(pc,pb);printf("n多項(xiàng)式b的導(dǎo)

28、函數(shù)為:b'=");PrintPolyn(pc);break;)case 7:(Indefinite_integralPolyn(pc,pa);printf("n多項(xiàng)式a的不定積分為:fa=");PrintPolyn(pc);Indefinite_integralPolyn(pc,pb);printf("n多項(xiàng)式b的不定積分為:bb=");PrintPolyn(pc);break;)case 8:(printf("請(qǐng)輸入定積分的上下限:n");printf("請(qǐng)輸入定積分的下限a=:");scanf("%f&quo

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論