内存超限pat 一元多项式的乘法与加法运算

pat上显示内存超限 有部分答案正确 在vc++2010上编译通过 但不能正确输出
求大佬指出错误

#include<stdio.h>
#include<stdlib.h>

typedef struct PolyNode* polynomial;
struct PolyNode{
    int coef;
    int expon;
    polynomial next;
};

void attach(int c,int e,polynomial* prear)
{
    polynomial p;
    p=(polynomial)malloc(sizeof(struct PolyNode));
    p->coef=c;
p->expon=e;
p->next=NULL;
    (*prear)->next=p;
    *prear=p;
}

polynomial readpoly()
{
    polynomial p,rear,t;
    int c,e,n;

    scanf("%d",&n);
    p=(polynomial)malloc(sizeof(struct PolyNode));
    p->next=NULL;
    rear=p;

    while(n--){
        scanf("%d %d",&c,&e);
        attach(c,e,&rear);
    }
    t=p;p=p->next;free(t);
    return p;
}

polynomial multipoly(polynomial p1,polynomial p2)
{
    polynomial p,rear,t1,t2,t;
    int c,e;
    if(!p1||!p2) return NULL;
    t1=p1;t2=p2;

    p=(polynomial)malloc(sizeof(struct PolyNode));
    p->next=NULL;
    rear=p;

    while(t2){
        attach(t1->coef*t2->coef,t1->expon+t2->expon,&rear);
        t2=t2->next;
    }
    t1=t1->next;

    while(t1){
        t2=p;rear=p;
        while(t2){
            c=t1->coef*t2->coef;
            e=t1->expon+t2->expon;
            while(rear->next&&rear->next->expon>e) rear=rear->next;
            if(rear->next&&rear->next->expon==e){
                if(rear->next->coef+c){
                rear->next->coef+=c;
                }
                else{
                    t=rear->next;
                    rear->next=t->next;
                    free(t);
                }
            }
            else{
                t=(polynomial)malloc(sizeof(struct PolyNode));
                t->coef=c;
                t->expon=e;
                t->next=rear->next;
                rear->next=t;
                rear=rear->next;
            }
            t2=t2->next;
        }
        t1=t1->next;
    }
    t=p;p=p->next;free(t);
    return p;

}

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

polynomial addpoly(polynomial P1,polynomial P2) {
    polynomial P, Rear, t1, t2, t;
    int c, e;
    if (!P1 && !P2) return NULL; 
    t1 = P1; 
    t2 = P2;
    P = (polynomial)malloc(sizeof(struct PolyNode)); P->next = NULL;
    Rear = P;

    while (t1 !=NULL && t2 != NULL) {

        if (t1->expon < t2->expon)
        {
            Rear->next = t2;
            t2 = t2->next;
            Rear = Rear->next;
        }
        else if (t2->expon < t1->expon) {
            Rear->next = t1;
            t1 = t1->next;
            Rear = Rear->next;
        }
        else 
        {
            t2->coef += t1->coef;
            if (t2->coef != 0) 
            {
                Rear->next = t2;
                t2 = t2->next;
                Rear = Rear->next;
            }
            else {
                t = t2;
                t2 = t2->next;
                free(t);
            }
            t = t1;
            t1 = t1->next;
            free(t); 
        }

    }

    if (t1 == NULL) {
        Rear->next = t2;
    }
    else if(t2 == NULL){
        Rear->next = t1;
    }

    t2 = P; P = P->next; free(t2);
    return P;

}


void printpoly(polynomial p)
{
    int flag=0;
    if(!p){
        printf("0 0\n");
        return; 
    }

    while(p){
        if(!flag) flag=1;
        else printf(" ");
        printf("%d %d",p->coef,p->expon);
        p=p->next;
    }
    printf("\n");
}

int main()
    {
      polynomial p1,p2,pp,ps; 
        p1=readpoly();
        p2=readpoly();
        pp=multipoly(p1,p2);
        printpoly(pp);
        ps=addpoly(p1,p2);
        printpoly(ps);
        return 0;
    }