数据结构题目笔记-05-链表实现两个多项式的相加 C语言

344 阅读2分钟

两个多项式的合并

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

算法思路:两个指针P1,P2分别指向两个多项式的第一个结点,然后不断地进行循环。

情况一:P1->指数等于P2->指数:系数相加。1.系数相加不等于0,,则将结果作为结果多项式对应指数项系数。同时P1,P2分别指向各式的下一项。

情况二:P1->指数大于P2->指数:将P1当前项存入结果多项式,并使P1指向下一项。

情况三:P1->指数小于P2->指数:将P2当前项存入结果多项式,并使P2指向下一项。

最后,当其中某一个多项式处理完时,将另一个多项式的所有结点按顺序复制到结果多项式中。

Untitled picture.png

代码实现

定义多项式结点

typedef struct PolyNode *Polynomial;

struct PolyNode{
    int coef;//系数
    int expon;//指数
    Polynomial next;//指向下一个结点
};

初始化一个链表

Polynomial Create(){
    Polynomial P= (Polynomial)malloc(sizeof (struct PolyNode));
    P->next=NULL;
    return P;
}

将两个多项式链表相加

Polynomial PolyAdd(Polynomial P1,Polynomial P2){
    Polynomial front,rear,temp;
    int sum;
    rear=(Polynomial) malloc(sizeof (struct PolyNode));
    front=rear;//在这里我定义了一个新的头指针和尾指针用于存放多项式合并之后的链表
    while (P1 && P2){
        switch (Compare(P1->expon,P2->expon)) {
            case 1:
                Attach(P1->coef,P1->expon,&rear);
                P1=P1->next;
                break;
            case -1:
                Attach(P2->coef,P2->expon,&rear);
                P2=P2->next;
                break;
            case 0:
                sum=P1->coef+P2->coef;
                if(sum)Attach(sum,P1->expon,&rear);
                P1=P1->next;
                P2=P2->next;
                break;
        }
    }
    for(;P1;P1=P1->next)Attach(P1->coef,P1->expon,&rear);
    for(;P2;P2=P2->next)Attach(P2->coef,P2->expon,&rear);
    rear->next=NULL;//所有的都结束了,去掉没有使用的空节点
    temp=front;
    front=front->next;
    free(temp);
    return front;
}

添加项到结果多项式

void Attach(int coef,int expon,Polynomial *pRear){//指针的指针

    Polynomial P;
    P= (Polynomial)malloc(sizeof (struct PolyNode));
    P->coef=coef;
    P->expon=expon;
    P->next=NULL;
    //将P指向的新结点插入到当前结果表达式尾项的后面
    (*pRear)->next=P;//这里传入的是指针的地址,所以(*pRear)指的是上面rear开辟的结点
    *pRear=P;//再将尾部指针指向P作为尾部结点
}

辅助函数

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

多项式的读入,这里有两种方式:

第一种:利用两式相加中用到的Attach函数

Polynomial ReadP(){
    Polynomial P,Rear,t;
    int coef,expoen,N;
    scanf("%d",&N);
    P=(Polynomial) malloc(sizeof (struct PolyNode));
    P->next=NULL;
    Rear=P;
    while (N--){
        scanf("%d %d",&coef,&expoen);
        Attach(coef,expoen,&Rear);
    }
    t=P;
    P=P->next;
    free(t);
    return P;
}

第二种:更容易理解

void AddP(Polynomial* P,int coef,int expon){
    Polynomial Cell;
    Cell=(Polynomial) malloc(sizeof (struct PolyNode));
    Cell->coef=coef;
    Cell->expon=expon;
    Cell->next=NULL;//创建一个新的结点
    (*P)->next=Cell;
    (*P)=(*P)->next;
}

PS:void AddP(Polynomial* P,int coef,int expon)这里拿出来单独讲解一下。这里第一个参数Polynomial* P必须传入指针。在主函数中,例如:

Polynomial P1,P2;
P1= Create();
AddP(&P1,3,5);

那么这里传入的相当于是指针的指针。这个时候的(*P)表示的是P1。