版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
PAGE16數(shù)據(jù)結(jié)構(gòu)課程報(bào)告姓名:周濤學(xué)號:201313040322問題描述與功能設(shè)計(jì)本程序要求能夠?qū)崿F(xiàn)從鍵盤鍵入兩個(gè)多項(xiàng)式的系數(shù)、指數(shù)相關(guān)數(shù)據(jù)后,能夠進(jìn)行多項(xiàng)式輸出、多項(xiàng)式相加、多項(xiàng)式相減的運(yùn)算。數(shù)據(jù)結(jié)構(gòu)與算法多項(xiàng)式的邏輯結(jié)構(gòu):視為線性表p(x)=3x14-8x8+6x2+2數(shù)據(jù)元素(coef,exp)表示多項(xiàng)式項(xiàng)coef·Xexp,coef是該項(xiàng)的系數(shù),exp是變元X的指數(shù)。coeexp*next算法多項(xiàng)式的輸入與建立調(diào)用CreatePolyn()函數(shù)建立鏈表,將多項(xiàng)式每一項(xiàng)的系數(shù)與指數(shù)作為鏈表一個(gè)結(jié)點(diǎn)的數(shù)據(jù),按照指示輸入每一項(xiàng)的系數(shù)與指數(shù)時(shí),將調(diào)用Insert()函數(shù),將輸入的結(jié)點(diǎn)信息按指數(shù)降序排列的方式插入到之前建立的鏈表中,并合并同類項(xiàng)。依次輸入、建立一元多項(xiàng)式pa和pb。如下圖。多項(xiàng)式的輸出調(diào)用PrintPolyn()函數(shù)將多項(xiàng)式鏈表中的結(jié)點(diǎn)數(shù)據(jù)按照一元多項(xiàng)式的格式(如:6x^5+3x^3+7x+3)輸出到屏幕上。兩個(gè)多項(xiàng)式的加法調(diào)用AddPolyn()函數(shù)直接對兩個(gè)多項(xiàng)式的鏈表的結(jié)點(diǎn)成員的系數(shù)與指數(shù)按照數(shù)學(xué)中多項(xiàng)式相加的原則進(jìn)行操作。其中要調(diào)用compare()函數(shù)對兩個(gè)多項(xiàng)式的指數(shù)或是項(xiàng)數(shù)進(jìn)行比較。相加所得的多項(xiàng)式存放到新建的第三個(gè)多項(xiàng)式中。再對第三個(gè)多項(xiàng)式輸出即可。兩個(gè)多項(xiàng)式的減法調(diào)用SubtractPolyn()函數(shù)對兩個(gè)多項(xiàng)式減法運(yùn)算。首先對要減的多項(xiàng)式的系數(shù)求反,接著調(diào)用AddPolyn()函數(shù)對處理后的多項(xiàng)式相加即兩個(gè)多項(xiàng)式的相減。所得的多項(xiàng)式存放到新建的第三個(gè)多項(xiàng)式中,再對第三個(gè)多項(xiàng)式輸出即可。函數(shù)定義為了程序功能的順利實(shí)現(xiàn),在本程序中定義了如下函數(shù):函數(shù)名功能Insert()鏈表結(jié)點(diǎn)數(shù)據(jù)的插入與排序CreatePolyn()鏈表頭結(jié)點(diǎn)的創(chuàng)建DestroyPolyn()鏈表的銷毀PrintPolyn()鏈表數(shù)據(jù)的多項(xiàng)式形象化輸出Compare()兩個(gè)多項(xiàng)式的指數(shù)或是項(xiàng)數(shù)進(jìn)行比較AddPolyn()兩個(gè)多項(xiàng)式的加法SubtractPolyn()兩個(gè)多項(xiàng)式的減法desktop()程序界面的實(shí)現(xiàn)編碼鏈表建立的函數(shù),該函數(shù)在多項(xiàng)式信息輸入時(shí)按照指數(shù)降序排列建立鏈表,并在出現(xiàn)同類項(xiàng)時(shí)合并。voidInsert(Polynp,Polynh){ if(p->coe==0)deletep;//當(dāng)前結(jié)點(diǎn)的coe成員等于0的時(shí)候刪除當(dāng)前結(jié)點(diǎn) else{ Polynq1,q2; q1=h;q2=h->next; while(q2&&p->exp<q2->exp)//查找插入位置 { q1=q2; q2=q2->next; } if(q2&&p->exp==q2->exp)//將指數(shù)相同相合并 { q2->coe+=p->coe; deletep; if(!q2->coe) { q1->next=q2->next; deleteq2; } } else//指數(shù)為新時(shí)將結(jié)點(diǎn)插入 { p->next=q2; q1->next=p; } }}鏈表信息按照多項(xiàng)式形式輸出。voidPrintPolyn(PolynP){ Polynq=P->next; intflag=1;//項(xiàng)數(shù)計(jì)數(shù)器 if(!q) {//若多項(xiàng)式為空,輸出0 cout<<"0"; cout<<endl; return; } while(q) { if(q->coe>0&&flag!=1)cout<<"+";//系數(shù)大于0且不是第一項(xiàng)時(shí)就輸出+ if(q->coe!=1&&q->coe!=-1)//系數(shù)非1或-1的普通情況 { cout<<q->coe; if(q->exp==1)cout<<"X";//當(dāng)前結(jié)點(diǎn)exp為1時(shí) elseif(q->exp)cout<<"X^"<<q->exp; } else { if(q->coe==1)系數(shù)為1的特殊情況 { if(!q->exp)cout<<"1";//指數(shù)不存在 elseif(q->exp==1)cout<<"X";/指數(shù)等于一 elsecout<<"X^"<<q->exp; } if(q->coe==-1)系數(shù)為-1的特殊情況情況 { if(!q->exp)cout<<"-1";//指數(shù)不存在 elseif(q->exp==1)cout<<"-X";//指數(shù)等于一 elsecout<<"-X^"<<q->exp; } } q=q->next;//當(dāng)前指針指向下一結(jié)點(diǎn) flag++;//項(xiàng)序數(shù)自加1 } cout<<endl;}兩個(gè)多項(xiàng)式的加法。intcompare(Polyna,Polynb)//對兩個(gè)多項(xiàng)式的系數(shù)或項(xiàng)數(shù)進(jìn)行比較{ if(a&&b){//兩個(gè)多項(xiàng)式都存在 if(!b||a->exp>b->exp)return1;當(dāng)b多項(xiàng)式不存在或者a多項(xiàng)式的指數(shù)大于b的的時(shí)候,返回1 elseif(!a||a->exp<b->exp)return-1;當(dāng)a多項(xiàng)式不存在或者b多項(xiàng)式的指數(shù)大于a的的時(shí)候,返回-1 elsereturn0;//其他情況返回0 } elseif(!a&&b)return-1;//a多項(xiàng)式已空,但b多項(xiàng)式非空 elsereturn1;//b多項(xiàng)式已空,但a多項(xiàng)式非空}PolynAddPolyn(Polynpa,Polynpb){ Polynqa=pa->next; Polynqb=pb->next; Polynheadc,hc,qc; hc=newPolynomial;//建立一個(gè)新的結(jié)點(diǎn) hc->next=NULL; headc=hc; while(qa||qb){ qc=newPolynomial;//新建一個(gè)結(jié)點(diǎn) switch(compare(qa,qb)){//調(diào)用compare函數(shù)對兩個(gè)多項(xiàng)式進(jìn)行比較 case1://a多項(xiàng)式的指數(shù)大于b的 { qc->coe=qa->coe; qc->exp=qa->exp; qa=qa->next; break; } case0://有同類項(xiàng)則合并 { qc->coe=qa->coe+qb->coe; qc->exp=qa->exp; qa=qa->next; qb=qb->next; break; } case-1:a多項(xiàng)式的指數(shù)小于b的 { qc->coe=qb->coe; qc->exp=qb->exp; qb=qb->next; break; } } if(qc->coe!=0){//當(dāng)相加系數(shù)不為0時(shí) qc->next=hc->next; hc->next=qc; hc=qc; } elsedeleteqc;//當(dāng)相加系數(shù)為0時(shí),釋放該結(jié)點(diǎn) } returnheadc;}兩個(gè)多項(xiàng)式的減法。兩個(gè)多項(xiàng)式的減法是建立在加法的的基礎(chǔ)上,對要減的多項(xiàng)式的系數(shù)求反,接著調(diào)用AddPolyn()函數(shù)對處理后的多項(xiàng)式相加即兩個(gè)多項(xiàng)式的相減PolynSubtractPolyn(Polynpa,Polynpb){ Polynh=pb; Polynp=pb->next;//新建一個(gè)結(jié)點(diǎn)作為pb的后繼結(jié)點(diǎn) Polynpd; while(p)//當(dāng)結(jié)點(diǎn)存在時(shí),對所有coe數(shù)據(jù)求反 { p->coe*=-1; p=p->next; } pd=AddPolyn(pa,h);//調(diào)用加法函數(shù) for(p=h->next;p;p=p->next)//恢復(fù)pb的系數(shù) p->coe*=-1; returnpd;}測試及結(jié)果測試的數(shù)據(jù):(1)A+BA=3x14-8x8+6x2+2B=2x10+4x8+-6x2(2)A-BA=11x14+3x10+2x8+10x6+5B=2x14+3x8+5x6+7思考通過這個(gè)一元多項(xiàng)市的設(shè)計(jì),熟悉了數(shù)據(jù)結(jié)構(gòu)中數(shù)據(jù)之間的存儲(chǔ),自己的程序還有一些bug,一些數(shù)據(jù)的限制還不夠完善,對于乘法的設(shè)計(jì)也沒有完成,,,在程序做完一組數(shù)據(jù)后,若要重新輸入多項(xiàng)市的參數(shù),只能退出后在進(jìn)入,返回沒有實(shí)現(xiàn),本來想有一個(gè)goto的,沒搞好。返回搞好了,但是測試圖沒有重新弄。還有就是數(shù)據(jù)測試的事例還太少,一些邊際的數(shù)據(jù)還沒測試。下次努力更好。附錄源代碼#include<iostream>#include<stdlib.h>#include<math.h>usingnamespacestd;typedefstructPolynomial{intcoe;intexp;structPolynomial*next;}*Polyn,Polynomial;voidInsert(Polynp,Polynh)//在多項(xiàng)式信息輸入時(shí)按照指數(shù)降序排列建立鏈表,實(shí)現(xiàn)同類項(xiàng)時(shí)合并。{if(p->coe==0)deletep;else{Polynq1,q2;q1=h;q2=h->next;while(q2&&p->exp<q2->exp){q1=q2;q2=q2->next;}if(q2&&p->exp==q2->exp){q2->coe+=p->coe;deletep;if(!q2->coe){q1->next=q2->next;deleteq2;}}else{p->next=q2;q1->next=p;}}}PolynCreatePolyn(Polynhead,intm)//鏈表頭結(jié)點(diǎn)的創(chuàng)建{inti;Polynp;p=head=newPolynomial;head->next=NULL;for(i=0;i<m;i++){p=newPolynomial;;cout<<"請輸入第"<<i+1<<"項(xiàng)的系數(shù):";cin>>p->coe;cout<<"指數(shù):";cin>>p->exp;Insert(p,head);}returnhead;}voidDestroyPolyn(Polynp)//鏈表的銷毀{Polynt;while(p!=NULL){t=p;p=p->next;deletet;}}voidPrintPolyn(PolynP)//鏈表數(shù)據(jù)的多項(xiàng)式輸出{Polynq=P->next;intflag=1;if(!q){cout<<"0";cout<<endl;return;}while(q){if(q->coe>0&&flag!=1)cout<<"+";if(q->coe!=1&&q->coe!=-1){cout<<q->coe;if(q->exp==1)cout<<"X";elseif(q->exp)cout<<"X^"<<q->exp;}else{if(q->coe==1){if(!q->exp)cout<<"1";elseif(q->exp==1)cout<<"X";elsecout<<"X^"<<q->exp;}if(q->coe==-1){if(!q->exp)cout<<"-1";elseif(q->exp==1)cout<<"-X";elsecout<<"-X^"<<q->exp;}}q=q->next;flag++;}cout<<endl;}intcompare(Polyna,Polynb)//兩個(gè)多項(xiàng)式的指數(shù),項(xiàng)數(shù)進(jìn)行比較{if(a&&b){if(!b||a->exp>b->exp)return1;elseif(!a||a->exp<b->exp)return-1;elsereturn0;}elseif(!a&&b)return-1;elsereturn1;}PolynAddPolyn(Polynpa,Polynpb)//兩個(gè)多項(xiàng)式的加法{Polynqa=pa->next;Polynqb=pb->next;Polynheadc,hc,qc;hc=newPolynomial;hc->next=NULL;headc=hc;while(qa||qb){qc=newPolynomial;switch(compare(qa,qb)){case1:{qc->coe=qa->coe;qc->exp=qa->exp;qa=qa->next;break;}case0:{qc->coe=qa->coe+qb->coe;qc->exp=qa->exp;qa=qa->next;qb=qb->next;break;}case-1:{qc->coe=qb->coe;qc->exp=qb->exp;qb=qb->next;break;}}if(qc->coe!=0){qc->next=hc->next;hc->next=qc;hc=qc;}elsedeleteqc;}returnheadc;}PolynSubtractPolyn(Polynpa,Polynpb)//兩個(gè)多項(xiàng)式的減法{Polynh=pb;Polynp=pb->next;Polynpd;while(p){p->coe*=-1;p=p->next;}pd=AddPolyn(pa,h);for(p=h->next;p;p=p->next)p->coe*=-1;returnpd;}voiddesktop(){system("cls");cout<<"一元多項(xiàng)式的計(jì)算"<<endl;cout<<"**********************************************"<<endl;cout<<"**1.輸出多項(xiàng)式a和b**"<<endl;cout<<"**2.建立多項(xiàng)式a+b**"<<endl;cout<<"**3.建立多項(xiàng)式a-b**"<<endl;cout<<"**4.返回重新輸入?yún)?shù)**"<<endl;cout<<"**********************************************"<<endl;cout<<"執(zhí)行操作:";}intmain(){intm,n;floatx,result;charkey;Polynpa,pb,pc,pd,pf;r1:cout<<"歡迎"<<endl;cout<<"請輸入多項(xiàng)式A的項(xiàng)數(shù):";cin>>m;pa=CreatePolyn(pa,m);cout<<endl;cout<<"請輸入多項(xiàng)式B的項(xiàng)數(shù):";cin>>n;pb=CreatePolyn(pb,n);system("pause");system("cls");while(key){desktop();cin>>key;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度集裝箱運(yùn)輸企業(yè)信用評價(jià)與風(fēng)險(xiǎn)管理合同3篇
- 二零二五年環(huán)保節(jié)能型監(jiān)控設(shè)備采購與技術(shù)支持合同2篇
- 二零二五版房屋租賃及轉(zhuǎn)讓合同全方位權(quán)益創(chuàng)新協(xié)議2篇
- 二零二五版文化創(chuàng)意產(chǎn)業(yè)園區(qū)使用權(quán)轉(zhuǎn)讓合同3篇
- 二零二五年度國際公路運(yùn)輸代理合同2篇
- 二零二五版城市綠化苗木租賃合同3篇
- 二零二五版環(huán)保設(shè)備質(zhì)押貸款合同模板3篇
- 二零二五年度高級管理人員出差責(zé)任免除服務(wù)合同范本2篇
- 二零二五版體育行業(yè)勞動(dòng)合同管理規(guī)范及運(yùn)動(dòng)員權(quán)益保障協(xié)議3篇
- 二零二五年度節(jié)水減排供水合同范本3篇
- 2023年山東省青島市中考化學(xué)試題(含答案解析)
- 商業(yè)計(jì)劃書(BP)產(chǎn)品與服務(wù)的撰寫秘籍
- 安徽華塑股份有限公司年產(chǎn) 4萬噸氯化石蠟項(xiàng)目環(huán)境影響報(bào)告書
- 公司章程(二個(gè)股東模板)
- 世界奧林匹克數(shù)學(xué)競賽6年級試題
- 藥用植物學(xué)-課件
- 文化差異與跨文化交際課件(完整版)
- 國貨彩瞳美妝化消費(fèi)趨勢洞察報(bào)告
- 云南省就業(yè)創(chuàng)業(yè)失業(yè)登記申請表
- UL_標(biāo)準(zhǔn)(1026)家用電器中文版本
- 國網(wǎng)三個(gè)項(xiàng)目部標(biāo)準(zhǔn)化手冊(課堂PPT)
評論
0/150
提交評論