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


    #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 | if else || where true 流程控制
    python |生成器
    python| 什么是迭代器?
    Python -WordCloud安装、词云制作
    技巧 |Python 使用dict.fromkeys()快速生成一个字典
    python 列表(list)去重方法总结
    区别 |python 的read、readline、readlines和write、writelines
    区别 |Python的 open() 和with open() as
    散点图和气泡图的几种制作方法
    宽表和窄表的建设该如何选择?
  • 原文地址:https://www.cnblogs.com/daydayupacm/p/5947069.html
Copyright © 2020-2023  润新知