为什么查找失败时无法输出fail?

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

typedef struct linklist
{
    int data;
    struct linklist* next;
}linknode,* linkpointer;
//链表建立
linkpointer createlist()
{
    int x;
    linkpointer head,tail,p;
    head=tail=NULL;
    scanf("%d",&x);
    while(x!=0)
    {
        p=(linkpointer)malloc(sizeof(linknode));
        p->data=x;
        if(head==NULL)
        {
            head=tail=p;
        }
        else
        {
            tail->next=p;
            tail=p;
        }
        scanf("%d",&x);
    }
    if(tail!=NULL)
        {
            tail->next=NULL;
        }
    return head;
}
//查找结点
void searchlist(linkpointer head)
{
    int x;
    linkpointer p;
    p=head;
    printf("Please input the data you want to search:");
    scanf("%d",&x);
    while(p->data!=x && p!=NULL)
    {
        p=p->next;
    }
    if(p==NULL)
    {
        printf("Fail");
    }
    else
    {
        printf("%d is in the list.",x);
    }
}
int main()
{
    linkpointer head;
    printf("Please input the data of the list:\n");
    head =createlist();
    searchlist(head);
    return 0;
}

 

注意searchlist方法的while语句的逻辑,当p为NULL时,访问p->data