链表实现一元多项式相加

C++链表实现一元多项式相加代码如下:
(输入多项式按次数从高到低排列)

#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
    struct node{
        int coe;
        int order;
        struct node *link;
    };//定义节点类型,coe表示x前的系数,order表示x的次数

    int coe,order;
    int i;

    int nodeNumA;//多项式A的项数
    printf("请输入多项式A的项数:\n");
    scanf("%d",&nodeNumA);

    printf("请输入多项式A:\n");
    struct node *headA=0,*pA=0,*qA=0;
    scanf("%d %d",&coe,&order);
    headA=new struct node;
    headA->coe=coe;
    headA->order=order;
    headA->link=0;
    qA=headA;
    for(i=1;i<nodeNumA;i++){
        scanf("%d %d",&coe,&order);
        pA=new struct node;
        pA->coe=coe;
        pA->order=order;
        pA->link=0;
        qA->link=pA;
        qA=qA->link;
    }//扫入A

    printf("\n您输入的多项式A为:\n");
    printf("%dx^%d",headA->coe,headA->order);
    pA=headA->link;
    while(pA!=0){
        printf("+%dx^%d",pA->coe,pA->order);
        pA=pA->link;
    }//输出所输入的多项式A
    printf("\n\n");

    int nodeNumB;//多项式B的项数
    printf("请输入多项式B的项数:\n");
    scanf("%d",&nodeNumB);

    printf("请输入多项式B:\n");
    struct node *headB=0,*pB=0,*qB=0;
    scanf("%d %d",&coe,&order);
    headB=new struct node;
    headB->coe=coe;
    headB->order=order;
    headB->link=0;
    qB=headB;
    for(i=1;i<nodeNumB;i++){
        scanf("%d %d",&coe,&order);
        pB=new struct node;
        pB->coe=coe;
        pB->order=order;
        pB->link=0;
        qB->link=pB;
        qB=qB->link;
    }//扫入B

    printf("\n您输入的多项式B为:\n");
    printf("%dx^%d",headB->coe,headB->order);
    pB=headB->link;
    while(pB!=0){
        printf("+%dx^%d",pB->coe,pB->order);
        pB=pB->link;
    }//输出所输入的多项式B
    printf("\n\n");
    
    struct node *p=0,*q=0;
    p=headA;
    q=headB;
    struct node *headC=0,*r=0,*s=0;
    headC=new struct node;
    while(p->order==q->order&&p->coe+q->coe==0){
        p=p->link;
        q=q->link;
    }//当多项式A、B最高项次数相同且系数和为0直接舍去
    if(p->order==q->order){
        headC->coe=p->coe+q->coe;
        headC->order=p->order;
        headC->link=0;
        s=headC;
        p=p->link;
        q=q->link;
    }
    else if(p->order>q->order){
        headC->coe=p->coe;
        headC->order=p->order;
        headC->link=0;
        s=headC;
        p=p->link;
    }
    else{
        headC->coe=q->coe;
        headC->order=q->order;
        headC->link=0;
        s=headC;
        q=q->link;
    }//此处生成输出的头结点
    while(p!=0&&q!=0){
        r=new struct node;
        while(p->order==q->order&&p->coe+q->coe==0){
            p=p->link;
            q=q->link;
        }//当多项式A、B未扫入C剩下的最高项次数相同且系数和为0直接舍去
        if(p->order==q->order){
            r->coe=p->coe+q->coe;
            r->order=p->order;
            r->link=0;
            s->link=r;
            s=s->link;
            p=p->link;
            q=q->link;
        }
        else if(p->order>q->order){
            r->coe=p->coe;
            r->order=p->order;
            r->link=0;
            s->link=r;
            s=s->link;
            p=p->link;
        }
        else{
            r->coe=q->coe;
            r->order=q->order;
            r->link=0;
            s->link=r;
            s=s->link;
            q=q->link;
        }
    }
    if(p==0&&q!=0)
        s->link=q;
    else if(p!=0&&q==0)
        s->link=p;

    printf("\n相加结果为:\n");
    printf("%dx^%d",headC->coe,headC->order);
    r=headC->link;
    while(r!=0){
        printf("+%dx^%d",r->coe,r->order);
        r=r->link;
    }
    printf("\n");

    while(headA!=0){
        p=headA;
        headA=headA->link;
        delete p;
    }
    while(headB!=0){
        q=headB;
        headB=headB->link;
        delete q;
    }
    while(headC!=0){
        r=headC;
        headC=headC->link;
        delete r;
    }//释放节点空间

    return 0;
}

在这里插入图片描述


版权声明:本文为qq_51500472原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。