多项式求和

#多项式求和(单向链表)

0.目标

这里写图片描述

1.解决思路

  1. 表示,用单向链表表示多项式,每一个节点中有某一项的系数、指数和下一个节点的指针,并按指数下降排列,如
    这里写图片描述
    中的这里写图片描述的系数为3,指数为5,指针指向这里写图片描述。若到了最后一项,则指针指向Null。
  2. 定义两个指针,分别指向两个多项式的的节点。首先将指针指向多项式的第一个节点,不断循环直至为空。
  3. 在2中的处理过程为(将两个节点指针注为P1和P2):
    若P1的系数大于P2的系数,则将P1存入结果,并将P1指向下一个;
    若P1的系数等于P2的系数,则将两个的系数相加,若不为0.则存入结果,并将P1,和P2分别指向下一个;
    若P1的系数小于P2的系数,则将P2存入结果,并将P2指向下一个.

附录( 程序部分 )

1)定义数据结构

typedef struct PolyNode{
    int coef;
    int expon;
    struct node *link
}*Polynomial;

2)处理过程

Polynomial P1, P2;
Polynomial PolyAdd(Polynomial P1, Polynomial P2){
    Polynomial front, rear;
    rear = (Polynomial)malloc(sizeof(PolyNode));
    front = rear;
    int coef_sum;
    while(P1 && P2){
        switch(Compare(P1->expon, P2->expon)){
            case 1:
            Attach(P1->coef, P1->expon, &rear);
            P1 = P1->link;
            break;
            case 0:
            coef_sum = P1->coef + P2->coef;
            if(coef_sum) Attach(P1->coef, P1->expon, &rear);
            P1 = P1->link;
            P2 = P2->link;
            break;
            case -1:
            Attach(P2->coef, P2->expon, &rear);
            P2 = P2->link;
            break;
        }
    }
    for(; P1; P1->link){
        Attach(P1->coef, P1->expon, &rear);
    }
    for(; P2; P2->link){
        Attach(P2->coef, P2->expon, &rear);
    }

    front = front->link;
    rear->link = Null;
    return front;   
}

其中

char Compare(int n1, int n2){
    if(n1 > n2){
        return 1;
    }else if(n1 == n2){
        return 0;
    }else{
        return -1;
    }
}
void Attach(int coef, int expon, Polynomial *Ptrl){
    Polynomial P;
    P = (Polynomial)malloc(sizeof(PolyNode));
    P->coef = coef;
    P->expon = expon;
    (*Ptrl)->link = P;
    (*Ptrl) = P;
}

学习自《数据结构:陈越》之线性结构

展开阅读全文

没有更多推荐了,返回首页