資料結構上機實踐第四周專案7 多項式求和

2021-08-14 00:07:55 字數 3011 閱讀 6198

用單鏈表儲存一元多項式,並實現兩個多項式的加法。

多項式的通式是pn

(x)=

anxn

+an−

1xn−

1+..

.+a1

x+a0

。n次多項式共有n+1項。直觀地,可以定義乙個陣列來儲存這n+1個係數。以多項式p(

x)=−

3.4x10−

9.6x8+

7.2x2+

x為例,儲存這個多項式的陣列如下圖: 

可以看出,這種方案適合對某些多項式的處理。但是,在處理一些次數高但項數少的多項式時,存在浪費空間的現象,會有很多閒置的0。 

可以使用如下定義的單鏈表結構儲存多項式:鍊錶中的每乙個結點是多項式中的一項,結點的資料域包括指數和係數兩部分,由指標域連線起多項式中的各項。 

typedef struct pnode //定義單鏈表結點型別,儲存多項式中的一項,鍊錶構成多項式 polynode; 

用於表示多項式的鍊錶將如下圖所示,在建立多項式的鍊錶時,已經令結點按指數由大到小的順序排列。 

2、多項式加法在鍊錶儲存結構下的實現

鍊錶儲存結構下,多項式加法的實現 在如上定義的單鏈表儲存結構基礎上,討論實現多項式加法的演算法。 

兩個多項式相加,其規則是對具有相同指數的項,令其係數相加。設兩個待相加的多項式的鍊錶的頭指標分別為head1(第乙個多項式)和head2(第二個多項式),兩者的和儲存到鍊錶head1中。只需要先將head1和head2鍊錶的首結點作為當前結點(分別用p1和p2指向)開始檢測,在遍歷鍊錶的過程中,分情況作如下處理: 

(1)若兩個多項式中當前結點的指數值相同,則它們的係數相加,結果儲存到p1結點,並將p2結點刪除。如果相加後的係數不為0,p1指向第乙個多項式的下乙個結點,準備隨後的工作,否則,不儲存係數為0的項,將當前p1結點刪除。 

(2)當兩個多項式中對應結點的指數值不相等時,若p1指向的結點的指數大,則p1簡單地指向下一結點即可;而p2指向的結點大時,需要將p2結點插入到p1前,然後p2再重新指回到第二個多項式中的下一結點,繼續進行處理。 

(3)檢測過程直到其中的任乙個鍊錶結束。若p1不為空,第乙個多項式中的剩餘項已經在鍊錶中,不作處理,如果p2不為空,只需要將p2鏈結到相加後的第乙個多項式末尾。 

上面的討論假設多項式鍊錶中,已經按指數由大到小排序,在加法之前,採取多種手段保證這一前提成立。

實現源**:

#include 

#include 

#define max 20          //多項式最多項數

typedef

struct

//定義存放多項式的陣列型別

polyarray;  

typedef

struct

pnode    

//定義單鏈表結點型別,儲存多項式中的一項,鍊錶構成多項式

polynode;  

void

disppoly(polynode *l)  

//輸出多項式

printf("\n"

);  

}  void

destroylist(polynode *&l)  

//銷毀單鏈表

free(p);  

}  void

createlistr(polynode *&l, polyarray a, 

intn) 

//尾插法建表

r->next=null;               //終端結點next域置為null

}  void

sort(polynode *&head)      

//按exp域遞減排序

}  }  void

add(polynode *ha,polynode *hb,polynode *&hc)  

//求兩有序集合的並,完成加法

else

if(pa->expexp)  

else

//pa->exp=pb->exp

pa=pa->next;  

pb=pb->next;  

}  }  

if(pb!=null) pa=pb;    

//複製餘下的結點

while

(pa!=null)  

tc->next=null;  

}  int

main()  

,,,};  

polyarray b= ,,,,};  

createlistr(ha,a,4);  

createlistr(hb,b,5);  

printf("原多項式a:   "

);  

disppoly(ha);  

printf("原多項式b:   "

);  

disppoly(hb);  

sort(ha);  

sort(hb);  

printf("有序多項式a: "

);  

disppoly(ha);  

printf("有序多項式b: "

);  

disppoly(hb);  

add(ha,hb,hc);  

printf("多項式相加:  "

);  

disppoly(hc);  

destroylist(ha);  

destroylist(hb);  

destroylist(hc);  

return

0;  

}  

執行結果截圖如下:

第四周專案三 資料結構實踐(二) 單鏈表 連線

檔名稱 linklist.cpp,main.cpp,linklist.h 完成日期 2015年9月23日 版本號 codeblocks 問題描述 已知l1和l2分別指向兩個單鏈表的頭結點,且已知其長度分別為m n,請設計演算法將l2連線到l1的後面。輸入描述 無 程式輸出 連線以後的結果。ifnde...

第四周專案二

檔名稱 array.cpp 作 者 李中意 完成日期 2014 年 3月 19 日 版本號 v1.0 輸入描述 無 include includeusing namespace std class void setb double y void setc double z double geta v...

第四周專案二

01.02.程式的版權和版本宣告部分 05.檔名稱 score.cpp 06.作 者 07.完成日期 2014年 3 月 25 日 08.版本號 v1.0 09.輸入描述 已經在程式中初始化 10.問題描述 11.輸出 12.include includeusing namespace std cl...