使用鍊錶實現兩個多項式相加和相乘

2021-08-01 06:44:42 字數 3833 閱讀 4810

設計函式分別求兩個一元多項式的乘積與和。

輸入分2行,每行分別先給出多項式非零項的個數,再以指數遞降方式輸入乙個多項式非零項係數和指數(絕對值均為不超過1000的整數)。數字間以空格分隔。

輸出分2行,分別以指數遞降方式輸出乘積多項式以及和多項式非零項的係數和指數。數字間以空格分隔,但結尾不能有多餘空格。零多項式應輸出0 0

4 3 4 -5 2  6 1  -2 0

3 5 20 -7 4 3 1

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1

5 20 -4 4 -5 2 9 1 -2 0

要實現此程式,大概需要以下幾個步驟:

1.讀入多項式1

2.讀入多項式2

3.進行加法計算

4.實現乘法計算

5.輸出乘法計算結果

6.輸出加法計算結果

1.考慮如何讀入多項式

在這之前我們需要確定鍊錶節點的結構

需要有coef儲存一項多項式的係數

需要有expon儲存一項多項式的指數

故構造資料型別

typedef struct polynode * polynomial;

struct polynode

polynomial readpoly()

t = p1;

p1 = p1->link;

free(t);//頭節點方便插入的使命完成,釋放頭節點

return p1;

}2.考慮如何進行多項式加法

首先傳入兩個多項式鍊錶,申請乙個鍊錶存放相加的結果,依次取出兩個多項式的節點

如果指數相等則相加,結果為零,釋放該節點,不為零申請節點將加和結果存入節點,並將節點插入和多項式;

如果不相等,則把指數大的節點插入和多項式。

在乙個鍊錶計算完成之後若另乙個鍊錶還有節點,則將剩餘節點全部插入和多項式

以下為加和函式:

polynomial addpoly(polynomial p1, polynomial p2)

t1 = t1->link;

t2 = t2->link;

} else if(t1->expon > t2->expon)//找到指數大的加入到p中

else

}while(t1)//如果t1還有多餘節點,則繼續加入

while(t2)//如果t2還有多餘節點,則繼續加入

t = p;

p = p->link;

free(t);//釋放頭節點

return p;

}

3.考慮如何進行多項式乘法

有兩種方法進行乘法計算:

1.先拿第乙個多項式的第一項乘以第二個多項式,生成乙個多項式,將此生成的多項式作為基本,之後用第乙個多項式的第二項依次乘以第二個多項式的每一項,每生成一項,將結果插入到之前生成的多項式中。(相當於插入項)

2.將第乙個多項式的每一項與第二個多項式相乘,每次生成乙個多項式,將這些多項式相加得結果。(相當於多個多項式加和)

此處採用第一種方法:

首先用第乙個多項式的第一項乘以第二個多項式生成乙個基本多項式,因為以後每生成一項要執行插入操作,而插入操作需要知道插入位置之前的節點,故每次判斷

"尾指標->link"是否和得到的乘積項的關係:

先將尾指標移動指數到不大於乘積項指數的前一項

若「尾指標->link->指數」與乘積項指數相同,則進行加法操作,若為零,刪除節點;否則修改節點。

否則就是「尾指標->link->指數」 < 乘積項指數,那麼將乘積項插入到尾指標之後。

以下為乘法函式:

polynomial multypoly(polynomial p1, polynomial p2)

t1 = t1->link;//t1指向第二項

while(t1)

else//相加結果為0 ,刪除rear之後的節點

}else //構造乙個新節點插入到rear之後

t2 = t2->link;

} t1 = t1->link;

} t = p;

p = p->link;

free(t);//釋放掉頭節點

return p;

}

4.如何進行輸出

輸出比較容易:

void printpoly(polynomial p)

while(p)

printf("\n");

}

最後給出完整**:

#include "stdio.h"

#include "stdlib.h"

/*1.首先要進行多項式的讀入,建構函式readpoly()

2.進行多項式加法,建構函式addpoly()

3.進行多項式乘法,建構函式multypoly()

4.進行多項式的輸出,怕、printpoly()

*/typedef struct polynode * polynomial;

struct polynode;

void attach(int c, int e, polynomial * rear);//將新讀入的係數和指數加到多項式的末尾

polynomial readpoly();//讀入多項式

polynomial addpoly(polynomial p1, polynomial p2);//計算兩個多項式之和

polynomial multypoly(polynomial p1, polynomial p2);//計算兩個多項式積

void printpoly(polynomial p);

int main()

void attach(int c, int e, polynomial * rear)

polynomial readpoly()

t = p1;

p1 = p1->link;

free(t);//頭節點方便插入的使命完成,釋放頭節點

return p1;

}polynomial addpoly(polynomial p1, polynomial p2)

t1 = t1->link;

t2 = t2->link;

} else if(t1->expon > t2->expon)//找到指數大的加入到p中

else

}while(t1)//如果t1還有多餘節點,則繼續加入

while(t2)//如果t2還有多餘節點,則繼續加入

t = p;

p = p->link;

free(t);//釋放頭節點

return p;

}polynomial multypoly(polynomial p1, polynomial p2)

t1 = t1->link;//t1指向第二項

while(t1)

else//相加結果為0 ,刪除rear之後的節點

}else //構造乙個新節點插入到rear之後

t2 = t2->link;

} t1 = t1->link;

} t = p;

p = p->link;

free(t);//釋放掉頭節點

return p;

} void printpoly(polynomial p)

while(p)

printf("\n");

}

鍊錶之兩個多項式相加

this code is to calculate two main polynomial addition created by liuyao in 2016.include include typedef struct polynode polynode,polylist int initlis...

兩個多項式相加!

以下是本人用單鏈表所編寫的兩個多項式相加的程式,不知為何在turboc2.0上執行總有兩個errors,而且都是 declaration syntax error 還請業內高手指導!謝謝!include math.h include stdio.h typedef struct node polyn...

兩個多項式相加

每組有兩行,每行由若干空格隔開的整數構成,以回車標誌結束。每行第乙個數表示本行有幾項,每一項由兩個整數表示,第1個整數表示係數,第2個整數表示次數。include includetypedef struct node node struct node creatnode int coe,int ex...