关于链表删除程序的修改,该如何解决

关于链表删除程序的修改
下面是我写的一个链表的删除程序,虽然编译无错,但是在运行时在建立完链表后我还没输入所要删除的数就反馈说175846is   not   been   found,然后又把新的链表打印出来。请问我错在哪里,该如何修改,望各位大大指教!
/*   Note:Your   choice   is   C   IDE   */
#include   <stdio.h>
#include   <malloc.h>

#define   NULL   0
typedef   struct   Listnode
{
int   data;
struct   Listnode   *next;
}List;

struct   Listnode   *creat(void){
struct   Listnode   *p1,*p2,*head;
head=p1=p2=(struct   Listnode*)malloc(sizeof(struct   Listnode));                                                                  
printf( "please   put   in   data: ");
scanf( "%d ",&p1-> data);
while(p1-> data!=NULL)
{
p1=(struct   Listnode*)malloc(sizeof(struct   Listnode));
printf( "please   put   in   data: ");
scanf( "%d ",&p1-> data);
p2-> next=p1;
p2=p1;
}
p2-> next=NULL;
return(head);
}


struct   Listnode   *dele(struct   Listnode   *head,int   num){
List   *p1,*p2;

if(head==NULL)
{
printf( "the   list   is   null!\n ");

}
p1=p2=head;
while(num!=p1-> data&&p1-> next!=NULL)
{
p1=p1-> next;
p2=p1;
}
while(p1-> data==num)
{
if(p1==head)
head=p1-> next;
else
p2-> next=p1-> next;
printf( "delete:%d\n ",num);
}
free(p1);

if(p1-> data!=num)
{
printf( "%ld   not   been   found!\n ",num);
}

return(head);
}


struct   Listnode   show(struct   Listnode   *h){
List   *p1;
p1=h;
do
{
printf( "data=%d ",p1-> data);
p1=p1-> next;
}
while(p1-> next!=NULL);
}



main(){
List   *p;
int   num;
p=(struct   Listnode*)malloc(sizeof(struct   Listnode));    
p=creat();
printf( "\nplease   input   the   dele   data:\n ");
scanf( "dele   data=%d ",&num);
p=dele(p,num);
show(p);

}


------解决方案--------------------
#include <stdio.h>
#include <malloc.h>

#define NULL 0
typedef struct Listnode
{
int data;
struct Listnode *next;
}List;

struct Listnode *listcreat(void){
struct Listnode *p1,*p2,*head;
head=p1=p2=(struct Listnode*)malloc(sizeof(struct Listnode));
printf( "please put in data: ");
scanf( "%d ",&p1-> data);
while(p1-> data!=NULL)
{
p1=(struct Listnode*)malloc(sizeof(struct Listnode));
printf( "please put in data: ");
scanf( "%d ",&p1-> data);
p2-> next=p1;
p2=p1;
}
p2-> next=NULL;
return(head);
}


struct Listnode *dele(struct Listnode *head,int num){
List *p1,*p2;

if(head==NULL)
{