




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上哈爾濱工業(yè)大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院實(shí)驗(yàn)報(bào)告課程名稱:數(shù)據(jù)結(jié)構(gòu)與算法課程類型:必修實(shí)驗(yàn)項(xiàng)目:線性結(jié)構(gòu)及其應(yīng)用實(shí)驗(yàn)題目:多項(xiàng)式的加減乘除和特定值帶入實(shí)驗(yàn)日期:2017/11/5班級:學(xué)號:姓名:安宏宇設(shè)計(jì)成績報(bào)告成績指導(dǎo)老師張巖一、實(shí)驗(yàn)?zāi)康脑O(shè)計(jì)線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu),并實(shí)現(xiàn)一元多項(xiàng)式的代數(shù)運(yùn)算。二、實(shí)驗(yàn)要求及實(shí)驗(yàn)環(huán)境(1)實(shí)驗(yàn)要求:以鏈表存儲一元多項(xiàng)式,在此基礎(chǔ)上完成對多項(xiàng)式的代數(shù)操作。 1.能夠輸入多項(xiàng)式(可以按各項(xiàng)的任意輸入順序,建立按指數(shù)降冪排列的多項(xiàng)式)和輸出多項(xiàng)式(按指數(shù)降冪排列),以文件形式輸入和輸出,并顯示。 2.能夠計(jì)算多項(xiàng)式在某一點(diǎn) x=x0 的值,其中
2、x0 是一個(gè)浮點(diǎn)型常量,返回結(jié)果為浮點(diǎn)數(shù)。 3.能夠給出計(jì)算兩個(gè)多項(xiàng)式加法、減法、乘法和除法運(yùn)算的結(jié)果多項(xiàng)式,除法運(yùn)算的結(jié)果包括商多項(xiàng)式和余數(shù)多項(xiàng)式。 4.要求盡量減少乘法和除法運(yùn)算中間結(jié)果的空間占用和結(jié)點(diǎn)頻繁的分配與回收操作。(提示:利用循環(huán)鏈表結(jié)構(gòu)和可用空間表的思想,把循環(huán)鏈表表示的多項(xiàng)式返還給可用空間表,從而解決上述問題)。(2)實(shí)驗(yàn)環(huán)境:windows下的CB;三、設(shè)計(jì)思想(本程序中的用到的所有數(shù)據(jù)類型的定義,主程序的流程圖及各程序模塊之間的調(diào)用關(guān)系)1邏輯設(shè)計(jì):struct polynode int coef; int exp; struct polynode * link;/建立鏈
3、表typedef struct polynode poly;poly* Attch(int c,int e,poly *d);/多項(xiàng)式插入poly *newPoly();/新鏈表poly *padd(poly *p1,poly *p2);/多項(xiàng)式加法poly *pmul(poly *p1,poly *p2);/乘法poly *inputPoly();/輸入多項(xiàng)式poly *psub(poly *p1,poly *p2);/減poly *pdiv(poly *p1,poly *p2);/除poly *inputPoly1();double caculate(double x,poly *p);/
4、計(jì)算多項(xiàng)式void sortPoly(poly *p);/多項(xiàng)式排序void outputPoly(poly*p);/輸出多項(xiàng)式void delPoly(poly*p);/清空多項(xiàng)式 2物理設(shè)計(jì):四、測試結(jié)果五、經(jīng)驗(yàn)體會與不足不能連續(xù)輸入多個(gè)多項(xiàng)式函數(shù)設(shè)計(jì)不夠簡潔算法過于直接簡單加注釋后修改代碼方便六、附錄:源代碼(帶注釋)#include <stdio.h>#include <stdlib.h>struct polynode int coef; int exp; struct polynode * link;/建立新鏈表typedef struct polynode
5、poly;poly* Attch(int c,int e,poly *d);/插入鏈表poly *newPoly();/建立新鏈表poly *padd(poly *p1,poly *p2);/加法poly *pmul(poly *p1,poly *p2);/乘法poly *inputPoly();/輸入多項(xiàng)式poly *psub(poly *p1,poly *p2);/減法poly *pdiv(poly *p1,poly *p2);/除法poly *inputPoly1();/輸入double caculate(double x,poly *p);/計(jì)算void sortPoly(poly *
6、p);/排序void outputPoly(poly*p);/輸出多項(xiàng)式void delPoly(poly*p);/除法void Insert(poly *p,poly *h) if(p->coef=0) free(p); else poly *q1,*q2; q1=h;q2=h->link; while(q2&&p->exp<q2->exp) q1=q2; q2=q2->link; /*判斷兩個(gè)指數(shù)是否相等*/ if(q2&&p->exp=q2->exp) q2->coef+=p->coef; fre
7、e(p); if(!q2->coef) q1->link=q2->link; free(q2); /*相等就加系數(shù)*/ else p->link=q2; q1->link=p; /*不等就插在后面*/int main() poly *p1,*p2,*padd1,*psub1,*pmul1; p1=newPoly(); printf("第一個(gè)多項(xiàng)式n"); p1->link=inputPoly(); outputPoly(p1); p2=newPoly(); printf("第二個(gè)多項(xiàng)式n"); p2->link=
8、inputPoly1(); outputPoly(p2); padd1=newPoly(); pmul1=newPoly(); psub1=newPoly(); padd1->link=padd(p1,p2); printf("paddn"); outputPoly(padd1); psub1->link=psub(p1,p2); printf("psubn"); outputPoly(psub1); pmul1->link=pmul(p1,p2); printf("pmuln"); outputPoly(pmul1
9、); printf("輸入x的值!"); int x; scanf("%d",&x); x=caculate(x,p1); printf("%dn",x); pdiv(p1,p2); return 0;poly *newPoly() poly *x; x=(poly*)malloc(sizeof(poly); x->link=NULL; x->coef=0; x->exp=0; return x;poly* Attch(int c,int e,poly *d) poly *x; x=newPoly(); x-
10、>coef=c; x->exp=e; d->link=x; return x;poly *padd(poly *p1,poly *p2) poly *a, *b,*c,*d,*p; c=newPoly(); d=c; p=c; a=p1->link; b=p2->link; while(a!=NULL&&b!=NULL) if(a->exp>b->exp)/如果a的系數(shù)大于b把a(bǔ)先輸入 c=Attch(a->coef,a->exp,c); a=a->link; else if(a->exp<b->
11、;exp)/小于相反 c=Attch(b->coef,b->exp,c); b=b->link; else/相等 c=Attch(b->coef+a->coef,a->exp,c); a=a->link; b=b->link; /*a b比較完成開始遍歷剩下的未插入的*/ while(a!=NULL) c=Attch(a->coef,a->exp,c); a=a->link; while(b!=NULL) c=Attch(b->coef,b->exp,c); b=b->link; c->link=NULL
12、; d=d->link; p->link=NULL; delPoly(p); return d;poly *psub(poly*p1,poly*p2)/加和減思路相同,b的系數(shù)得輸入相反值 poly *a, *b,*c,*d,*p; c=newPoly(); d=c; p=c; a=p1->link; b=p2->link; while(a!=NULL&&b!=NULL) if(a->exp>b->exp) c=Attch(a->coef,a->exp,c); a=a->link; else if(a->exp&
13、lt;b->exp) c=Attch(b->coef*(-1),b->exp,c); b=b->link; else if(a->coef-b->coef)>0) c=Attch(a->coef-b->coef,a->exp,c); a=a->link; b=b->link; else a=a->link; b=b->link; while(a!=NULL) c=Attch(a->coef,a->exp,c); a=a->link; while(b!=NULL) c=Attch(b->c
14、oef*(-1),b->exp,c); b=b->link; c->link=NULL; d=d->link; p->link=NULL; delPoly(p); return d;/*乘法,先用第一個(gè)鏈表的第一個(gè)數(shù)據(jù)乘以第二個(gè)鏈表里的所有值,儲存在新的鏈表中,之后遍歷一中所有的值,最后把這些多項(xiàng)式加在一起。*/poly *pmul(poly*p1,poly*p2)/乘法 poly*a,*b,*c,*d,*q,*sum; int aex,aco; a=p1->link; b=p2->link; sum=newPoly(); q=sum; while(a
15、!=NULL) c=newPoly(); d=c; aco=a->coef; aex=a->exp; while(b!=NULL) c=Attch(aco*(b->coef),aex+(b->exp),c); b=b->link; b=p2->link; sum->link=padd(d,sum); a=a->link; delPoly(d); sum=sum->link; q->link=NULL; delPoly(q); sortPoly(sum); return sum;/*除法:先用鏈表一第一個(gè)的系數(shù)除以第二個(gè)鏈表的第一個(gè)系數(shù)
16、,得到的值乘以被除多項(xiàng)式,再用第一個(gè)多項(xiàng)式減。最后得到一個(gè)最大系數(shù)比被除數(shù)小的多項(xiàng)式。*/ poly *pdiv(poly*p1,poly*p2) poly *hf,*pf,*temp1,*temp2; poly *q1; q1=p1->link; poly *q2; q2=p2->link; hf=newPoly(); hf->link=NULL; pf=newPoly(); pf->link=NULL; temp1=newPoly(); temp1->link=NULL; temp2=newPoly(); temp2->link=NULL; temp1=
17、padd(temp1,p1); while(q1->exp>=q2->exp) temp2->link=newPoly(); temp2->link->coef=(q1->coef)/(q2->coef); temp2->link->exp=(q1->exp)-(q2->exp); Insert(temp2->link,hf); p1=psub(p1,pmul(p2,temp2); q1=p1->link; temp2->link=NULL; pf=psub(temp1,pmul(hf,p2); p2=t
18、emp1; printf("商是"); outputPoly(hf); printf("余數(shù)是"); outputPoly(pf);/*輸入:多項(xiàng)式的系數(shù)和指數(shù)存在p1文件中,兩個(gè)兩個(gè)讀,分別賦給多項(xiàng)式的系數(shù)和指數(shù)。*/poly *inputPoly() poly *q,*p; p=newPoly(); q=p; FILE *fp; if(fp=fopen("c:p1.txt","rt")=NULL) printf("nCannot open file strike any key exit!"
19、); getch(); exit(1); int a,b; while(fscanf(fp,"%d %d",&a,&b)!=-1) p->link=newPoly(); p=p->link; p->coef=a; p->exp=b; p=q; sortPoly(q); q=q->link; p->link=NULL; delPoly(p); fclose(fp); return q;poly *inputPoly1() poly *q,*p; p=newPoly(); q=p; FILE *fp; if(fp=fopen(
20、"c:p2.txt","rt")=NULL) printf("nCannot open file strike any key exit!"); getch(); exit(1); int a,b; while(fscanf(fp,"%d %d",&a,&b)!=-1) p->link=newPoly(); p=p->link; p->coef=a; p->exp=b; p=q; sortPoly(q); q=q->link; p->link=NULL; delPoly(p); fclose(fp); return q;/*輸出:讀取系數(shù)和指數(shù),按a*xb的形式輸出*/void outputPoly(poly*p) poly*q; q=p->link; if(q!=NULL) printf("%dx%d ",q->coef,q->exp); q=q->link; else printf("0"); while(q!=NULL) if(
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 班級心理委員職責(zé)與學(xué)生成長
- 初中文科教研組跨學(xué)科合作計(jì)劃
- Xx學(xué)校家委會項(xiàng)目職責(zé)劃分手冊
- 2025年下期八年級歷史上冊教案計(jì)劃
- 籃球單元訓(xùn)練安排計(jì)劃
- 醫(yī)療服務(wù)產(chǎn)品質(zhì)量保證措施
- 大數(shù)據(jù)時(shí)代網(wǎng)絡(luò)安全心得體會
- 公共安全案防工作心得體會
- 強(qiáng)制性條文實(shí)施計(jì)劃執(zhí)行
- 六年級體育課體育器材利用教學(xué)計(jì)劃
- 統(tǒng)編版語文五年級上冊第二單元整體教學(xué)設(shè)計(jì)說課課件
- AI技術(shù)優(yōu)化銀行資金流動性管理的探索
- 2025年廣東省高考物理試題(含答案解析)
- 拖車服務(wù)合同協(xié)議書模板
- 智能手機(jī)組裝工藝流程
- 妻子婚內(nèi)忠誠協(xié)議書
- 2025-2030年全球與中國心理測驗(yàn)行業(yè)市場發(fā)展分析及發(fā)展機(jī)遇和風(fēng)險(xiǎn)研究報(bào)告
- 銀行業(yè)反洗錢培訓(xùn)課件
- 醫(yī)美行業(yè)營銷策劃方案模板
- 2025年人教版一年級下冊數(shù)學(xué)期末模擬試卷(含答案)
- 包席合同協(xié)議
評論
0/150
提交評論