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

下載本文檔

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

文檔簡(jiǎn)介

1、目錄一、問(wèn)題分析 11.1 問(wèn)題描述 . 11.2 問(wèn)題的數(shù)學(xué)模型 11.3 構(gòu)造數(shù)據(jù)結(jié)構(gòu) 1二、系統(tǒng)分析 22.1 可行性研究 . 22.2 系統(tǒng)結(jié)構(gòu)與主要功能模塊 2三、系統(tǒng)設(shè)計(jì) 43.1 系統(tǒng)設(shè)計(jì)目的與要求 43.2 系統(tǒng)設(shè)計(jì)內(nèi)容 43.3 功能算法描述與數(shù)據(jù)結(jié)構(gòu)說(shuō)明 4四、系統(tǒng)實(shí)現(xiàn) 7五、調(diào)試及運(yùn)行結(jié)果 12六、收獲和體會(huì) 13附錄 141 問(wèn)題分析1.1 問(wèn)題描述設(shè)計(jì)一個(gè) n 元多項(xiàng)式程序,并完成多項(xiàng)式的乘法運(yùn)算。從實(shí)際的角度出發(fā),這里設(shè)計(jì)的程序是基于一元 n 次多項(xiàng)式的數(shù)學(xué)模型。1.2 問(wèn)題的數(shù)學(xué)模型在數(shù)學(xué)上,一個(gè)一元多項(xiàng)式 Pn(x)可按升幕寫(xiě)成:Pn (x)=a 0+a1 x+

2、a2 xA2 +an xAn-1 .它由n+1個(gè)系數(shù)惟一確定,因此,在計(jì)算機(jī)里,它可用一個(gè)線(xiàn)性表 P來(lái)表示: Pn=(a0,a1,a2,,每一項(xiàng)的指數(shù)i隱含在其系數(shù)ai的序號(hào)里。多項(xiàng)式的乘法規(guī)則:多次運(yùn)用單項(xiàng)式與多項(xiàng)式相乘的法則得到的計(jì)算時(shí)(a+b)(m+n),先把(m+n)看成一個(gè)單項(xiàng)式,(a+b)是一個(gè)多項(xiàng)式,運(yùn)用單項(xiàng)式與多項(xiàng)式 相乘的法則,得到(a+b)(m+n)=a(m+n)+b(m+n),然后再次運(yùn)用單項(xiàng)式與多項(xiàng)式相乘的法 則。1.3 構(gòu)造數(shù)據(jù)結(jié)構(gòu)通過(guò)分析多項(xiàng)式的特征,不難看出多項(xiàng)式是由單項(xiàng)式構(gòu)成的,而每個(gè)單項(xiàng)式都具 有系數(shù)和指數(shù),當(dāng)系數(shù)為 0時(shí),該項(xiàng)就失去了意義,在計(jì)算機(jī)內(nèi)要表示一

3、個(gè)多項(xiàng)式, 至少以下數(shù)據(jù)信息:系數(shù)信息、指數(shù)信息和指向下一個(gè)單項(xiàng)式的指針。通過(guò)指針,我 們就可以把多個(gè)單項(xiàng)式連接起來(lái),形式一個(gè)多項(xiàng)式,需要說(shuō)明的是從廣義的角度講, 單項(xiàng)式也是一個(gè)多項(xiàng)式?;谝陨系姆治?,我們定義多項(xiàng)式的數(shù)據(jù)結(jié)構(gòu)為如下結(jié)構(gòu)體 形式:typedef struct Polynomialfloat coef;/ 系數(shù)int exp n; 指數(shù)struct Poly nomial *n ext;/ 指向下一個(gè)結(jié)點(diǎn)*Polyn,Polynomial;/Polyn 為結(jié)點(diǎn)指針類(lèi)型2 系統(tǒng)分析2.1 可行性研究該程序主要從技術(shù)的角度來(lái)分析可行性。 技術(shù)上的可行性研究主要分析技術(shù)條件 能否順利完

4、成開(kāi)發(fā)工作, 硬、軟件能否滿(mǎn)足開(kāi)發(fā)者的需要等。 該系統(tǒng)采用了 WindowsXP 操作系統(tǒng)結(jié)合 Visual C+ 6.0,TC 2.0 等軟件開(kāi)發(fā)平臺(tái)已成熟可行。硬件方面,科技飛 速發(fā)展的今天,硬件更新的速度越來(lái)越快,容量越來(lái)越大,可靠性越來(lái)越高,其硬件 平臺(tái)也比較能滿(mǎn)足此系統(tǒng)的需要。此外,還有經(jīng)濟(jì)可行性,用戶(hù)使用可行性,法律可 行性等可行性研究,這里從簡(jiǎn)省去。2.2 系統(tǒng)結(jié)構(gòu)與主要功能模塊從實(shí)現(xiàn)多項(xiàng)式式運(yùn)算過(guò)程的角度來(lái)分析,至少需要這樣一些子功能模塊。如:1. 多項(xiàng)式創(chuàng)建功能;2. 多項(xiàng)式運(yùn)算功能;3. 操作界面顯示功能;4. 銷(xiāo)毀多項(xiàng)式的功能;5. 多項(xiàng)式復(fù)制功能等。系統(tǒng)的整體流程和主要

5、功能模塊如圖 2-1 所示圖2-13 系統(tǒng)設(shè)計(jì)3.1 系統(tǒng)設(shè)計(jì)目的與要求通過(guò)多項(xiàng)式運(yùn)算程序設(shè)計(jì)(用 C 語(yǔ)言實(shí)現(xiàn)),使我們進(jìn)一步掌握和利用 C 語(yǔ)言進(jìn) 行結(jié)構(gòu)化程序設(shè)計(jì)的能力;進(jìn)一步理解和運(yùn)用結(jié)構(gòu)化程設(shè)計(jì)的思想和方法;初步掌握 開(kāi)發(fā)一個(gè)小型系統(tǒng)程序設(shè)計(jì)的基本方法;學(xué)會(huì)調(diào)試一個(gè)較長(zhǎng)程序的基本方法;學(xué)會(huì)利 用流程圖或 N-S 圖表示算法;以及掌握書(shū)寫(xiě)課程設(shè)計(jì)開(kāi)發(fā)文檔的能力(書(shū)寫(xiě)課程設(shè)計(jì) 報(bào)告)。總之,通過(guò)本課程設(shè)計(jì)加深對(duì)C語(yǔ)言及數(shù)據(jù)結(jié)構(gòu)課程所學(xué)知識(shí)的理解, 進(jìn)一步鞏固C語(yǔ)言語(yǔ)法規(guī)則,在程序中體現(xiàn)出算法的思想,提高程序的運(yùn)行效率。學(xué) 會(huì)編制結(jié)構(gòu)清晰、風(fēng)格良好、數(shù)據(jù)結(jié)構(gòu)適當(dāng)?shù)腃語(yǔ)言程序,從而具備解決綜

