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


    #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;
    }
  • 相关阅读:
    Python学习小目录汇总
    进制转换的知识
    计算机组成原理目录
    python基础知识-8-三元和一行代码(推导式)
    python基础知识-7-内存、深浅、文件操作
    IT工具使用
    Python基础知识-06-集合内存布尔False
    Python基础知识-05-数据类型总结字典
    elk收集tomcat日志
    pycharm重命名文件
  • 原文地址:https://www.cnblogs.com/daydayupacm/p/5947069.html
Copyright © 2020-2023  润新知