C++单链表 内存溢出问题请问如何解决

我申请单链表的一段空间,但是给了警报

img

我想请问一下有什么问题吗?附上整个代码

#include <iostream>
using namespace std;
#include <string>
#define OK 1
#define ERROR 0

typedef int ElemType;
typedef struct Node{
    ElemType data;
    struct Node *next;
    int Length = 0;
}Node;
typedef struct Node *LinkList;

//void InitList(LinkList *L){  //初始化 表长设为0
//    LinkList p;
//    p->Length = 0;
//}

int LengList(LinkList *L){
    LinkList p;
    return p->Length;
}

int GetElem(LinkList L , int i, ElemType *e){   //读取单链表中第i个值
    int j;
    LinkList p;     //声明一节点p
    p = L -> next;  //让p指向L的第一个节点
    j = 1;          //j为计数器
    while (p && j < i){     //p不为空 或者计数器j还没有等于i时,循环继续
        p = p ->next;       //让p指向下一个节点
        ++j;
    }
    if(!p || j > i){        //如果p为空,或者j大于i时,循环结束
        return ERROR;           //i元素不存在
    }
    *e = p->data;           //取第i个元素的数据

    return OK;
}

int ListInsert(LinkList *L , int i , ElemType e){   //在L中第i个位置之前插入新的数据元素e ,L的长度加1
    int j;
    LinkList p , s;
    p = *L;
    j = 1;
    while (p && j < i){     //寻找第i个节点
        p = p -> next;
        ++j;
        p->Length++;
    }
    if(!p || j > i){
        return ERROR;   //第i个元素不存在
    }
    s = (LinkList) malloc(sizeof(Node));        //生成新节点
    s->data = e;        //将e的数据加入s中
    s->next = p -> next;        //将p的后继赋值给s的后继
    p->next = s;            //将s赋值给p的后继
}

int DaleteList(LinkList *L , int i , ElemType *e){      //删除第i个元素,L的长度减1
    int j;
    LinkList p , q;
    p = *L;
    j = 1;
    while(p && j < i){      //寻找第i个节点
        p = p->next;
        ++j;
    }
    if(!p || j > i){
        return ERROR;       //第i个元素不存在
    }
    q = p->next;        //将p的后继赋值给q
    p ->next = p->next->next;   //将q的后继赋值给p的后继,相当于p->next->next
    *e = q->data;           //将d的data赋值给e
    free(q);                //释放节点q

    return OK;
}

void CreateList(int n ,LinkList *L) {    //尾插法创建链表
    LinkList p , r;         //r为节点最终的指针,p为接收的节点
    int i ;
    srand(time(0));
    *L= (LinkList) malloc(sizeof(int));//为整个链表
    (*L)->next = NULL;
    r= *L;          //r为指向尾部的节点
    for(i = 0 ; i < n; i++ ){
        cin >> i;       //输入数值
        p = (Node*) malloc(sizeof(Node));   //生成新节点
        p -> data = i;      //将数值赋值入p
        r->next = p;        //将表尾终端节点的指针指向新节点
        r = p;//将当前的新节点定义为表尾终端节点
        p->Length++;
    }
    delete L;
    r -> next = NULL;       //表示当前链表结束

}




void show(LinkList *L){         //打印整个链表
    LinkList p ;
    for(int i = 0;i < LengList(L);i++){
        cout << p-> next->data << endl;
    }
}


int ClearList(LinkList *L){     //将L重置为空表
    LinkList p , q;
    p = (*L)->next;     //*p指向第一个节点
    while (p){          //没到表尾
        q = p-> next;
        free(p);
        p = q;
    }
    (*L)->next = NULL;      //头指针指针域为空
    return OK;
}

int main(){
    LinkList* L;
    int n;
//    InitList(L);
    //cout << "链表已建立" << endl;
    cout << "请输入内容" << endl;
    cin >> n;
    CreateList(n,L);
    cout << "链表已建立" << endl;
    show(L);
    delete L;

}



修改了一下CreateList函数和show函数,加入了几个头文件,然后发现问题好像是LinkList好像是值传递,不是指针传递,稍微修改了一下,供参考:


#include <iostream>
using namespace std;
#include <string>
#include <stdlib.h> 
#include <time.h> 
#define OK 1
#define ERROR 0
 
