EUGOUALICE 2022-03-24 23:08 采纳率: 100%
浏览 91
已结题

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;

}



  • 写回答

1条回答 默认 最新

  • a5156520 2022-03-25 12:51
    关注

    修改了一下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;
     
    
     
    }
     
     
     
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月2日
  • 已采纳回答 3月25日
  • 创建了问题 3月24日

悬赏问题

  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上