欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

多项式加法的实现

程序员文章站 2022-07-03 18:26:34
...

多项式加法的实现

//采用不带头结点的单向链表,按照指数递减的顺序排列各项
//思路:俩个指针P1P2分别指向这两个多项式的第一个结点,不断循环
#include<stdio.h>
#include<stdlib.h>

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

int Compare(int a, int b) {
    if (a > b)
        return 1;
    else if (a < b)
        return -1;
    else
        return 0;
}

void Attach(int c, int e, Polynomial *pRear) {//三个参数传进来系数和指数,告诉当前最后一个结点的指针的位置,传进来Polynomial这个类型的指针,
                                              //但是注意Polynomial本身也是指针,所以pRear是指针的指针,函数操作的自传递
    Polynomial P;
    P = (Polynomial)malloc(sizeof(struct PolyNode));
    P->coef = c;
    P->expon = e;
    P->link = NULL;
    (*pRear)->link = P;//把新生成的结点P插到Rear后边
    *pRear = P;
}

Polynomial PolyAdd(Polynomial P1, Polynomial P2) {
    Polynomial front, rear, temp;//记住结果多项式的头和尾
    int sum;
    rear = (Polynomial)malloc(sizeof(struct PolyNode));//构造临时空结点作为结果多项式的表头,返回时要释放
    front = rear;
    while (P1&&P2) {//当P1、P2都不空
        switch (Compare(P1->expon, P2->expon)) {//比较P1P2指向指数的大小,Compare函数比较,第一个值大返回1,第二个值大返回-1,相等返回0
        case1://P1当前指向的指数大
            Attach(P1->coef, P1->expon, &rear);//Attach拷贝过程,第一第二个参数代表分别要拷贝的系数和指数,把系数和指数形成的新的项拷贝到rear后边,然后P1往后挪
            P1 = P1->link;
            break;
        case -1://P2当前指向的指数大
            Attach(P2->coef, P2->expon, &rear);
            P2 = P2->link;
            break;
        case 0://两个指数相等只需把系数相加
            sum = P1->coef + P2->coef;
            if (sum)//如果系数为0则不用加入到结果多项式中
                Attach(sum, P1->expon, &rear);//sum不为0则把sum作为系数放到结果多项式中,P1P2都往后挪
            P1 = P1->link;
            P2 = P2->link;
            break;
        }
        //当循环退出的时候就说明P1P2中至少有一个为空
        for (; P1; P1 = P1->link)//如果P1不空则P2空,就把P1后边的每一项都接到结果多项式的后边,同时把P1往后挪
            Attach(P1->coef, P1->expon, &rear);
        for (; P2; P2->link)
            Attach(P2->coef, P2->expon, &rear);
        //两个for做完则说明两多项式相加基本完成
        rear->link = NULL;//加完之后rear后边没有了设为NULL
        temp = front;//front原来指向临时的表头结点,要把临时的表头结点释放掉释放掉,他的下一项就是就是真正的多项式的第一项,所以把它的值赋给temp,它本身往后挪最后返回他
        front = front->link;
        free(temp);
        return front;
    }
}

多项式加法的实现
多项式加法的实现

相关标签: 链表