1. 程式人生 > >【資料結構】用連結串列實現多項式運算

【資料結構】用連結串列實現多項式運算

一元多項式的運算包括加法減法和乘法,而多項式的加法和乘法都可以依靠多項式的加法來實現,所以本文僅僅講解如何用連結串列實現一元多項式的加法。

數學上的一元多項式的表示是p(x) = p0 + p1 * x + p2 * x^2 + p3 * x^3 + … + pn * x^n;
用連結串列來表示就是p = (p0, p1, p2, … , pn);
所謂的多項式相加就是同類項的合併,也就是兩條連結串列的合併。
採用單鏈表儲存多項式,連結串列的每個結點表示多項式的每一非零項,連結串列應該按有序排列。

結點如下:

struct PolyNode {
    float coef;     //存放係數
int exp; //存放指數 PolyNode * next; };

類定義如下:

class PolyLinkList {
public:
    PolyLinkList(arguments);
    ~PolyLinkList();
    void show();
    void polyAdd(PolyLinkList & LB);
};

下面先就兩個一元多項式連結串列LP和LQ相加為例說明:
如圖所示,qa, qb分別指向兩條連結串列的當前結點,pa, pb分別指向當前結點的前驅。
開始時四個指標分別指向兩個單鏈表的頭結點和開始結點:

這裡寫圖片描述

兩個多項式求和實際上是對結點qa的指數和結點qb的指數進行比較,這會出現一下三種情況:
(1)qa指數<qb指數,則結點qa應為結果中的一個結點,將指標qa和pa向後移動一個結點,qb和pb不移動。如圖:

這裡寫圖片描述

(2)qa的指數=qb的指數,則qa和qb所指向的是”同類項”。先將qb的係數加到qa上,再判斷是否為零。若相加的結果不為零,則將指標qa和pa向後移,再將qb向後移,再刪除原結點qb,如圖:

這裡寫圖片描述

若相加的結果為零,則表明結果中無此項,同時刪除結點qa和結點qb,並個將4個指標分別後移,如圖所示:

這裡寫圖片描述

(3)qa指數>qb指數,則結點qb應為結果中的一個結點,將qb插入到第一個單鏈表中結點qa之前,pa指向新插入的結點,再將指標pb和qb向後移。

上述情況是針對指標qa和qb均不為空的情況,在進行指數比較的過程中,如果qa已空而qb非空,此時直接將第二個連結串列中剩餘的結點連線到第一個連結串列的後面。

下面是具體的程式碼:

void PolyLinkList::polyAdd(PolyLinkList & LB) {
    float sum;
    PolyNode *pa, *pb, *qa, *qb;
    //初始化
    pa = head;
    qa = pa->next;
    pb = LB.head;
    qb = pb->next;
    while (qa != NULL && qb != NULL) {
        if (qa->exp < qb->exp) {     //第一種情況
            pa = qa;
            qa = qa->next;
        } else if (qa->exp > qb->exp) {     //第三種情況
            pb->next = qb->next;
            qb->next = qa;
            pa->next = qb;
            pa = qb;
            qb = pb->next;
        } else {                            //第二種情況
            sum = qa->coef + qb->coef;
            if (sum == 0) {                 //係數和為0,刪除結點qa和qb
                pa->next = qa->next;
                delete qa;
                qa = pa->next;
                pb->next = qb->next;
                delete qb;
                qb = pb->next;
            } else {                        //係數和不為0,只刪除結點qb
                qa->coef = sum;
                pa = qa;
                qa = qa->next;
                pb->next = qb->next;
                delete qb;
                qb = pb->next;
            }
        }
    }
    if (qb != NULL) {
        qa->next = qb;          //插入剩餘的部分
    }
}