多项式加法乘法,OJ上结果缺了一半,vs code运行时Trace/breakpoint trap?

题目如图:

本人所写如下:

#include<stdio.h>
#include<stdlib.h>
 
typedef struct _polynode *Polynomial;
struct _polynode {
  int coef;
  int expon;
  Polynomial next;
};

Polynomial read(int n);
void attach(int co, int ex, Polynomial *PtrP);
Polynomial add(Polynomial P, Polynomial Q);
Polynomial multiply(Polynomial P, Polynomial Q);
void print(Polynomial PtrL);

int main(void){
    Polynomial p1, p2;
    int n;
    scanf("%d", &n);
    p1 = read(n);
    int m;
    scanf("%d", &m);
    p2 = read(m);
    print(multiply(p1, p2));
    print(add(p1, p2));
    
    return 0;
}

Polynomial read(int n){
    Polynomial head = NULL, tail = NULL;
    for (int i = 0; i < n; i++){
        Polynomial p = (Polynomial)malloc(sizeof(Polynomial));
        scanf("%d", &p->coef);
        scanf("%d", &p->expon);
        if (head){
            tail->next = p;
        }else{
            head = p;
        }
        tail = p;
    }
    tail->next = NULL;
    return head;
}

void attach(int co, int ex, Polynomial *PtrP){
    Polynomial P = (Polynomial)malloc(sizeof(Polynomial));
    P->coef = co;
    P->expon = ex;
    P->next = NULL;
    (*PtrP)->next = P;
    *PtrP = P;
}

Polynomial add(Polynomial P, Polynomial Q){
    Polynomial rear = (Polynomial)malloc(sizeof(Polynomial));
    Polynomial front = rear;
    while (P && Q){
        if (P->expon > Q->expon){
            attach(P->coef, P->expon, &rear);
            P = P->next;
        }else if (P->expon < Q->expon){
            attach(Q->coef, Q->expon, &rear);
            Q = Q->next;
        }else{
            int sum = P->coef + Q->coef;
            if (sum) attach(sum, P->expon, &rear);
            P = P->next;
            Q = Q->next;
        }
    }
    for (; P; P = P->next) attach(P->coef, P->expon, &rear);
    for (; Q; Q = Q->next) attach(Q->coef, Q->expon, &rear);
    rear->next = NULL;
    Polynomial temp = front;
    front = front->next;
    free(temp);
    return front;
}

Polynomial multiply(Polynomial P, Polynomial Q){
    Polynomial ret = (Polynomial)malloc(sizeof(Polynomial));
    ret->next = NULL;
    ret->coef = ret->expon = 0;
    for (; P; P = P->next){
        Polynomial cal = (Polynomial)malloc(sizeof(Polynomial));
        cal->next = NULL;
        Polynomial calhead = cal;
        for(; Q; Q = Q->next){
            attach(P->coef * Q->coef, P->expon + Q->expon, &cal);
        }
        ret = add(ret, calhead->next);
        free(calhead);
    }
    return ret;
}

void print(Polynomial PtrL){
    Polynomial p = PtrL;
    while(p->next){
        printf("%d %d", p->coef, p->expon);
        printf(" ");
        p = p->next;
    }
    printf("%d %d", p->coef, p->expon);
    printf("\n");
}

在OJ(浙大PTA)上运行结果为:

可见加法实现没有问题,而乘法似乎在外层for循环失效了,想知道原因,于是进入vscode调试,结果报错,如下:

所以想问代码错误出在哪里。

感觉是浅拷贝的问题。temp和front的地址是一样的,你free掉其中一个,另外一个也呗free。