多項(xiàng)式相乘C實(shí)現(xiàn)_第1頁
多項(xiàng)式相乘C實(shí)現(xiàn)_第2頁
多項(xiàng)式相乘C實(shí)現(xiàn)_第3頁
多項(xiàng)式相乘C實(shí)現(xiàn)_第4頁
多項(xiàng)式相乘C實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、西安郵電大學(xué)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)報(bào)告題目:多項(xiàng)式相乘院系名稱:計(jì)算機(jī)學(xué)院專業(yè)名稱:軟件工1班級: 學(xué)生姓名:學(xué)號(8位):指導(dǎo)教師:設(shè)計(jì)起止時(shí)間:1 .設(shè)計(jì)目的以動態(tài)單鏈表為存儲結(jié)構(gòu),使用排序等操作實(shí)現(xiàn)多項(xiàng)式的乘法運(yùn)算2 .設(shè)計(jì)內(nèi)容用一個單鏈表來表示一個一元多項(xiàng)式;在創(chuàng)建多項(xiàng)式的過程中, 可以按指數(shù)的任意順序輸入,并且可在同一多項(xiàng)式中輸入指數(shù)相同的多個項(xiàng);在進(jìn)行乘法操作之前, 輸出參與操作的兩個多項(xiàng)式。 要求輸出的多項(xiàng)式按指數(shù)升序排列,同指數(shù)的多項(xiàng)合并,項(xiàng)數(shù)的正負(fù)號顯示合理。對已排序且合并了同指數(shù)項(xiàng)的兩個多項(xiàng)式實(shí)現(xiàn)乘法操作,并輸出結(jié)果;結(jié)果多項(xiàng)式要求以動態(tài)鏈表為存儲結(jié)構(gòu),復(fù)用原多項(xiàng)式的結(jié)點(diǎn)空間;輸出結(jié)

2、果多項(xiàng)式要求按指數(shù)升序排列,同指數(shù)的多項(xiàng)要合并,項(xiàng)數(shù)的正負(fù)號要求顯示合理。3 .概要設(shè)計(jì)1 .功能模塊圖;2 .各個模塊詳細(xì)的功能描述多項(xiàng)式鏈表升序排序函數(shù)PolylistPolysort(Polylisthead)根據(jù)幕次的高低排序的同時(shí)并合同類項(xiàng),幕次相同的系數(shù)相加存入前項(xiàng),釋放合并項(xiàng)中后者空間,若系數(shù)相加和為 0則釋放兩項(xiàng)空間。多項(xiàng)式創(chuàng)建函數(shù)Polylistcreat()多項(xiàng)式相乘函數(shù)PolylistPolymul(PolylistLA,PolylistLB)輸出函數(shù)voidprint(Polylisthead)分三種情況:系數(shù)輸出、符號輸出、指數(shù)輸出四.詳細(xì)設(shè)計(jì)1.各功能函數(shù)的數(shù)據(jù)流程

3、圖(1)多項(xiàng)式鏈表升序排序函數(shù) PolylistPolysort(Polylisthead) Polynode*first,*move,*p,*q;/first移動指針 move被移動項(xiàng)指針 p,q臨時(shí)指針q=head; p=head->next; if(p=NULL)returnhead;/判斷鏈表是否為空;first=p->next; p->next=NULL; move=first; while(move!=NULL)/直接插入排序(鏈表排序) first=first->next; if(p->exp=move->exp)/判斷待插入項(xiàng)指數(shù)是否與首項(xiàng)相

4、等; p->coef+=move->coef;系數(shù)相加;free(move);/ 釋放空間;if(p->coef=0)/ 若系數(shù)相加和為0; q->next=p->next; free(p); /釋放空間; elseif(p->exp>move->exp)/判斷待插入項(xiàng)指數(shù)是否大于第一個項(xiàng)的指數(shù);head->next=move; move->next=p; elseif(p->next=NULL)/判斷下一項(xiàng)是否為空; p->next=move;move->next=NULL;else/待插入項(xiàng)指數(shù)插入位置在首末項(xiàng)之

