单链表头插法不能正常执行遍历(结果无线循环),但尾插法可以。

问题遇到的现象和发生背景

单链表头插法无法正常遍历和执行其他方法,但是尾插法可以

问题相关代码,请勿粘贴截图
#include<iostream>
#include<stdio.h>
using namespace std;

typedef struct node{
    int data;
    struct node *next;
}LNode,*LinkList; 

//单链表的创建———头插法 way 1
//头插法其实是在头节点L和L->next之间不断添加新的数据 
LinkList CreateLinkListF(){
    //创建空表和节点变量 
    LinkList L,p;
    //数据域 
    int x;
    L=new LNode;
    if(L==NULL)
    return NULL;
    L->next=NULL;
    cout<<"请输入数据直到0结束:";
    cin>>x;
    while(x!=0){
        //申请新节点 
        p=new LNode;
        p->data=x;
        L->next=p;
        p->next=L->next;
        cin>>x;
    } 
    return L;
} 

// 单链表的创建———尾插法 way 2 
LinkList CreateLinkListR(){
    LinkList L,p,tail;
    L=new LNode;
    if(L==NULL)
    return NULL;
    L->next=NULL;
    tail=L;
    int x;
    cout<<"请输入数据直到0结束:";
    cin>>x;
    while(x!=0){
        p=new LNode;
        p->data=x;
        p->next=NULL;
        tail->next=p;
        tail=p;
        cin>>x;
    } 
    return L;
}

//求表长
int GetLength(LinkList L){
    LinkList p=L;
    //带头结点
    /*
    int j;
    while(p->next){
        p=p->next;
        j++;
    }
    return j;
     */
     //不带头结点
    int j;
    while(p){
        p=p->next;
        j++;
    }
    return j;
     
} 

//按序号查找p->next=NULL,说明p是最后一个节点 
LinkList Get_LinkList(LinkList L,int i){
    LinkList p;
    int j=0;
    p=L;
    while(p->next!=NULL&&i<j){
        p=p->next;
        j++;
    }
    if(i==j)
    return p;
    else
    return NULL;
} 
//按值查找
LinkList Search2(LinkList L,int x){
    LinkList p;
    p=L->next;
    while(p){
        if(p->data==x)
        return p;
        else
        p=p->next; 
    }
    return NULL;
} 
//前插(在指定序号前)
int InsertBefor(LinkList L,int x,int i){
    LinkList s,p;
    p=Get_LinkList(L,i-1);
    if(p==NULL){
        cout<<"参数i错误!"<<endl;
        return 0;
    }else{ 
        s=new LNode;
        if(s==NULL){
            cout<<"申请空间失败!"<<endl;
        }
        s->data=x;
        s->next=p->next;
        p->next=s;
    }
} 
//删除第i个节点 
int DeleteLinkList(LinkList L,int i){
    LinkList p,s;
    p= Get_LinkList(L,i-1);
    if(p==NULL){
        cout<<"该节点不存在!"<<endl;
        return 0;
    }else{
        s=p->next;
        p->next=s->next;
        delete s;
        return 1;
    }
}
//遍历链表
void show(LinkList L){
    LinkList p;
    p=L->next;
    int i=0;
    while(p!=NULL){
        i++;
        printf("第%d个节点数据为:%d\n",i,p->data);
        p=p->next;
    }
    return;
} 

int main(){
    cout<<"尾插法建立单链表————";
    LinkList L,p;
    L=CreateLinkListR();
    show(L);
    cout<<"按值查找————";
    cout<<"你要查找的值:";
    int x;
    cin>>x;
    p=Search2(L,x);
    cout<<p->data<<endl;

    cout<<"头插法建立单链表————";
    LinkList M;
    M=CreateLinkListF();
    show(M);
    
    return 0;
}
运行结果及报错内容

头插法遍历会导致无线循环

我想要达到的结果

怎么才能正确使用头插法遍历


LinkList CreateLinkListF()
{
    //创建空表和节点变量
    LinkList L, p;
    //数据域
    int x;
    L = new LNode;
    if (L == NULL)
        return NULL;
    L->next = NULL;
    cout << "请输入数据直到0结束:";
    cin >> x;
    while (x != 0)
    {
        //申请新节点
        p = new LNode;
        p->data = x;
        p->next = L->next; //
        L->next = p;       //
    }
    return L;
}