【用鏈表實現一元多項式的加法和乘法運算】


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
//這里看不明白的話可以看看c語言中typedef的用法:https://blog.csdn.net/theonegis/article/details/40049667
typedef struct PNode
{
    int coef;     //系數
    int expn;       //指數
    struct PNode *next;
}PNode, *Polynomial;
void Attach(int c, int e, Polynomial *Rear)     //將新節點插入到鏈表的尾部
{
    Polynomial P = (Polynomial)malloc(sizeof(PNode));
    P->coef = c;
    P->expn = e;
    P->next = NULL;
    (*Rear)->next = P;
    *Rear = P;
}
Polynomial Read()
{
    Polynomial L = (Polynomial)malloc(sizeof(PNode));
    L->next = NULL;
    int n;
    scanf("%d", &n);
    Polynomial rear = L;
    while(n--)
    {
        int a, b;
        scanf("%d %d", &a, &b);
        Attach(a, b, &rear);     
    }
    Polynomial t = L;
    L = L->next;
    free(t);        //刪除臨時生成的頭節點
    return L;
}
Polynomial Add(Polynomial P1, Polynomial P2)            //兩個多項式的加法
{
    Polynomial t1 = P1, t2 = P2;
    Polynomial P = (Polynomial)malloc(sizeof(PNode));          //注意malloc出的內存只能用free刪除,不能用別的
    P->next = NULL;
    Polynomial rear = P;
    while(t1 && t2)
    {
        if(t1->expn == t2->expn)
        {
            int sum = t1->coef + t2->coef;
            int expn = t1->expn;
            if(sum)     //若和不為0,直接將它插入到新鏈表的末端
                Attach(sum, expn, &rear);           
            t1 = t1->next;
            t2 = t2->next;
        }
        else if(t1->expn < t2->expn)        //若指數不相等,則插入指數較大的
        {
            int coef = t2->coef, expn = t2->expn;
            Attach(coef, expn, &rear);
            t2 = t2->next;
        }
        else if(t1->expn > t2->expn)
        {
            int coef = t1->coef, expn = t1->expn;
            Attach(coef, expn, &rear);
            t1 = t1->next;
        }
    }
    while(t1)       //若有剩余的,依次插入即可
    {
        Attach(t1->coef, t1->expn, &rear);
        t1 = t1->next;
    }
    while(t2)
    {
        Attach(t2->coef, t2->expn, &rear);
        t2 = t2->next;
    }
    t2 = P;
    P = P->next;
    free(t2);   //釋放頭節點
    return P;
}
Polynomial Mul(Polynomial p1, Polynomial p2)
{ 
    if(!p1 || !p2) return NULL;
    Polynomial t1 = p1, t2 = p2;
    Polynomial P = (Polynomial)malloc(sizeof(PNode));
    P->next = NULL;
    Polynomial rear = P;
    while(t2)       //先用p1的第一項乘以p2的每一項,得到P
    {
        Attach(t1->coef * t2->coef, t1->expn + t2->expn, &rear);
        t2 = t2->next;
    }
    t1 = t1->next;      //得到p1的下一項,根據前面得到的P,對兩個多項式逐項相乘(前面算過的就不用再算了),將它們插入到合適的位置
    while(t1)
    {
        t2 = p2, rear = P;      //另一個多項式從初始位置開始
        while(t2)
        {
            int e = t1->expn + t2->expn, c = t1->coef * t2->coef;       //兩項的*運算
            while(rear->next && rear->next->expn > e)       //找到下一項的指數小於或等於e的
                rear = rear->next;
            if(rear->next && rear->next->expn == e)     //如果找到指數相同的
            {
                if(rear->next->coef + c !=  0)      //系數不為0則加起來
                    rear->next->coef += c;
                else        //系數為零了就把這個系數為零的項刪除
                {
                    Polynomial t = rear->next;
                    rear->next = t->next;
                    free(t);
                }
            }
            else //小於e,則把新項插入到它之后,沒理解就慢慢想,畫圖
            {
                Polynomial t = (Polynomial)malloc(sizeof(PNode));
                t->coef = c;
                t->expn = e;
                t->next = rear->next;
                rear->next = t;
                rear = rear->next;
            }
            t2 = t2->next;      //下一項
        }
        t1 = t1->next;      //下一項
    }
    t2 = P;
    P = P->next;
    free(t2);
    return P;
}
void Print(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->expn);
        P = P->next;
    }
    printf("\n");
}
int main()
{
    // freopen("input.txt", "r", stdin);
    // freopen("output.txt", "w", stdout);
    Polynomial L1, L2;
    L1 = Read();
    L2 = Read();
    Polynomial sum = Add(L1, L2);
    Polynomial mul = Mul(L1, L2);
    Print(mul);
    Print(sum);
}


免責聲明!

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



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