一元多項式可以很容易的表示為線性表如:2*x^8-9*x^5+5*x^2+8,構成的線性表為, , , },線性表的每個資料元素為的形式。考慮到多項式的次數可能很高且變化很大,我們採用雙向鍊錶的形式來作為多項式的邏輯結構。
我們假設輸入的多項式按照次數的高低從前往後排列,不滿足這一條件的使用排序來達到這樣的效果。這樣進行多項式的加、減操作時,只需要分配乙個新的鍊錶,從前往後遍歷兩個相加、減的多項式,比較多項式項次數的高低來插入較高次數的多項式到新鍊錶,次數相等的多項式項加、減對應的基數後再插入。多項式的乘法就是展開各個項相乘後再累加起來,原理是一樣的。
下面是部分實現程式,其中注意完整程式加減法都提供了乙個slow版本和乙個fast版本:slow版本就是新分配乙個鍊錶,遍歷多項式的兩個煉表項複製它們的值來插入,需要動態開闢記憶體,相對較慢;fast版本利用了指標的特性,直接將各個項串接起來,相對較快,但是這樣導致原來相加、減的兩個多項式項的鍊錶發生了變化,這是我們不希望看到的,如果非要這個函式,必須先複製兩個多項式做備份,這裡放上這個fast函式只是為了補充說明鍊錶合併的方便性。
鍊錶儲存結構
typedef struct
jwlistelem;
typedef struct tagjwlistnode
jwlistnode, *pjwlistnode, jwlist, *pjwlist;
typedef pjwlist poly ;
多項式操作函式
/*
功能:將兩個從高次到低次排序好的多項式相加
輸入:多項式p1和p2
輸出:相加後的多項式
說明:由於結果的生成要不斷的重新申請空間執行速度相對較慢,但是p1和p2保持不變
*/poly polyaddslow(poly p1, poly p2)
else if(ptemp1->elem.superscript < ptemp2->elem.superscript)
else
ptemp1 = ptemp1->pnext;
ptemp2 = ptemp2->pnext;
} }//將剩餘的全部插在鍊錶結尾
while(ptemp1 != null)
while(ptemp2 != null)
return padd;}/*
功能:將兩個從高次到低次排序好的多項式相減
輸入:多項式p1和p2,p1-p2
輸出:相減後的多項式
說明:由於結果的生成要不斷的重新申請空間執行速度相對較慢,但是p1和p2保持不變
*/poly polysubtractslow(poly p1, poly p2)
else if(ptemp1->elem.superscript < ptemp2->elem.superscript)
else
ptemp1 = ptemp1->pnext;
ptemp2 = ptemp2->pnext;
} }//將剩餘的全部插在鍊錶結尾
while(ptemp1 != null)
while(ptemp2 != null)
return psub;}/*
功能:將兩個從高次到低次排序好的多項式相乘
輸入:兩個多項式p1和p2
輸出:相乘後的多項式
*/poly polymultiply(poly p1, poly p2)
//將已有結果累加
polysort(pline);//調整ptemp1的負上標和ptemp2相乘後上標排列順序還是從高到低!!!
pmulti = polyaddslow(pmultitemp, pline);
//刪除上一次展開計算的結果
jwlistdestroy(pmultitemp);
jwlistdestroy(pline);
pmultitemp = pmulti;
ptemp1 = ptemp1->pnext;
} return pmulti;
}
這裡放上示例計算結果供對比
完整程式
線性表 一元多項式的運算
polylist polycreate polylist head rear next null return head 思路 將兩個多項式從頭掃瞄,指數相同項相加,如果為0則釋放該空間,如果非0則構成一項,最終指數不同的項按指數公升序排列。用變數p q分別指向鏈a b中的第一結點,把結果存放在a中...
2 9線性表應用 一元多項式的表示及相加
前面學習了線性表的概念 順序儲存方式和鏈式儲存方式,本節課我們來 學習線性表應用。本節通過一元多項式的表示及相加的問題,作為線性表應用 的典型,總結了本章學習的線性表的兩種儲存方式 運算實現技術等主要內 容。一元多項式可按公升冪的形式寫成 pn x p0 p1xe1 p2xe2 pnxen,其中,e...
一元稀疏多項式的計算
能夠按照指數降序排列建立並輸出多項式 能夠完成兩個多項式的相加 相減,並將結果輸出 以鏈式儲存結構實現多項式。include include includeusing namespace std typedef struct pnode pnode,polynomial void createpol...