一元多项式相加,为啥在add函数的第一个while里面出不来了

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

typedef struct lnode *list;
struct lnode{
    int zhi;
    int xi;
    list next;
};
list read(){
    int i,j,k;
    scanf("%d",&i);
    list head=(list)malloc(sizeof(struct lnode));
    list last=head;
    last->next=NULL;
    while(i--){
        scanf("%d %d",&j,&k);
    list p=(list)malloc(sizeof(struct lnode));
        p->xi=j;
        p->zhi=k;
        last->next=p;
        p->next=NULL;
        last=p;
    }
    free(head);
    return head->next;
}
    
list add(list p1,list p2){
    list t1;list t2;
    t1=p1;t2=p2;
    int sum;
    list head=(list)malloc(sizeof(struct lnode));
    list last=head;
    last->next=NULL;
    list node=(list)malloc(sizeof(struct lnode));
    while(t1!=NULL&&t2!=NULL){
        if(t1->zhi==t2->zhi){
            sum=t1->xi+t2->xi;
            }
            else if(sum!=0){
            node->xi=sum;
            node->zhi=t1->zhi;
            last->next=node;
            last=node;
            last->next=NULL;*
            }
        
        if(t1->zhi>t2->zhi){
            node->xi=t2->xi;
            node->zhi=t2->zhi;
            last->next=node;
            last=node;
            last->next=NULL;
        }else{
            node->xi=t1->xi;
            node->zhi=t1->zhi;
            last->next=node;
            last=node;
            last->next=NULL;
        }
        t1=t1->next;t2=t2->next;
    }
    while(t1){
        last->next=t1;
        t1=t1->next;
        t1->next=NULL;
        last=t1;
    }
    while(t2){
        last->next=t2;
        t2=t2->next;
        t2->next=NULL;
        last=t2;
    }
    return head->next;
}    

int main(){ 
list p1,p2;
     p1=read();
     p2=read();
    list l=add(p1,p2);
    printf("%d %d\n",l->xi,l->zhi);
    return 0; 

}


read就有问题啊,先free掉head了,怎么还return head->next呢