5、間; q=p;/移動臨時(shí)變量指針 p,qp=p->next; while if(p->exp=move->exp)/判斷待插入項(xiàng)指數(shù)是否與首項(xiàng)相等;p->coef+=move->coef; 系數(shù)相力口 ; free(move);/ 釋放空間;if(p->coef=0) q->next=p->next;/若系數(shù)相加和為 0;free(p);/釋放空間; break; if(p->exp>move->exp)/判斷待插入項(xiàng)指數(shù)是否大于當(dāng)前項(xiàng)的指數(shù); q->next=move; move->next=p; break; i

6、f(p->next=NULL)/判斷下一項(xiàng)是否為空; p->next=move; move->next=NULL; break; q=p;/移動臨時(shí)變量指針 p,q ;p=p->next; p=head->next; 使p,q指針重新指到初始化位置; q=head; move=first; returnhead;/ 返回頭結(jié)點(diǎn); (2)多項(xiàng)式創(chuàng)建函數(shù) Polylistcreat() Polynode*head,*p,*newnode;/head :頭指針newnode:新結(jié)點(diǎn)指針 p:臨時(shí)指針變量intc,e;/ceof(系數(shù))和 exp (指數(shù));head=(P

7、olynode*)malloc(sizeof(Polynode);/開辟一個新結(jié)點(diǎn),并使之成為頭結(jié)點(diǎn);p=head; printf("nt請輸入多項(xiàng)式中元素的系數(shù)和指數(shù):n");scanf("%d%d”,&c,&e); while(c|e)/ceof(系數(shù))和 exp (指數(shù))不全為 0; if(c=0) scanf("%d%d",&c,&e);continue;/ 若 c 為 0,不開辟新結(jié)點(diǎn); newnode=(Polynode*)malloc(sizeof(Polynode);/開辟個新結(jié)點(diǎn);newnode

8、->coef=c; newnode->exp=e; p->next=newnode; p=newnode; scanf("%d%d",&c,&e);/輸入新結(jié)點(diǎn)的系數(shù)和指數(shù); p->next=NULL;/為最后的結(jié)點(diǎn)的 next賦空; head=Polysort(head);/ 調(diào)用Polysort 排序函數(shù)對多項(xiàng)式鏈表進(jìn)行降序排序; returnhead; / 返回頭結(jié)點(diǎn); (3)多項(xiàng)式相乘函數(shù) PolylistPolymul(PolylistLA,PolylistLB) Polynode*head,*p,*q,*t,*newnod

9、e;head:頭指針 newnode:新結(jié)點(diǎn)指針 p,q,t :臨時(shí)指針變量; p=LA->next; q=LB->next; head=(Polynode*)malloc(sizeof(Polynode);/開辟一個新結(jié)點(diǎn),并使之成為新鏈表的頭結(jié)點(diǎn); t=head; while(p!=NULL) while(q!=NULL) -,newnode=(Polynode*)malloc(sizeof(Polynode);/開辟個新結(jié)點(diǎn);t->next=newnode; t=t->next; t->coef=p->coef*q->coef;/項(xiàng)之系數(shù)為LA,

10、LB兩項(xiàng)系數(shù)之積;t->exp=p->exp+q->exp;/項(xiàng)之指數(shù)為LA,LB兩項(xiàng)指數(shù)之和;q=q->next; p=p->next;/p 指針移動; q=LB->next;/q 指針復(fù)位為 LB->next ; t->next=NULL;/ 為最后的結(jié)點(diǎn)的 next賦空; head=Polysort(head);/ 調(diào)用Polysort 排序函數(shù)對多項(xiàng)式鏈表進(jìn)行降序排序; returnhead;/返回頭結(jié)點(diǎn); (4)輸出函數(shù) voidprint(Polylisthead) Polynode*p;p=head->next;if(p=NU

11、LL)printf("0");elsewhile(p!=NULL)/系數(shù)輸出if(p->coef=-1)printf("-");elseif(p->coef!=1)printf("%d",p->coef);/符號輸出if(p->exp!=0&&p->exp!=1)printf("XA");elseif(p->exp=1)printf("X");/指數(shù)輸出if(p->exp=0&&(p->coef=-1|p->c

12、oef=1)printf("1");if(p->exp<0)printf("(%d)",p->exp);elseif(p->exp!=1&&p->exp!=0)printf("%d",p->exp);p=p->next;if(p!=NULL&&p->coef>0)printf("+"); printf("n");五.測試數(shù)據(jù)及運(yùn)行結(jié)果1 .正常測試數(shù)據(jù)和運(yùn)行結(jié)果2 .異常測試數(shù)據(jù)及運(yùn)行結(jié)果如輸入的字符不是數(shù)字,

13、則無法處理,如:a2程序無法繼續(xù)運(yùn)行六.調(diào)試情況,設(shè)計(jì)技巧及體會1 .改進(jìn)方案多項(xiàng)式相成這個程序缺少對異常的處理,如果用戶輸入一些異常的字符程序?qū)o法繼續(xù)運(yùn) 行,甚至導(dǎo)致死機(jī)。改進(jìn):加入異常處理,將各種用戶可能的輸入都包含在內(nèi)。2 .體會心得體會:此程序是使用鏈表完成的,一直以來比較習(xí)慣用順序表,通過這個程序加深了對 鏈表的理解。程序的排序部分較為復(fù)雜,根據(jù)哥次的高低排序的同時(shí)并合了同類項(xiàng),哥次相同的系數(shù)相加存入前項(xiàng),釋放合并項(xiàng)中后者空間,若系數(shù)相加和為。則釋放兩項(xiàng)空間。其實(shí) 想這段算法時(shí)很容易,真正實(shí)現(xiàn)卻是相當(dāng)不容易,可能是平時(shí)寫的代碼太少,真正把思想轉(zhuǎn)換成代碼困難還是比較大。七.參考文獻(xiàn)C

14、語言程序設(shè)計(jì)王曙燕主編科學(xué)出版社數(shù)據(jù)結(jié)構(gòu)一一C語言描述耿國華高等教育出版社 數(shù)據(jù)結(jié)構(gòu)嚴(yán)蔚敏清華大學(xué)出版社八.附錄:#include<stdio.h>#include<stdlib.h> #include<malloc.h> typedefstructPolynode intcoef;/ 系數(shù) intexp;/ 指數(shù) structPolynode*next; Polynode,*Polylist; /多項(xiàng)式鏈表升序排序 PolylistPolysort(Polylisthead) Polynode*first,*move,*p,*q;/first移動指針變量m

15、ove被移動項(xiàng)指針變量 p,q臨時(shí)指針變量 q=head; p=head->next; if(p=NULL)returnhead;/判斷鏈表是否為空;first=p->next; p->next=NULL; move=first; while(move!=NULL)/直接插入排序(鏈表排序) first=first->next; if(p->exp=move->exp)/判斷待插入項(xiàng)指數(shù)是否與首項(xiàng)相等; p->coef+=move->coef;系數(shù)相力口 ;free(move);/ 釋放空間;if(p->coef=0)/若系數(shù)相加和為0;

16、q->next=p->next;free(p);/釋放空間;elseif(p->exp>move->exp)/判斷待插入項(xiàng)指數(shù)是否大于第一個項(xiàng)的指數(shù);head->next=move;move->next=p;elseif(p->next=NULL)/判斷下一項(xiàng)是否為空;p->next=move;move->next=NULL; else/待插入項(xiàng)指數(shù)插入位置在首末項(xiàng)之間;q=p;p=p->next; while(1) /移動臨時(shí)變量指針p,qif(p->exp=move->exp)/判斷待插入項(xiàng)指數(shù)是否與首項(xiàng)相等;p

17、->coef+=move->coef; free(move);/if(p->coef=0) 系數(shù)相加;釋放空間;q->next=p->next; free(p);break;/若系數(shù)相加和為 0;釋放空間;if(p->exp>move->exp) 判斷待插入項(xiàng)指數(shù)是否大于當(dāng)前項(xiàng)的指數(shù);q->next=move; move->next=p; break;if(p->next=NULL)/判斷下一項(xiàng)是否為空;p->next=move; move->next=NULL; break;q=p; p=p->next;/移

18、動臨時(shí)變量指針p,q ;p=head->next; 使p,q指針重新指到初始化位置;q=head;move=first;returnhead;/返回頭結(jié)點(diǎn);/多項(xiàng)式創(chuàng)建(頭插法)Polylistcreat() Polynode*head,*p,*newnode; /head :頭指針 newnode:新結(jié)點(diǎn)指針 p:臨時(shí)指針變量 intc,e;/ceof(系數(shù))和 exp (指數(shù));head=(Polynode*)malloc(sizeof(Polynode);/開辟一個新結(jié)點(diǎn),并使之成為頭結(jié)點(diǎn);p=head; printf("nt請輸入多項(xiàng)式中元素的系數(shù)和指數(shù):n"

19、);scanf("%d%d”,&c,&e); while(c|e)/ceof(系數(shù))和 exp (指數(shù))不全為 0; if(c=0) scanf("%d%d",&c,&e);continue;/ 若 c 為 0,不開辟新結(jié)點(diǎn); newnode=(Polynode*)malloc(sizeof(Polynode);/開辟個新結(jié)點(diǎn);newnode->coef=c; newnode->exp=e; p->next=newnode; p=newnode; scanf("%d%d",&c,&

20、;e);/輸入新結(jié)點(diǎn)的系數(shù)和指數(shù); p->next=NULL;/為最后的結(jié)點(diǎn)的 next賦空; head=Polysort(head);/ 調(diào)用Polysort 排序函數(shù)對多項(xiàng)式鏈表進(jìn)行降序排序; returnhead; / 返回頭結(jié)點(diǎn); /多項(xiàng)式相乘 PolylistPolymul(PolylistLA,PolylistLB) Polynode*head,*p,*q,*t,*newnode;head:頭指針 newnode:新結(jié)點(diǎn)指針 p,q,t :臨時(shí)指針變量; p=LA->next; q=LB->next; head=(Polynode*)malloc(sizeof(P

21、olynode);/開辟一個新結(jié)點(diǎn),并使之成為新鏈表的頭結(jié)點(diǎn); t=head; while(p!=NULL) while(q!=NULL) newnode=(Polynode*)malloc(sizeof(Polynode);/開辟個新結(jié)點(diǎn);t->next=newnode; t=t->next; t->coef=p->coef*q->coef;/項(xiàng)之系數(shù)為LA,LB兩項(xiàng)系數(shù)之積;t->exp=p->exp+q->exp;/項(xiàng)之指數(shù)為LA,LB兩項(xiàng)指數(shù)之和;q=q->next; p=p->next;/p 指針移動; q=LB->n

22、ext;/q 指針復(fù)位為 LB->next ; t->next=NULL;/ 為最后的結(jié)點(diǎn)的 next賦空; head=Polysort(head);/ 調(diào)用Polysort 排序函數(shù)對多項(xiàng)式鏈表進(jìn)行降序排序;returnhead;/返回頭結(jié)點(diǎn);/輸出函數(shù)voidprint(Polylisthead)Polynode*p;p=head->next;if(p=NULL) printf("0"); else while(p!=NULL) /系數(shù)輸出 if(p->coef=-1) printf("-");elseif(p->coef!=1) printf(&q

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論