单链表的输入问题,输入时自动退出

单链表输入数据时自动退出程序
这是哪里出了问题


```c++
#include<iostream>
using namespace std;
#define OK 1
#define ERROR -1
#define OVERFLOW -2

typedef struct
{
    string name;
    int num;
}Book;

typedef struct LNode
{
    Book data;//节点的数据域 
    struct LNode *next;//节点的指针域 
}LNode,*LinkList;//LinkList为指向结构体LNode的指针类型 


int InitList(LinkList &L)
{
    L=new LNode;//生成新节点作头节点 
    L->next=NULL;//令头节点的指针域为空 
    cout<<"已执行"<<endl;
    return OK;
}

void input(LinkList &L)
{
    int n;
    cout<<"请输入一个整数N"<<endl;
    cin>>n;
    cout<<"请输入书籍信息"<<endl;
    LNode *p;//建立一个节点p 
    for(int i=0;i<n;i++)
    {
        cin>>p->data.name>>p->data.num;
        p=L;
        p->next=L->next;
        L->next=p;
    }
    
}
void output(LinkList L)//这不用管先
{
    int n;
    for(int i=0;i<n;i++)
    {
    //    cout<<L->next->data.name<<L->next->data.num;
    }
}
int main()
{
    LinkList L;
    InitList(L);
    input(L);
    return 0;
}

```

问题出在nput函数,就是你定义了一个指针p,但是没有为其分配内存,因此访问p的成员时会发生未定义的行为。在循环中应该先为p分配内存,比如通过new关键字:


void input(LinkList &L)
{
    int n;
    cout<<"请输入一个整数N"<<endl;
    cin>>n;
    cout<<"请输入书籍信息"<<endl;
    for(int i=0;i<n;i++)
    {
        LNode *p = new LNode;
        cin>>p->data.name>>p->data.num;
        p->next=L->next;
        L->next=p;
    }
}

循环中的两行语句的顺序应该交换,应该先将新节点p插入到链表头部,再将L指向新节点,否则会导致链表头指针丢失。

void input(LinkList &L)
{
    int n;
    cout<<"请输入一个整数N"<<endl;
    cin>>n;
    cout<<"请输入书籍信息"<<endl;
    for(int i=0;i<n;i++)
    {
        LNode *p = new LNode;
        cin>>p->data.name>>p->data.num;
        p->next=L->next;
        L->next=p;
    }
}


p没有分配空间
加上p = new LNode;


void input(LinkList &L)
{
    int n;
    cout<<"请输入一个整数N"<<endl;
    cin>>n;
    cout<<"请输入书籍信息"<<endl;
    LNode *p;//建立一个节点p 
    p = new LNode;
    for(int i=0;i<n;i++)
    {
        
        cin>>p->data.name>>p->data.num;
        cout<<"请输入书籍信息1111"<<endl;
        p=L;
        p->next=L->next;
        L->next=p;
    }
    
}