typedef int ElemType;
typedef struct Node{
    ElemType data;
    struct Node *next;
    int Length = 0;
};
typedef struct Node  LinkList;
 
//void InitList(LinkList *L){  //初始化 表长设为0
//    LinkList p;
//    p->Length = 0;
//}
 
int LengList(LinkList *L){
    LinkList * p=L;
    return p->Length;
}
 
int GetElem(LinkList * L , int i, ElemType *e){   //读取单链表中第i个值
    int j;
    LinkList * p;     //声明一节点p
    p = L -> next;  //让p指向L的第一个节点
    j = 1;          //j为计数器
    while (p && j < i){     //p不为空 或者计数器j还没有等于i时,循环继续
        p = p ->next;       //让p指向下一个节点
        ++j;
    }
    if(!p || j > i){        //如果p为空,或者j大于i时,循环结束
        return ERROR;           //i元素不存在
    }
    *e = p->data;           //取第i个元素的数据
 
    return OK;
}
 
int ListInsert(LinkList *L , int i , ElemType e){   //在L中第i个位置之前插入新的数据元素e ,L的长度加1
    int j;
    LinkList *p ,* s;
    p = L;
    j = 1;
    while (p && j < i){     //寻找第i个节点
        p = p -> next;
        ++j;
        p->Length++;
    }
    if(!p || j > i){
        return ERROR;   //第i个元素不存在
    }
    s = (LinkList *) malloc(sizeof(Node));        //生成新节点
    s->data = e;        //将e的数据加入s中
    s->next = p -> next;        //将p的后继赋值给s的后继
    p->next = s;            //将s赋值给p的后继
}
 
int DaleteList(LinkList *L , int i , ElemType *e){      //删除第i个元素,L的长度减1
    int j;
    LinkList *p ,  *q;
    p = L;
    j = 1;
    while(p && j < i){      //寻找第i个节点
        p = p->next;
        ++j;
    }
    if(!p || j > i){
        return ERROR;       //第i个元素不存在
    }
    q = p->next;        //将p的后继赋值给q
    p ->next = p->next->next;   //将q的后继赋值给p的后继,相当于p->next->next
    *e = q->data;           //将d的data赋值给e
    free(q);                //释放节点q
 
    return OK;
}
 
LinkList  * CreateList(int n ,LinkList  *L) {    //尾插法创建链表
    LinkList *p , *r;         //r为节点最终的指针,p为接收的节点
    int i,k ;
    srand(time(0));
    L= (Node * ) malloc(sizeof(Node));//为整个链表
    (L)->next = NULL;
    //cout<<"L="<<L<<endl;
  
    r= L;          //r为指向尾部的节点
    for(i = 0 ; i < n; i++ ){
        cin >> k;       //输入数值
        p = (Node*) malloc(sizeof(Node));   //生成新节点
        p -> data = k;      //将数值赋值入p
        //cout<<"p->data="<<p->data<<",p="<<p<<endl;
        r->next = p;        //将表尾终端节点的指针指向新节点
        r = p;//将当前的新节点定义为表尾终端节点
        p->Length++;
       // cout<<p<<","<<p->data<<endl;
    }
  //  delete L;
    r -> next = NULL;       //表示当前链表结束
     
     return L;
}
 
 
 
 
void show(LinkList * L){         //打印整个链表
//    cout<<"L="<<L<<",L->data="<<L->data<<endl;
//    cout<<"1"<<endl;
    LinkList * p =L->next;
  //  cout<<"2"<<endl;
   // for(int i = 0;i < LengList(L);i++){
        while(p!=NULL){
            cout<<"打印节点"<<endl;
            cout << p->data << endl;
            p=p->next;
        }
   // }
}
 
 
int ClearList(LinkList *L){     //将L重置为空表
    LinkList * p ,* q;
    p = (L)->next;     //*p指向第一个节点
    while (p){          //没到表尾
        q = p-> next;
        free(p);
        p = q;
    }
    (L)->next = NULL;      //头指针指针域为空
    return OK;
}
 
int main(){
    LinkList * L;
    int n;
  //  InitList(L);
//    cout << "链表已建立" << endl;
    cout << "请输入内容" << endl;
    cin >> n;
    L=CreateList(n,L);
    cout << "链表已建立" << endl;
  //  cout<<L;
    show(L);
 //   delete L;
 

 
}