2023年大二上 資料結構 鍊錶(7) 多項式求和

2021-07-06 10:54:50 字數 2709 閱讀 1378

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

多項式的通式是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鏈結到相加後的第乙個多項式末尾。

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

/*

*檔名稱:annpion.cpp

*完成日期:2023年11月5日

*版本號:v1.0

**問題描述:用單鏈表儲存一元多項式,並實現兩個多項式的加法。

*輸入描述:兩個多項式。

*輸出描述:兩個多項式相加後的多項式。

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

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

polyarray;

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

polynode;

void disppoly(polynode *l) //輸出多項式

if(p->exp==0)

else if(p->coef ==1)

printf("%gx",p->coef);

else printf("%gx^%d",p->coef,p->exp);

p=p->next;

}printf("\n");

}void destroylist(polynode *&l)

}void createlistr(polynode *&l, polyarray a, int n)

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

else if(p->expexp)

else

q=q->next;

p=p->next;}}

if(q!=null)

p=q;

while(p!=null)

listc->next=null;

}int main()

,,,};

polyarray b= ,,,,};

createlistr(ha,a,4);

createlistr(hb,b,5);

printf("原多項式a: ");

disppoly(ha);

printf("原多項式b: ");

disppoly(hb);

add(ha,hb,hc);

printf("多項式相加: ");

disppoly(hc);

destroylist(ha);

destroylist(hb);

destroylist(hc);

return 0;

}

執行結果:

2023年大二上 資料結構 順序表(2) 刪除元素

檔名稱 annpion.cpp 完成日期 2015年10月22日 版本號 v1.0 問題描述 刪除元素在 x,y 之間的所有元素,要求演算法的時間複雜度為o n 空間複雜度為o 1 輸入描述 輸入2個數x,y。輸出描述 輸出刪除了 x,y 的陣列。include list.h include voi...

2023年大二上 資料結構 棧(3) 括號的匹配

檔名稱 annpion.cpp 完成日期 2015年11月13日 版本號 v1.0 問題描述 假設表示式中允許三種括號 圓括號 方括號和大括號。編寫乙個演算法,判斷表示式中的各種左括號是否與右括號匹配。輸入描述 表示式。輸出描述 輸出是否匹配正確。include stack.h include in...

2023年大二上 資料結構 棧(2) 鏈棧演算法庫

main.cpp 檔名稱 annpion.cpp 完成日期 2015年11月6日 版本號 v1.0 問題描述 main.cpp 輸入描述 無。輸出描述 輸出各個函式的測試結果。include include listack.h int main printf n printf 8 鏈棧為 s n s...