多項式加法運算 使用鏈表實現


/*
多項式加法運算
使用鏈表實現
*/
#include <iostream>
using namespace std;

//使用不帶頭結點的單向鏈表,按照指數遞減的順序排列
typedef struct PolyNode
{
    int coef;    //系數
    int expon;    //指數
    PolyNode *link;    //指向下一個節點的指針
}*polynomial, npolynomial;

polynomial PolyAdd(polynomial p1, polynomial p2);
int Compare(int p1e, int p2e);
void Attach(int coef, int expon, polynomial &pRear);
polynomial CreatePoly(int size);

int main()
{
    polynomial p1, p2, sump;
    p1 = CreatePoly(5);
    p2 = CreatePoly(8);
    
    sump = PolyAdd(p1, p2);

    cout << "p1:" << endl;
    while (p1)
    {
        cout << p1->coef << "x^" << p1->expon << '+';
        p1 = p1->link;
    }
    cout << endl;

    cout << "p2:" << endl;
    while (p2)
    {
        cout << p2->coef << "x^" << p2->expon << '+';
        p2 = p2->link;
    }
    cout << endl;

    cout << "sump:" << endl;
    while ( sump )
    {
        cout << sump->coef << "x^" << sump->expon << '+';
        sump = sump->link;
    }
    cout << endl;
    return 0;
}

polynomial PolyAdd(polynomial p1, polynomial p2)
{
    polynomial front, rear, temp;
    int sum;
    rear = new npolynomial;    //為方便表頭插入,先產生一個臨時空結點作為結果多項式鏈表頭
    front = rear;    //由front記錄結果多項式鏈表頭結點
    while ( p1 && p2 )    //當兩個多項式都有非零項待處理時
    {
        switch (Compare(p1->expon, p2->expon))
        {
        case 1:    //p1中的數據項指數較大
            Attach(p1->coef, p1->expon, rear);
            p1 = p1->link;
            break;
        case -1:    //p2中的數據項指數較大
            Attach(p2->coef, p2->expon, rear);
            p2 = p2->link;
            break;
        case 0:    //兩數據項指數相等
            sum = p1->coef + p2->coef;
            if (sum)    //判斷系數和是否為0
            {
                Attach(sum, p1->expon, rear);
            }
            p1 = p1->link;
            p2 = p2->link;
            break;
        }
    }
    //將未處理完的另一個多項式的所有節點依次復制到結果多項式去
    while ( p1 )
    {
        Attach(p1->coef, p1->expon, rear);
        p1 = p1->link;
    }
    while (p2)
    {
        Attach(p2->coef, p2->expon, rear);
        p2 = p2->link;
    }
    rear->link = NULL;
    temp = front;
    front = front->link;    //使front指向結果多項式第一個非零項目
    delete temp;
    return front;
}

int Compare(int p1e, int p2e)
{
    if ( p1e > p2e )
    {
        return 1;
    }
    else if (p1e < p2e)
    {
        return -1;
    }
    else
    {
        return 0;
    }
}

void Attach(int coef, int expon, polynomial &pRear)
{
    //由於本函數需要改變當前結果表達式尾項指針的值;
    //因此函數傳遞進來的是結點指針的地址,p指向尾項
    polynomial p;

    p = new npolynomial;
    p->coef = coef;
    p->expon = expon;
    //將P指向的新結點插入到當前結果表達式尾項的后面
    pRear->link = p;
    pRear = p;
}

polynomial CreatePoly(int size)    //降序建立多項式
{
    polynomial head, p;
    head = NULL;
    p = NULL;
    for (int i = 0; i < size; i++)
    {
        p = new npolynomial;
        p->link = NULL;
        p->coef = i;
        p->expon = i;
        if ( head != NULL )    //在鏈表頭部插入
        {
            p->link = head;
            head = p;
        }
        else
        {
            head = p;
        }
    }
    return head;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM