一元多项式加法运算的实现

题目描述
编程实现一元多项式的加法运算。(要求用链表实现)

输入
第一行为一元多项式A, 以 0,0 作为输入结束;

第二行为一元多项式B, 以 0,0 作为输入结束。

输出
多项式A和多项式B的和。

样例输入
5,3 7,8 9,15 0,0
2,0 6,3 -7,8 0,0

样例输出//一般格式发不出去,不符合要求
2x0+11x3+9x^1

#include<stdio.h>
#include<malloc.h>
int flag;
typedef struct node
{
    int a;
    int b;
    struct node *next;
}Linklist;
void creat(Linklist *&L)
{
    int m,n;
    Linklist *s,*r;
    L=(Linklist *)malloc(sizeof(Linklist));
    r=L;
    while(1)
    {
        s=(Linklist *)malloc(sizeof(Linklist));
        scanf("%d,%d",&m,&n);
        if(m==0&&n==0)
            break;
        s->a=m;
        s->b=n;
        r->next=s;
        r=s;
    }
    r->next=NULL;
}

void add(Linklist *&Qa,Linklist *&Qb)
{
     
    Linklist *qa,*qb;
    qa=Qa->next;
    qb=Qb->next;
    while(1)
    {
        int m,n,sum;
        m=qa->b;
        n=qb->b;
        if(m<n)
        {
            printf("%dx^%d+",qa->a,qa->b);
            qa=qa->next;
        }
        else if(m==n)
        {
            sum=qa->a+qb->a;
            if(sum!=0)
            {
                qa->a=sum;
                printf("%dx^%d+",qa->a,qa->b);
            }
            qa=qa->next;
            qb=qb->next;
        }
        else
        {
            printf("%dx^%d+",qb->a,qb->b);
            qb=qb->next;
        }
        if(qa==NULL)
        {
            flag=1;
            break;
        }
        if(qb==NULL)
        {
            flag=2;
            break;
        }
    }
    if(flag==1)
    {
        while(qb->next!=NULL)
        {
            printf("%dx^%d+",qb->a,qb->b);
            qb=qb->next;
        }
        printf("%dx^%d",qb->a,qb->b);
    }
    if(flag==2)
    {
        while(qa->next!=NULL)
        {
        printf("%dx^%d+",qa->a,qa->b);
        qa=qa->next;
        }
        printf("%dx^%d",qa->a,qa->b);
    }
 
     
}
int main()
{
    Linklist *pa,*pb;
    creat(pa);
    creat(pb);
    add(pa,pb);
    return 0;
}

我感觉add函数里面m,n比大小是对应的关系(QA第一个数和QB第一个数比较,QA第二个数和QB第二个数比较),但是如果这样显然不符合题意,能讲一下add函数吗

假设qa开始是3x^2(x加上去为了好看),qb开始是2x^3,那么这种情况是先打印qa的,因为2比3小,也就是add里面的m<n小的情况,因为qa已经打印,因此qa=qa next,qb还没动留着下次再做比较。那如果m=n,这样就要先算前面的3+2了,即sum=qa的a+qb的a,因为m==n,所以print (sum, m或者n随便一个),这里qa和qb已经相加输出了,qa和qb都要换到下一个节点。后面m>n,同m<n一样。

这里的Add函数主要的作用是计算两个一元多项式的的和,按照我们计算一元多项式和的方法来来讲,就是把相同次数的项的系数相加,例1:
(1n^3+2n^2+3n^1)+(4n^3+5n^2+6n^1)=((1+4)n^3+(2+5)n^2+(3+6)n^1)
函数中,m和n取的值是对应一元多项式里的每一项的系数,如果像上面例1里一样,两个多项式的次数和长度是一一对应的像你说的(QA第一个数和QB第一个数比较,QA第二个数和QB第二个数比较)是可以的
是没有问题的,但是如果不对应,那计算就会出问题,例2:(2n^2+3n^1)+(4n^3+5n^2)=(4n^3+(2+5)n^2+3n^1)
或者多项式里面的项位置交换一下这个时候QA和QB里相同位置上的系数并不相同,
因此这里通过过遍历比较找到两个式子里面的相同次数项相加得到最终结果,这样,不论两个多项式的长度,次数是否相等,都可以计算得出正确结果