6、合性實(shí)際 問(wèn)題的能力。3.2 系統(tǒng)設(shè)計(jì)內(nèi)容多項(xiàng)式運(yùn)算程序具有以下基本功能: 1界面輸出,提示如何輸入數(shù)據(jù)。要求先輸入多項(xiàng)式的項(xiàng)數(shù)。 2創(chuàng)建多項(xiàng)式。接收輸入的數(shù)據(jù),并保存到鏈表中。 3顯示程序的功能表,允許使用者選擇運(yùn)算類(lèi)型。4顯示已經(jīng)創(chuàng)建好的多項(xiàng)式。6實(shí)現(xiàn)加法運(yùn)算。7實(shí)現(xiàn)減法運(yùn)算。8實(shí)現(xiàn)乘法運(yùn)算。9清除內(nèi)存內(nèi)容,銷(xiāo)毀創(chuàng)建的鏈表,退出程序。3.3 功能算法描述與數(shù)據(jù)結(jié)構(gòu)說(shuō)明該多項(xiàng)式程序除了 main() 函數(shù)外,主要有以下函數(shù):void Insert(Polyn p,Polyn h)Polyn CreatePolyn(Polyn head,int m)void DestroyPolyn(Poly

7、n p)void PrintPolyn(Polyn P)int compare(Polyn a,Polyn b)Polyn AddPolyn(Polyn pa,Polyn pb)Polyn SubtractPolyn(Polyn pa,Polyn pb)Polyn MultiplyPolyn(Polyn pa,Polyn pb)下面對(duì)這些函數(shù)逐一介紹。3.3. 系統(tǒng)主要功能函數(shù)的詳細(xì)設(shè)計(jì)1. main ()函數(shù)main 函數(shù)用來(lái)實(shí)現(xiàn)提示使用者輸入、 顯示功能列表、 調(diào)用其他運(yùn)算函數(shù)實(shí)現(xiàn)運(yùn)算 功能。在main ()函數(shù)中,定義 m n用來(lái)保存兩個(gè)多項(xiàng)式的項(xiàng)數(shù),pa、pb、pc、pd、 pf 定義

