【數據結構】多項式的運算


題意理解

已知兩個多項式:
(1)\(3x^4-5x^2+6x-2\)
(2)\(5x^{20}-7x^4+3x\)

多項式和:
\(5x^{20}-4x^4-5x^2+9x-2\)
多項式乘積:
\((a+b)(c+d)=ac+ad+bc+bd\)

輸入樣例:

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

輸出樣例:

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

求解思路

  1. 多項式表示 //首先是明確使用的數據結構
  2. 程序框架 //對程序整體有一個規划,下面的四步就是讀入、加、乘、輸出
  3. 讀多項式
  4. 加法實現
  5. 乘法實現
  6. 多項式輸出
    理解起來也好理解呀。有明確的步驟,做起事來才不慌啊。

多項式的表示

僅表示非零項

數組:
變成簡單、調試容易;需要實現確定數組大小

鏈表:
動態性強;編程略復雜、調試比較困難

可以使用動態數組來實現 因為已經告訴了有多少項

數據結構設計

typedef struct PolyNode *Polynomial;
struct PolyNode{
    int coef;
    int expon;
    Polynomial link;
};

程序框架搭建

int main(){
    讀入多項式1
    讀入多項式2
    乘法運算並輸出
    加法運算並輸出
    return 0;
}

需要設計的函數:
讀入
相乘
相加
輸出

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 P, Rear,t;
    int c,e,N;

    scanf("%d",&N);
    P=(Polynomial)malloc(sizeof(struct PolyNode));//弄一個節點放在最前面,使得操作更具有一致性
    P->link=NULL;
    while(N--){
        scanf("%d %d",&c,&d);
        Attcah(c,e,&Rear);
    }
    t=P;p-P->link;free(t); //將多申請的節點去掉
    return P;
}

Rear初值是多少

  1. Rear初值為NULL
  2. Rear指向一個空節點(推薦,一致性比較強)
void Attach(int c,int e, Polynomial *pRear){
    Polynomial P;
    P=(Polynomial)malloc(sizeof(struct PolyNode));
    P->coef=c;
    P->expon=e;
    P->link=NULL;
    (*pRear)->link=P;
    *pRear=P;
}

Polynomial Add(Polynomial P1,Polynomial P2){
    Polynomial t1=P1,t2=P2;
    Polynomial Rear,P=(Polynomial)malloc(sizeof(struct PolyNode)),t;
    P->Next=NULL;
    Rear = P;
    
    while(t1&&t2){
        if(t1->expon==t2->expon){
            Attach(t1->coef+t2->coef, t1->expon, &Rear);
            t1=t1->Next;
            t2=t2->Next;
        }
        else if(t1->expon>t2->expon){
            Attach(t1->coef, t1->expon, &Rear);
            t1=t1->Next;
        }
        else{
            Attach(t2->coef, t2->expon, &Rear);
            t2=t2->Next;
        }
    }
    while(t1){
        Attach(t1->coef, t1->expon, &Rear);
        t1=t1->Next;
    }
    while (t2) {
        Attach(t2->coef, t2->expon, &Rear);
        t2=t2->Next;
    }
    
    t=P;P=P->Next;free(t);
    
    return P;
};
void PrintPoly(Polynomial P){
    Polynomial t=P;
    int first =1;
    while(t){
        if(first==1){
            printf("%d %d",t->coef,t->expon);
            first=0;
            t=t->Next;
        }else{
            printf(" %d %d",t->coef,t->expon);
            t=t->Next;
        }
    }
};


免責聲明!

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



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