单链表解决一元多项式加减法

问题描述
给定两个多项式,求解其和与差。多项式的项数为M,而最高幂次为N。(1<=M<=10,1<=N<=1000000)

输入说明
输入包含了两个多项式,分为两行给出(同行数据间以空格隔开):

每一行为两组数据:第一组为一个值,表示多项式的非零项数M;第二组为2*M个值,每相邻两个值表达一个多项式的非零系数项,分别为系数值、幂次值(其中各项按照幂次的降序排列)。但如果多项式没有非零系数项,则仅用0(M的值)表示,后面没有系数和幂次值出现。例如,第一行的数据为:4 1 10 2 5 3 4 4 0,那么表示多项式有4项,对应的多项式为:x^10+2x^5+3x^4+4. 又例如,第二行的数据为:4 1 8 -2 5 3 3 4 1,表示多项式有4项,对应的多项式为:x^8-2x^5+3x^3+4x。那么上述两个多项式相加的输出结果应为:6 1 10 1 8 3 4 3 3 4 1 4 0,对应的多项式为:x^10+x^8+3x^4+3x^3+4x+4.第一个多项式减去第二个多项式的输出结果为:7 1 10 -1 8 4 5 3 4 -3 3 -4 1 4 0,对应多项式:x^10-x^8+4x^5+3x^4-3x^3-4x+4.

输出说明
输出包含了两个多项式,分为两行给出(同行数据间以空格隔开):

第一行是多项式相加的结果,第二行是多项式相减的结果。每一行为两组数据:第一组为一个值,表示多项式的非零项数M;第二组为2*M个值,每相邻两个值表达一个多项式的非零系数项,分别为系数值、幂次值(其中各项按照幂次的降序排列)。但如果多项式没有非零系数项,则仅用0(M的值)表示,后面没有系数和幂次值出现。

不知道问题在哪里 运行结果总是不正确


#include <stdio.h>
#include <stdlib.h>
typedef struct PNode{
    int coef;//系数
    int exp;//指数
    struct PNode *next; 
}pnode; 

pnode *Create(){
    int coef;
    int exp;
    pnode *head,*s,*r;
    head=NULL;
    r=NULL;
    int n;
    scanf("%d",&n);
    for(int i=1;i<=2*n;i++)
    {
        if(i%2==1){
            scanf("%d",&coef);
            s=(pnode*)malloc(sizeof(pnode));
            s->coef=coef;
        }
        else if(i%2==0){
            scanf("%d",&exp);
            s=(pnode*)malloc(sizeof(pnode));
            s->exp=exp;
        }
        if(head==NULL){
            head=s;
        }
        else
        r->next=s;
        r=s;
    }
    if(r!=NULL) r->next=NULL;
    return head;
}

pnode *add(pnode *pa,pnode *pb){
    pnode *pc,*s,*r,*q;
    int x;
    pc=NULL;
    r=NULL;
    while(pa!=NULL && pb!=NULL){
        if(pa->exp<pb->exp){
            s=(pnode*)malloc(sizeof(pnode));
            s->coef=pa->coef;
            s->exp=pa->exp;
            pa=pa->next; 
        }
        else if(pa->exp<pb->exp){
            s=(pnode*)malloc(sizeof(pnode));
            s->coef=pb->coef;
            s->exp=pb->exp;
            pb=pb->next;
        }
        else{
            x=pa->coef+pb->coef;
            if(x!=0){
                s=(pnode*)malloc(sizeof(pnode));
                s->coef=x;
                s->exp=pa->exp;
            }
            pa=pa->next;
            pb=pb->next;
        } 
        if(pc!=NULL)
        pc=s;
        else r->next=s;
        r=s;
    }
    if(pb!=NULL){
        q=pb;
    }
    else q=pa;
    while(q==NULL){
        s=(pnode*)malloc(sizeof(pnode));
        s->coef=q->coef;
        s->exp=q->exp;
        r->next=s;
        r=s;
        q=q->next;
    }
    r->next==NULL;
    return pc;
}
pnode *subtract(pnode *pa,pnode *pb){
    pnode *pc,*p,*q;
    pc=(pnode*)malloc(sizeof(pnode));
    p=pc;
    q=pb->next;
    while(q){
        p->next=(pnode*)malloc(sizeof(pnode));
        p=p->next;
        p->exp=-(q->exp);
        p->coef=q->coef;
    }
    q=q->next;
    p->next=NULL;
    add(pc,pa);
    return pc;
}
/*void count_n(pnode *head){
    int n;
    pnode *p;
    p=head;
    n++;
    p=p->next;
    while(p!=NULL){
        n++;
        p=p->next;
    }
    return n;
}*/
int PolynLength(pnode *p)
{
    int i=0;
    while(p!=NULL){
        i++;
        p=p->next;
    }
    return i;
}
int main(){
    pnode *pa,*pb,*pc1,*pc2;
    int n1,n2;
    pa=Create();
    pb=Create();
    pc1=add(pa,pb);
    pc2=subtract(pa,pb);
    //n1=count_n(pc1);
    n1=PolynLength(pc1)/2;
    printf("%d",n1);
    pnode *p1,*p2;
    //p1=*pc1;
    while(pc1!=NULL){
        printf("%d %d",pc1->coef,pc1->exp);
        pc1=pc1->next;
    }
    printf("\n");
    n2=PolynLength(pc2)/2;
    printf("%d",n2);
        //p2=*pc2;
    while(pc2!=NULL){
        printf("%d %d",pc2->coef,pc2->exp);
        pc2=pc2->next;
    }
    return 0;
}

for(int i=1;i<=2*n;i++)的处理中,为啥if...else各自都malloc分配内存啊?这肯定不对啊,if...else分别输入系数和指数,属于一个节点的内容,你各自产生一个,哪能行啊