8、程序所需鏈表的頭指針。 在程序開(kāi)始要求輸入兩個(gè)多項(xiàng)式的項(xiàng)數(shù), 隨后根據(jù)項(xiàng) 數(shù)創(chuàng)建兩個(gè)鏈表以保存多項(xiàng)式, 再顯示出功能列表后通過(guò) if 語(yǔ)句來(lái)實(shí)現(xiàn)功能的選擇, 從而對(duì)整個(gè)程序流程進(jìn)行控制。2. Polyn CreatePolyn(Polyn head,int m)該函數(shù)功能是創(chuàng)建新的多項(xiàng)式鏈表。int m保存的多項(xiàng)式的項(xiàng)數(shù),使用for語(yǔ)句, 控制輸入多項(xiàng)式的每一項(xiàng)。當(dāng)創(chuàng)建的鏈表長(zhǎng)度為m時(shí),將不再提示用戶(hù)繼續(xù)輸入多項(xiàng)式的系數(shù)和指數(shù)。在該函數(shù)中要用到分配空間的函數(shù)malloc()為新建鏈表分配空間。3. void DestroyPolyn(Polyn p)該函數(shù)的功能是銷(xiāo)毀掉創(chuàng)建的兩個(gè)鏈表,釋放內(nèi)存

9、。以輔助退出程序。4. void Insert(Polyn p,Polyn h)該函數(shù)功能:將新的節(jié)點(diǎn)p插入到現(xiàn)有鏈表的后面,并確保多項(xiàng)式的指數(shù) exp是 升序。將 s 節(jié)點(diǎn)插入到 head 所指向的鏈表。在該函數(shù)的操作中,要注意指針是如何 移動(dòng)的。5. Polyn AddPolyn(Polyn pa,Polyn pb)該函數(shù)功能:實(shí)現(xiàn)兩個(gè)多項(xiàng)式pa、pb相加,并將計(jì)算結(jié)果存儲(chǔ)于新建立的pc中,它的原理是將指數(shù)相同的單項(xiàng)式相加,系數(shù)相加后為0,則 pa、pb 的指針都后移。在加法計(jì)算中要求pa,與pb的幕次序都是升序,否則可能得到錯(cuò)誤的結(jié)果。該函數(shù)調(diào)用了 int compare(Polyn a

10、,Polyn b)的結(jié)果,用來(lái)判斷多項(xiàng)式在同一指 數(shù)下 a、b 是否有為系數(shù)為 0。同樣也使用了 malloc() 關(guān)鍵字,為新鏈表創(chuàng)建空間。6. int compare(Polyn a,Polyn b)該函數(shù)功能:判斷兩個(gè)多項(xiàng)式在同一指數(shù)下是否有其中一個(gè)為系數(shù)為 0。用來(lái)輔 助加法和乘法運(yùn)算。7. Polyn SubtractPolyn(Polyn pa,Polyn pb)該函數(shù)功能:實(shí)現(xiàn)兩個(gè)多項(xiàng)式 pa、pb 相減,其原理根加法類(lèi)似,將指數(shù)相同的 指數(shù)相減。與加法不同的是在送在減法中,創(chuàng)建了新的鏈表來(lái)存放結(jié)果,并返回該鏈 表的頭指針。8. void PrintPolyn(Polyn P)該

