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

2017-07-27  本文已影响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值
}
上一篇下一篇

猜你喜欢

热点阅读