线性结构 一元多项式的乘法与加法运算

#include <stdio.h>
#include <stdlib.h>

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


void PrintPoly(Polynomial P)
{
    int flag = 0;
    if(!P)
    {
        printf("0 0
");
        return ;
    }

    while(P)
    {
        if(!flag) flag=1;
        else printf(" ");

        printf("%d %d", P->coef, P->expon);
        P=P->link;
    }
    printf("
");
}

void Attach(int c, int e, Polynomial *Rear)
{
    Polynomial P;

    P=(Polynomial)malloc(sizeof(Polynode));
    P->coef = c;
    P->expon = e;
    P->link = NULL;
    (*Rear)->link = P;
    *Rear = P;
}

Polynomial Mult(Polynomial P1, Polynomial P2)
{
    Polynomial P, Rear, t1, t2, t;
    int c, e;

    if(!P1 || !P2) return 0;

    t1 = P1;
    t2 = P2;

    P=(Polynomial)malloc(sizeof(Polynode));
    P->link = NULL;
    Rear = P;


    while(t2)
    {
        Attach((t1->coef)*(t2->coef), t1->expon+t2->expon, &Rear);
        t2=t2->link;
    }

    t1 = t1->link;
    while(t1)
    {
        t2 = P2;
        Rear = P;

        while(t2)
        {
            e = t1->expon+t2->expon;
            c = t1->coef*t2->coef;
            while(Rear->link && Rear->link->expon>e)
                Rear = Rear->link;
            if(Rear->link && Rear->link->expon == e)
            {
                if(Rear->link->coef+c)
                {
                    Rear->link->coef += c;
                }
                else
                {
                    t = Rear->link;
                    Rear->link = t->link;
                    free(t);
                }
            }
            else
            {
                t = (Polynomial)malloc(sizeof(Polynode));
                t->coef = c;
                t->expon = e;
                t->link = Rear->link;
                Rear->link = t;
                Rear = Rear->link;
            }
            t2 = t2->link;
        }
        t1 = t1->link;
    }

    t2 = P;
    P = P->link;
    free(t2);

    return P;
}

Polynomial ADD(Polynomial P1, Polynomial P2)
{
    Polynomial t1, t2, P, t, Rear;

    t1 = P1;
    t2 = P2;

    P=(Polynomial)malloc(sizeof(Polynode));
    P->link = NULL;
    Rear = P;

    while(t1 && t2)
    {
        if(t1->expon == t2->expon)
        {
            if(t1->coef+t2->coef)
            {
                t = (Polynomial)malloc(sizeof(Polynode));
                t->coef=t1->coef+t2->coef;
                t->expon = t1->expon;
                t->link = Rear->link;
                Rear->link = t;
                Rear = Rear->link;
            }
            t1 = t1->link;
            t2 = t2->link;
        }
        else if(t1->expon > t2->expon)
        {
            t = (Polynomial)malloc(sizeof(Polynode));
            t->coef=t1->coef;
            t->expon = t1->expon;
            t->link = Rear->link;
            Rear->link = t;
            Rear = Rear->link;
            t1 = t1->link;
        }
        else
        {
            t = (Polynomial)malloc(sizeof(Polynode));
            t->coef=t2->coef;
            t->expon = t2->expon;
            t->link = Rear->link;
            Rear->link = t;
            Rear = Rear->link;
            t2 = t2->link;
        }
    }

    Rear->link = t1?t1:t2;

    t = P;
    P = P->link;
    free(t);

    return P;
}

Polynomial ReadPoly()
{
    int n, c, e;
    Polynomial Rear, P, t;

    P=(Polynomial)malloc(sizeof(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;
}

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;
}
原文地址:https://www.cnblogs.com/daydayupacm/p/5947069.html