c语言数据结构链表实现问题

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

在学习线性表的时候出现的问题

#include
#include

//定义一个结构体
typedef struct
{
    char name[50];
    int price;
}Book;
typedef struct tagLnode
{
    Book book;
    struct tagLnode *next;
}Lnode,*LinkList;


//初始化
int InitList02(Lnode *L)
{
    L = (LinkList)malloc(sizeof(LinkList));
    L->next = NULL;
    return 1;
}

//插入
LinkList ListInsert02(Lnode* L, int i)
{

    LinkList temp,p;
    int j = 1;
    Book *book = (Book*)malloc(sizeof(Book));
    InitList02(&temp); InitList02(&p);
    temp = L;

    while (temp && j < i)
    {
        temp = temp->next;
        j++;
    }
    printf("请输入价格(整数)"); scanf_s("%d", &(book->price));
    printf("\n请输入书名"); scanf_s("%s", book->name, 50);
    p->book = *book;
    p->next = temp->next;
    temp->next = p;
    printf("添加成功\n");
    return L;


}

int TraverseList02(Lnode *L,Lnode*p)
{
    p = L;
    while (p->next != NULL)
    {
        p = p->next;
        printf("|书名:%20s|", p->book.name);
        printf("价格:%3d|\n", p->book.price);
    }
    return 1;
}

int ListLength02(Lnode* L, Lnode* p)
{
    p = L;
    int i = 0;
    printf("!!!");
    while (p != NULL)
    {
        p = p->next;
        i++;
    }
    printf("现在的链表长度为%2d\n", i);
    return 1;
}


int main()
{
    //初始化
    LinkList L, p;
    InitList02(&L); InitList02(&p);
    //注意了,L是头结点,p是插入节点,temp是其他指针

    int index;
    int x;
    while (1)
    {
        printf("*****************************************\n");
        printf("你现在可以进行很多操作,通过按键实现\n");
        printf("第一:你可以添加元素,输入1\n");
        printf("第二:你可以遍历链表,输入2\n");
        printf("第三,你可以求长度,输入3\n");

        printf("最后,如果你想退出去,可以输入0\n");
        printf("*****************************************\n");
        printf("想好了?请输入你想要的值"); scanf_s("%d", &x);

        if (x == 1)
        {
            printf("添加元素的规则,你需要输入你想添加的内容和添加的位置\n");
            //ListLength02(&L, &p);
            printf("现在你想添加在哪个位置?"); scanf_s("%d", &x);
            L = ListInsert02(&L, x);
            x = -1;
        }
        if (x == 2)
        {
            TraverseList02(&L, &p);
        }

        if (x == 3)
        {
            ListLength02(&L, &p);
        }

        if (x == 0) return 0;
    }
    return 1;
}

运行结果及报错内容

img

我的解答思路和尝试过的方法

尝试了很多方法,我还是不知道怎么处理这个问题,希望大家能给我说一下,链表到底怎么添加啊

我想要达到的结果

我需要解决这个问题

有头插法 和尾插法 你写代码逻辑混乱的时候不妨画几张图来辅助

你可以看下我博客中的单链表的实现,也可以看下带哨兵位循环双链表的实现。