資料結構實踐 鍊錶 多項式求和

2021-09-30 17:13:55 字數 2771 閱讀 6515

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

本文針對資料結構基礎系列網路課程(2):線性表的實踐專案。

【專案 - 多項式求和】

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

多項式的通式是pn(

x)=a

nxn+

an−1

xn−1

+...

+a1x

+a0p

n(x)

=anx

n+an

−1xn

−1+.

..+a

1x+a

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

可以看出,這種方案適合對某些多項式的處理。但是,在處理一些次數高但項數少的多項式時,存在浪費空間的現象,會有很多閒置的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, int n) //尾插法建表    r->next=null;               //終端結點next域置為null}void sort(polynode *&head)      //按exp域遞減排序    }}void add(polynode *ha,polynode *hb,polynode *&hc)  //求兩有序集合的並,完成加法        else

if (pa->exp

exp)                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;}

給我老師的人工智慧教程打call!

資料結構實踐 多項式求和

檔名稱 main.cpp,完成日期 2015年10月5日 版本號 vc 6.0 問題描述 用單鏈表儲存一元多項式,並實現兩個多項式的加法。輸入描述 無 程式輸出 演算法結果 include include define max 20 多項式最多項數 typedef struct 定義存放多項式的陣列...

鍊錶多項式求和

雖然很簡單,但是還是花了我2個多小時才完成,哎.對於兩個一元多項式所有指數相同的項,對應係數相加 若其和不為零,則作為和多項式的一項插入到和多項式鍊錶中去 如指數不相同,則將指數數值較小的插入到和多項式鍊錶中去 注意 多項式鍊錶中的節點不需生成,而應該從兩個多項式鍊錶中摘取 include usin...

多項式求和 鍊錶

此題有乙個坑,就是因為數太大會超時,但試幾組資料就會發現,當它到一定的數時,結果就不變了,可以縮小計算範圍 多項式求和 time limit 1000ms memory limit 65536k 多項式描述如下 1 1 2 1 3 1 4 1 5 1 6 先請你求出多項式前n項的和。第一行輸入乙個數...