11、函數(shù)功能:顯示多項(xiàng)式鏈表。在該函數(shù)中較復(fù)雜的是如何控制鏈表的輸出,尤 其是第一項(xiàng)的輸出,同時(shí)還有符號(hào)的控制。在輸出第一項(xiàng)時(shí)要判斷是不是常數(shù)項(xiàng),若 是,則不要輸出字符 x。9. Polyn MultiplyPolyn(Polyn pa,Polyn pb)函數(shù)功能:實(shí)現(xiàn)兩個(gè)多項(xiàng)式相乘, A(X) * B(x) 。計(jì)算時(shí)運(yùn)用單項(xiàng)式與多項(xiàng)式相 乘的法則,然后再次運(yùn)用單項(xiàng)式與多項(xiàng)式相乘的法則。4 系統(tǒng)實(shí)現(xiàn)該程序?qū)崿F(xiàn)了多項(xiàng)式的創(chuàng)建、 多項(xiàng)式的加法、 減法、乘法運(yùn)算以及多項(xiàng)式的清除為完成這些功能,還用到了一些輔助函數(shù)。下面討論重要函數(shù)具體實(shí)現(xiàn)過(guò)程及其參數(shù)的意義:1. Polyn CreatePoly n(P

12、olyn head,i nt m)該函數(shù)的兩個(gè)參數(shù),head表示為創(chuàng)建的鏈 表的頭指針,m表示為鏈表的長(zhǎng)度,即多項(xiàng)式的項(xiàng)數(shù)。定義int i計(jì)數(shù),當(dāng)i<m時(shí),for 語(yǔ)句反復(fù)提示用戶(hù)輸入該多項(xiàng)式的每一項(xiàng)的指數(shù)和系數(shù),并保存。當(dāng) i=m 時(shí),輸入完 畢,該鏈表也創(chuàng)建完畢。詳細(xì)的實(shí)現(xiàn)過(guò)程如下:Polyn CreatePolyn(Polyn head,int m)int i;/ 用來(lái)計(jì)數(shù)Polyn p;定義一個(gè)p鏈表p=head=(Polyn)malloc(sizeof(struct Polynomial);head->next=NULL;for(i=0;i<m;i+)p=(Poly

13、 n) malloc(sizeof(struct Poly no mial);/ 建立新結(jié)點(diǎn)以接收數(shù)據(jù)printf("請(qǐng)輸入第%d項(xiàng)的系數(shù)與指數(shù):",i+1);scanf("%f %d",&p->coef,&p->expn);Insert(p,head);調(diào)用Insert函數(shù)插入結(jié)點(diǎn)return head;/CreatePolyn2. void Insert(Polyn p,Polyn h) 該函數(shù)具有兩個(gè)參數(shù), 用來(lái)實(shí)現(xiàn)鏈表的順序排列和合并相同的項(xiàng)。以下是實(shí)現(xiàn)插入的關(guān)鍵代碼:void Insert(Polyn p,Polyn

14、 h)if(p->coef=0) free(p);/系數(shù)為 0 的話(huà)釋放結(jié)點(diǎn)else/如果系數(shù)不為0Polyn q1,q2;q1=h;q2=h->next;while(q2&&p->expn<q2->expn) /查找插入位置q1=q2;q2=q2->next; if(q2&&p->expn=q2->expn)/將指數(shù)相同相合并q2->coef+=p->coef;free(p);if(!q2->coef) /系數(shù)為 0 的話(huà)釋放結(jié)點(diǎn)q1->next=q2->next;free(q2);

15、 else/指數(shù)為新時(shí)將結(jié)點(diǎn)插入p->next=q2;q1->next=p;/Insert3. Polyn AddPoly n(Polyn pa,Poly n pb)該函數(shù)有兩個(gè)參數(shù),其類(lèi)型均為 poly n,分 別表示要相加的兩個(gè)不同的多項(xiàng)式。其計(jì)算的結(jié)果存放在新建的 pc 所指向的鏈表中。 函數(shù)中調(diào)用了 int compare(Polyn a,Polyn b的結(jié)果。下面是實(shí)現(xiàn)加法的關(guān)鍵代碼:Polyn AddPolyn(Polyn pa,Polyn pb)求解并建立多項(xiàng)式 a+b,返回其頭指針Polyn qa=pa->next;Polyn qb=pb->next;P

16、olyn headc,hc,qc;hc=(Poly n) malloc(sizeof(struct Poly no mial);/ 建立頭結(jié)點(diǎn)hc->next=NULL;headc=hc;while(qa|qb)qc=(Polyn)malloc(sizeof(struct Polynomial);switch(compare(qa,qb)case 1: qc->coef=qa->coef; qc->expn=qa->expn;qa=qa->next;break;case 0: qc->coef=qa->coef+qb->coef; qc-&

17、gt;expn=qa->expn;qa=qa->next;qb=qb->next;break;case -1:qc->coef=qb->coef; qc->expn=qb->expn;qb=qb->next; break;/switchif(qc->coef!=0) qc->next=hc->next;hc->next=qc;hc=qc;else free(qc);/當(dāng)相加系數(shù)為0時(shí),釋放該結(jié)點(diǎn) /whilereturn headc;/AddPolynint compare(Polyn a,Polyn b)if(a&

18、;&b)if(!b|a->expn>b->expn) return 1;else if(!a|a->expn<b->expn) return -1;else return 0;else if(!a&&b) return -1;/a 多項(xiàng)式已空,但 b 多項(xiàng)式非空else return 1;/b多項(xiàng)式已空,但a多項(xiàng)式非空/compare4. Polyn MultiplyPolyn(Polyn pa,Polyn pb) 該函數(shù)同加法一樣, 擁有相同的參數(shù)并 且同樣將新建立的鏈表 pf 的指針?lè)祷?,用?lái)實(shí)現(xiàn)輸出乘法結(jié)果。下面給出關(guān)鍵代碼:

19、Polyn MultiplyPolyn(Polyn pa,Polyn pb)Polyn hf,pf;Polyn qa=pa->next;Polyn qb=pb->next;hf=(Poly n)malloc(sizeof(struct Poly no mial);/ 建立頭結(jié)點(diǎn) hf->next=NULL;for(;qa;qa=qa->next) for(qb=pb->next;qb;qb=qb->next) pf=(Polyn)malloc(sizeof(struct Polynomial); pf->coef=qa->coef*qb->

20、coef;pf->expn=qa->expn+qb->expn;Insert(pf,hf);/調(diào)用Insert函數(shù)以合并指數(shù)相同的項(xiàng)return hf;/MultiplyPolyn5. 其它函數(shù)的介紹請(qǐng)參見(jiàn)附錄中詳細(xì)代碼5調(diào)試及運(yùn)行結(jié)果該程序在VC6.0中調(diào)試通過(guò),沒(méi)有錯(cuò)誤和警告,運(yùn)行結(jié)果經(jīng)過(guò)檢驗(yàn)為正確。以下圖5-1即為該程序運(yùn)行結(jié)果效果圖。圖中采用的是計(jì)算多項(xiàng)式4xA5+2xA2+3x和xA10+7xA2的加減乘三種運(yùn)算進(jìn)行演示:I國(guó)一入入入入入入入的項(xiàng)數(shù)汨 1項(xiàng)齒系數(shù)與指數(shù)訂1 2項(xiàng)的索藪與浦?jǐn)?shù)江2 孑項(xiàng)的系數(shù)與謁數(shù)汽5 三謗項(xiàng)式頂數(shù)詔 1項(xiàng)癖數(shù)與指數(shù)汐2 2項(xiàng)的系數(shù)與椿

21、數(shù)江18輸入兩個(gè)多項(xiàng)式的每項(xiàng)值aaB 曰 斐式式式 操項(xiàng)項(xiàng)項(xiàng)項(xiàng) 的多多多多 行出立立算出 y!-.- 里 12 3 4 5ti的提示功能選擇多項(xiàng)式z 4«A5 +2MA2+3H多質(zhì)式b;滬1百切:臨進(jìn)行三則運(yùn)算的結(jié)果2多項(xiàng)式扎巧:XA18+4K +9X2+2H3多項(xiàng)貳盯b: -KA10+4X"S-5K*2*3K4多項(xiàng)式護(hù)h; Krt152XA12+»rtH+28KA7+14«rt4*21WAaPress suny ke 寸 to con t in tie圖5-16 收獲和體會(huì)通過(guò)這次課程設(shè)計(jì)練習(xí),使我更深刻地理解了C語(yǔ)言的精髓-指針的使用完成整個(gè)程序設(shè)計(jì)

22、有,對(duì)指針掌握的更加熟練。同時(shí)通過(guò)直接對(duì)鏈表的操作,加深了對(duì)數(shù)據(jù)結(jié)構(gòu)的理解和認(rèn)識(shí)。并在完成課程設(shè) 計(jì)的過(guò)程作主動(dòng)查閱了相關(guān)資料,學(xué)到了不少課本上沒(méi)有的技術(shù)知識(shí)。經(jīng)過(guò)這次課程設(shè)計(jì),我深刻認(rèn)識(shí)到算法在程序設(shè)計(jì)中的重要性,一個(gè)完整的程序總是由若干個(gè)函數(shù)構(gòu)成的,這些相應(yīng)的函數(shù)體現(xiàn)了算法的基本思想。編程是一件枯燥乏味工作,但是只要認(rèn)真專(zhuān)研,我們會(huì)從中學(xué)到很多在課本上學(xué) 不到或者無(wú)法在課堂上掌握的知識(shí),同時(shí)也能從中感受到編程的樂(lè)趣。興趣是可以培 養(yǎng)的,只要堅(jiān)持下去,面對(duì)困難我們總能夠找到解決問(wèn)題的方法。計(jì)算多項(xiàng)式的加、減、乘法運(yùn)算 該程序雖然不是很大,這次還是由幾位同學(xué)合作才完成這一任務(wù)。在這個(gè)小組中我是

23、組長(zhǎng),通過(guò)分工與合作,使我充分認(rèn)識(shí)到 在項(xiàng)目團(tuán)隊(duì)開(kāi)發(fā)過(guò)程中合作的重要性, 也更加理解了溝通協(xié)作能力在軟件開(kāi)發(fā)行業(yè)中 的重要性。另外也需要提出的是在這次程序設(shè)計(jì)的過(guò)程中,非常感謝老師對(duì)我們的耐心指 導(dǎo)。老師在教學(xué)過(guò)程中表現(xiàn)出來(lái)的對(duì)學(xué)術(shù)專(zhuān)研一絲不茍的精神讓我非常有收獲。同樣 也是老師的嚴(yán)格要求才使得小組成員能夠順利的完成任務(wù)。附錄#include<stdio.h>#include<malloc.h>/*/ typedef struct Polynomialfloat coef;/ 系數(shù)int exp n;/ 指數(shù)struct Poly nomial *n ext;/ 指向下

24、一個(gè)結(jié)點(diǎn)*Polyn,Polynomial;/Polyn 為結(jié)點(diǎn)指針類(lèi)型/*/void Insert(Polyn p,Polyn h)if(p->coef=0) free(p);/系數(shù)為 0 的話(huà)釋放結(jié)點(diǎn)else如果系數(shù)不為0Polyn q1,q2;q1=h;q2=h->next;while(q2&&p->expn<q2->expn)/查找插入位置q1=q2;q2=q2->next;if(q2&&p->expn=q2->expn)/將指數(shù)相同相合并q2->coef+=p->coef;free(p);if

25、(!q2->coef)/系數(shù)為 0的話(huà)釋放結(jié)點(diǎn)q1->next=q2->next;free(q2);/指數(shù)為新時(shí)將結(jié)點(diǎn)插入elsep->next=q2;q1->next=p;/Insert以下函數(shù)實(shí)現(xiàn)建立一個(gè)多項(xiàng)式 */Polyn CreatePolyn(Polyn head,int m)建立一個(gè)頭指針為 head 項(xiàng)數(shù)為 m的一元多項(xiàng) 式在主程序初始時(shí),先輸入的多項(xiàng)式中的項(xiàng)數(shù)m、n在這里為m。主程序中的pa、pb 在此為 headint i;用來(lái)計(jì)數(shù)Polyn p;定義一個(gè)p鏈表 p=head=(Polyn)malloc(sizeof(struct Polyno

26、mial); head->next=NULL;for(i=0;i<m;i+)p=(Poly n)malloc(sizeof(struct Poly no mial);/ 建立新結(jié)點(diǎn)以接收數(shù)據(jù)printf("請(qǐng)輸入第%d項(xiàng)的系數(shù)與指數(shù):",i+1);scanf("%f %d",&p->coef,&p->expn);Insert(p,head);/調(diào)用Insert函數(shù)插入結(jié)點(diǎn)return head;/CreatePolyn/*以下函數(shù)實(shí)現(xiàn)多項(xiàng)式的銷(xiāo)毀 */void DestroyPolyn(Polyn p)/ 銷(xiāo)毀多項(xiàng)

27、式 p Polyn q1,q2;q1=p->next;q2=q1->next;while(q1->next)free(q1);q1=q2;/指針后移 q2=q2->next;/*以下函數(shù)實(shí)現(xiàn)顯示輸出多項(xiàng)式 * */void PrintPolyn(Polyn P)Polyn q=P->next;int flag= 1 ;/項(xiàng)數(shù)計(jì)數(shù)器if(!q) / 若多項(xiàng)式為空,輸出 0putchar('0');printf("n");return;while (q)if(q->coef>0&&flag!=1) put

28、char('+'); / 系數(shù)大于 0 且不是第一項(xiàng) if(q->coef!=1&&q->coef!=-1)/ 系數(shù)非 1 或-1 的普通情況 printf("%g",q->coef);if(q->expn=1) putchar('X');else if(q->exp n) pri ntf("XA%d",q->exp n);elseif(q->coef=1)if(!q->expn) putchar('1');else if(q->expn

29、=1) putchar('X');else printf("XA%d",q->expn);if(q->coef=-1)if(!q->expn) printf("-1"); else if(q->expn=1) printf("-X"); else prin tf("-XA%d",q->exp n);q=q->next;flag+;/whileprintf("n");/PrintPolyn在下面的輔助乘法和加法運(yùn)算 */int compare(P

30、olyn a,Polyn b)if(a&&b)if(!b|a->expn>b->expn) return 1;else if(!a|a->expn<b->expn) return -1;else return 0;else if(!a&&b) return -1;/a 多項(xiàng)式已空,但 b 多項(xiàng)式非空else return 1;/b多項(xiàng)式已空,但a多項(xiàng)式非空/compare/*以下函數(shù)實(shí)現(xiàn)加法 */Polyn AddPolyn(Polyn pa,Polyn pb)/求解并建立多項(xiàng)式 a+b,返回其頭指針Polyn qa=pa-&

31、gt;next;Polyn qb=pb->next;Polyn headc,hc,qc;hc=(Poly n) malloc(sizeof(struct Pol yno mial);/ 建立頭結(jié)點(diǎn) hc->next=NULL;headc=hc;while(qa|qb)qc=(Polyn)malloc(sizeof(struct Polynomial);switch(compare(qa,qb)case 1:qc->coef=qa->coef;qc->expn=qa->expn;qa=qa->next;break;case 0:qc->coef=q

32、a->coef+qb->coef;qc->expn=qa->expn;qa=qa->next;qb=qb->next;break;case -1:qc->coef=qb->coef;qc->expn=qb->expn;qb=qb->next;break;/switchif(qc->coef!=0)qc->next=hc->next;hc->next=qc;hc=qc;else free(qc);/當(dāng)相加系數(shù)為0時(shí),釋放該結(jié)點(diǎn) /whilereturn headc;/AddPolyn/*以下函數(shù)實(shí)現(xiàn)減法 *

33、/Polyn SubtractPolyn(Polyn pa,Polyn pb)/求解并建立多項(xiàng)式 a+b,返回其頭指針 Polyn h=pb;Polyn p=pb->next;Polyn pd;while(p)/將 pb 的系數(shù)取反p->coef*=-1;p=p->next;pd=AddPolyn(pa,h);for(p=h->next;p;p=p->next) /恢復(fù) pb 的系數(shù) p->coef*=-1;return pd;/SubtractPolyn以下函數(shù)實(shí)現(xiàn)乘法Polyn MultiplyPolyn(Polyn pa,Polyn pb)/求解并建立

34、多項(xiàng)式 a*b,返回其頭指針(該函數(shù)實(shí)現(xiàn)乘法 )Polyn hf,pf;Polyn qa=pa->next;Polyn qb=pb->next;hf=(Poly n)malloc(sizeof(struct Poly no mial);/ 建立頭結(jié)點(diǎn)hf->next=NULL;for(;qa;qa=qa->next)for(qb=pb->next;qb;qb=qb->next) pf=(Polyn)malloc(sizeof(struct Polynomial);pf->coef=qa->coef*qb->coef;pf->expn=qa->expn+qb->expn;Insert(pf,hf);調(diào)用Insert函數(shù)以合并指數(shù)相同的項(xiàng)return hf;

溫馨提示

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

評(píng)論

0/150

提交評(píng)論