链表实现多项式加法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表实现多项式加法相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
#include<stdlib.h>
typedef struct Polynode*Polynomial;
struct Polynode{
    int coef;
    int expon;
    Polynomial link;
};
int Compare(int e1,int e2);
void attach(int c,int e,Polynomial*reat);
Polynomial ReadPoly();
Polynomial add(Polynomial P1,Polynomial P2);
void PrintPoly(Polynomial P);
int main(){
    Polynomial P1,P2,PP;
    P1=    ReadPoly();
    P2=ReadPoly();
    PP=add(P1,P2);
    PrintPoly(PP);
    return 0;
}
int Compare(int e1,int e2){
    if(e1>e2) return 1;
    else if(e1<e2) return -1;
    else return 0;
}
void attach(int c,int e,Polynomial*reat){
    Polynomial P;
    P=(Polynomial)malloc(sizeof(struct Polynode));
    P->coef=c;
    P->expon=e;
    P->link=NULL;
    (*reat)->link=P;
    *reat=P;
}
Polynomial ReadPoly(){
    int N,c,e;
    Polynomial P,rear,t;
    P=(Polynomial)malloc(sizeof(struct Polynode));
    P->link=NULL;
    rear=P;
    scanf("%d",&N);
    while(N--){
        scanf("%d %d",&c,&e);
        attach(c,e,&rear);
    }
    t=P;P=P->link;free(t);
    return P;
}
Polynomial add(Polynomial P1,Polynomial P2){
    int sum;
    Polynomial front,rear,temp;
    front=(Polynomial)malloc(sizeof(struct Polynode));
    rear=front;
    while(P1&&P2){
        switch (Compare(P1->expon,P2->expon)){
        case 1:
            attach(P1->coef,P1->expon,&rear);
            P1=P1->link;
            break;
        case -1:
            attach(P2->coef,P2->expon,&rear);
            P2=P2->link;
            break;
        case 0:
            sum=P1->coef+P2->coef;
            attach(sum,P1->expon,&rear);
            P1=P1->link;
            P2=P2->link;
            break;
        }
    }
    for(;P1;P1=P1->link)attach(P1->coef,P1->expon,&rear);
    for(;P2;P2=P2->link)attach(P2->coef,P2->expon,&rear);
    rear->link=NULL;
    temp=front;
    front=front->link;
    free(temp);
    return front;
}
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;
    }
}

特别注意attach这个函数:

void attach(int c,int e,Polynomial*reat){
    Polynomial P;
    P=(Polynomial)malloc(sizeof(struct Polynode));
    P->coef=c;
    P->expon=e;
    P->link=NULL;
    (*reat)->link=P;
    *reat=P;
}

其中一个参数Polynomial*reat,使用的地址的地址,如果是只用Polynomial型,那么相当于只是传递进来一个地址值,函数调用完后就会释放掉形参的地址,因此链表的尾部不会变化,因此需要用Polynomial*reat类型。

以上是关于链表实现多项式加法的主要内容,如果未能解决你的问题,请参考以下文章

数据结构和算法-一元多项式运算算法(加法)

实现多项式的加法和乘法运算

单链表实现多项式的表示及运算

链表应用:一元多项式运算器。

一元多项式的加/减法运算

[PAT] 一元多项式的乘法与加法运算 C语言实现