美文网首页
多项式的加法(单向链表)

多项式的加法(单向链表)

作者: 日常表白结衣 | 来源:发表于2017-07-27 22:07 被阅读0次

    采用不带头节点的单向链表,按照指数递减的顺序排列各项

    /* 定义链表 */
    struct PolyNode{
        int coef; //系数
        int expon; //指数
        struct PolyNode *link; //指向下一个节点的指针
    };
    typedef struct PolyNode * Polynomial;
    Polynomial P1,P2;
    

    【算法思路】两个指针P1和P2分别指向这两个多项式第一个节点,不断循环:
    【1】 P1->expon==P2->expon: 系数相加,若结果不为0,则作为结果多项式对应项
    的系数。 同时, P1和P2都分别指向下一项;
    【2】P1->expon>P2->expon: 将P1的当前项存入结果多项式,并使P1指向下一项;
    【3】P1->expon<P2->expon: 将P2的当前项存入结果多项式,并使P2指向下一项;

    /* 多项式相加 */
    Polynomial PolyAdd(Polynomial P1,Polynomial P2)
    {
        Polynomial front,rear,temp;
        int sum;
        rear=(Polynomial)malloc(sizeof(struct PolyNode));
        front=rear; //由front记录结果多项式链表头节点
        while(P1&&P2) //当两个多项式都由非零项待处理时
            switch(Compare(P1->expon,P2->expon)){
                case 1:
                    Attach(P1->coef,P1->coef,&rear); //拷贝函数,结果接到rear地址的后面
                    P1=P1->link;  //P1指向下一项
                    break;
                case -1:
                    Attach(P2-coef,P1->expon,&rear);
                    P2=P2->link;
                    break;
                case 0:
                    sum = P1->coef+P2->coef;
                    if(sum)
                        Attach(sum,P1->expon,&rear); //不为0,接到rear地址后面
                    //指针依次顺延
                    P1=P1->link;
                    P2=P2->link;
                    break;
            }
            //某一个多项式已经处理完成,把另一个多项式接到rear地址后面
            for(;P1;P1=P1->link)    Attach(P1->coef,P1->expon,&rear); //P1不空则执行Attach并指针后延
            for(;P2;P2=P2->link)    Attach(P2->coef,P2->expon,&rear);
            //函数操作已完成
            rear->link=NULL;
            temp=front;
            front=front->link;   //指向结果多项式第一个非零项
            free(temp);
            return front;
    }
    
    /* 拷贝函数uAttach,即插入一个新数据(节点)
    *pRear 当前最后一个节点的指针位置 | 实际为指向指针的指针
    */
    void Attach(int c,int b,Polynomial *pRear)
    {
        Polynomial P;
        P=(Polynomial)malloc(sizeof(struct PolyNode));
        p->coef=c; //对新节点赋值
        P->expon=e;
        P->link=NULL;
        (*pRear)->link=P; //*pRear 代表的就是指针,指针指向新节点(尾节点指针)
        *pRear=P; //修改pRear值
    }
    

    相关文章

      网友评论

          本文标题:多项式的加法(单向链表)

          本文链接:https://www.haomeiwen.com/subject/cwetlxtx.html