【数据结构】多项式的运算

题意理解

已知两个多项式:
(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;
        }
    }
};

posted @ 2020-02-15 22:33  Maxwell'Maxwill  阅读(1283)  评论(0编辑  收藏  举报