新建单链表,运行时出现段错误,怎么改呀?

建立一个单链表函数,在编译的时候没有错误,在运行的时候出现 段错误
在linux环境下编译的,想知道是哪里出错了呀?

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

/*定义链表结构内容*/
struct list
{
        char name[10];
        long int number;
        struct list *next;

};

/*创建链表插入函数,*/
void insert(struct list *head)
{
        int n=1;
        struct list *p1,*p2;


        p1->next = NULL;
        p1=p2=(struct list*)malloc(sizeof(struct list));
        printf("please input the %d th name :  number  : \n",n++);
        scanf("%s%ld",p1->name,&p1->number);
        /*p1指向新分配的malloc()起始地址,若新分配的p1里面有内容,p2=p1,继续新建结点;若没有=内容则结束新建结点*/
                while((p1->number)>0)
        {
                if(head ==NULL) head = p2;
                else p2->next=p1;
                p2= p1;
                p1=(struct list*)malloc(sizeof(struct list));
                printf("please input the %dth name :  number  : \n",n++);
                scanf("%s%ld",p1->name,&p1->number);
                p1->next = NULL;
        }
        free(p1);      /*释放没有内容的新结点*/
}

/*輸出链表中的内容*/
void putout(struct list *head)
{
        while(head!=NULL)
        {
                printf("name:%s\t number:%ld\n",head->name,head->number);
                head = head->next;
        }

}

int main()
{
        struct list *head;
        head=NULL;
        insert(head);
        putout(head);
        return 0;
}                                                                                                                                                                                         

定义了struct list *p1,*p2;两个指针之后,未进行初始化,而直接调用p1->next = NULL;是错误的。