一元多項式的乘法與加法運算——鏈表實現


 

  題目來源PTA02-線性結構1 一元多項式的乘法與加法運算   (20分)

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

  輸入格式

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

  輸出格式

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

  輸入樣例

4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1

  即f1(x)=3x4-5x2+6x-2

   f2(x)=5x20-7x4+3x

  輸出樣例

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

  

  源碼

#include<iostream>
using namespace std;

/* 帶附加頭結點的單鏈表的類定義 */

typedef struct PolyNode * Polynomial;  //指向結點的指針
struct PolyNode          //鏈表結點類的定義
{
    int coef;            //系數
    int expon;           //指數
    Polynomial link;     //鏈指針域
};

/*  函數聲明部分  */
Polynomial ReadPoly();
void Attach(int c,int e,Polynomial *pRear);
Polynomial Add(Polynomial P1,Polynomial P2);
Polynomial Mult(Polynomial P1,Polynomial P2);
void PrintPoly(Polynomial P);

int main()
{
    Polynomial P1,P2,PP,PS;

    P1 = ReadPoly();    
    P2 = ReadPoly();
    PP = Mult(P1,P2);
    PrintPoly(PP);
    PS = Add(P1,P2);
    PrintPoly(PS);

    return 0;

}

Polynomial ReadPoly()    //讀入多項式構成鏈表,並返回鏈表的頭指針
{
    Polynomial first,rear,t;
    int N,c,e;    
    scanf("%d",&N);

    first = new PolyNode;//鏈表附加頭結點,這樣可以免除首節點的判斷,保持了操作的一致性
    first->link = NULL;
    rear = first;
    while (N--)
    {
        scanf("%d %d",&c,&e);
        Attach(c,e,&rear);    //將當前項插入多項式鏈表尾部
    }
    t = first; first = first->link; delete t;//最后刪除附加頭結點
    return first;
}

void Attach(int c,int e,Polynomial *pRear)//將當前項插入多項式鏈表尾部
{
    Polynomial P;
    P = new PolyNode;        //創建新節點
    P->coef = c;
    P->expon = e;
    P->link = NULL;
    (*pRear)->link = P;      //連接新結點
    *pRear = P;              //尾指針指向新節點
}

Polynomial Add(Polynomial P1,Polynomial P2)//多項式加法
{
    Polynomial first,rear,t;
    int sum;
    first = new PolyNode;    //鏈表附加頭結點
    first->link = NULL;
    rear = first;
    while(P1&&P2)
    {
        if (P1->expon == P2->expon)//兩數據項指數相等
        {
            sum = P1->coef + P2->coef;
            if(sum)    Attach(sum,P1->expon,&rear);//注意判斷系數和是否為0
            P1 = P1->link;
            P2 = P2->link;
        }
        else if (P1->expon > P2->expon)      //P1中的數據項指數較大
        {
            Attach(P1->coef,P1->expon,&rear);//把此P1項結點插入到結果多項式鏈表中
            P1 = P1->link;
        }
        else
        {
            Attach(P2->coef,P2->expon,&rear);
            P2 = P2->link;
        }

    }
    /*  將未處理完的另一個多項式的所有節點依次復制到結果多項式中去  */
    for(;P1;P1=P1->link)    Attach(P1->coef,P1->expon,&rear);
    for(;P2;P2=P2->link)    Attach(P2->coef,P2->expon,&rear);

    t = first; first = first->link; delete t;//刪除附加頭結點
    return first;
}

Polynomial Mult(Polynomial P1,Polynomial P2)
{
    Polynomial first,rear,temp,sP2;
    int c,e;
    if(!P1||!P2)    return NULL;

    first = new PolyNode;//鏈表附加頭結點
    first->link = NULL;
    rear = first;
    
    sP2 = P2;    //保存一下P2初始位置

    while(P2)    //先用P1的第一項乘以P2,得到一個結果多項式鏈表
    {
        Attach(P1->coef*P2->coef,P1->expon+P2->expon,&rear);
        P2 = P2->link;
    }
    P1 = P1->link;
    while (P1)    //再用P1的其它項乘以P2,將結果添加到前面的多項式鏈表中
    {
        P2 = sP2;        //恢復P2初始位置
        rear = first;    //從表頭開始掃描結果多項式鏈表
        while (P2)
        {
            c = P1->coef*P2->coef;
            e = P1->expon+P2->expon;
            while (rear->link && rear->link->expon > e)     //結果多項式鏈表中的數據項指數較大
            {
                rear = rear->link;
            }
            if(rear->link && rear->link->expon == e)    //兩數據項指數相等
            {
                if(rear->link->coef + c)    //系數和非0
                    rear->link->coef += c;
                else                        //系數和為0,需要在結果多項式鏈表中刪除次表項
                {
                    temp = rear->link;
                    rear->link = temp->link;
                    delete temp;
                }
            }
            else                                        //結果多項式鏈表中的數據項指數較小
            {
                temp = new PolyNode;
                temp->coef = c;
                temp->expon = e;
                temp->link = rear->link;        //把新表項插入到結果多項式鏈表中
                rear->link = temp;
                rear = rear->link;
                
            }
            P2 = P2->link;
        }
        P1 = P1->link;
    }
    temp = first; first = first->link; delete temp;//刪除附加頭結點
    return first;
}

void PrintPoly(Polynomial P)    //輸出多項式
{
    int flag=0;        //輸出序號,用來輔助調整輸出格式
    if(!P){ printf("0 0\n"); return;}  //當多項式鏈表為空

    while(P)
    {
        if(!flag)    flag=1;  //第一次輸出,沒有前置空格
        else   printf(" ");   //輸出前置空格
        printf("%d %d",P->coef,P->expon);
        P = P->link;
    }
    printf("\n");
     
}

 

  另外,對於一元多項式的求值問題,可以通過秦九韶算法快速求得結果,感興趣的可以看我的另一篇文章了解一下。

 


免責聲明!

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



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