C ++链接列表简单程序崩溃

时间:2017-06-18 22:56:12

标签: c++ linked-list append singly-linked-list

我创建了一个只有插入节点功能和打印功能的链接列表,但它不起作用。

#ifndef LIST_H_
#define LIST_H_
#include <iostream>
using namespace std;

struct Node{
    int data;
    Node* next;
};

class List{

private:
    Node* head;

public:
    List(){
        head = NULL;
    }

    void insertEnd(int d){
        Node* newNode = new Node;
        newNode->next = NULL;
        newNode->data = d;

        if (head == NULL){
            head = newNode;
            return;
        }

        Node* cu = head;

        while (cu != NULL)
            cu = cu->next;
        cu->next = newNode;
    }

    void printList(){
        Node* temp = new Node;
        temp = head;
        while (temp != NULL){
            cout << temp->data << ", ";
            temp = temp->next;
        }
    }

};

我的主要职能是:

#include <iostream>
#include "List.h"
using namespace std;

int main(){

List list1;

list1.insertEnd(1);
list1.insertEnd(2);
list1.insertEnd(3);

//list1.printList();

return 0;

}

如果我只插入一个节点,该程序有效,但如果我做了其他任何事情,它会崩溃并且不会给我任何错误指示或其他任何内容。

我已经检查了几个网站,如果我的指针正在做正确的事情,我认为它们是,但这里出了什么问题......?

编辑:修复问题...在while循环中应该是

while (cu->next != NULL)

3 个答案:

答案 0 :(得分:2)

函数insertEnd错误。

此循环后

    while (cu != NULL)
        cu = cu->next;

指针cv等于NULL。结果如下声明

    cu->next = newNode;

导致未定义的行为。

将节点附加到列表的最简单方法是以下

void insertEnd( int d )
{
    Node **last = &head;

    while ( *last != nullptr ) last = &( *last )->next;

    *last = new Node { d, nullptr };
}

该功能只有三行。:)

考虑到这个陈述

    Node* temp = new Node;
函数printList中的

没有意义,是内存泄漏的原因。

答案 1 :(得分:1)

你的while循环不正确。将其从cu->next

更改为cu
while (cu->next != NULL)

答案 2 :(得分:1)

void insertEnd(int d){ 
        Node* newNode = new Node; 
        newNode->next = NULL; 
        newNode->data = d; 

        if (head == NULL){ 
            head = newNode; 
            return; 
        } 

        Node* cu = head; 

        while (cu->next != NULL) 
            cu = cu->next; 
        cu->next = newNode; 
}

这个功能可以解决问题。你有一些相对简单的问题。首先,你试图制作一个头部副本来迭代你的列表。您没有将其分配给虚拟指针,而是分配新内存,将新内存分配给虚拟指针,然后将头指针指定给虚拟指针。这将产生内存泄漏,因为如果您忘记了内存,就永远无法删除该内存。我改变了这个:

Node* cu = new Node;
cu = head

到此:

Node* cu = head;

其次,当您检查while循环中的cu是否为空时,会出现您的分段错误。您在循环中将cu设置为cu-&gt; next,然后检查cu是否为null。如果cu为null,则在新节点旁边指定cu-&gt;。您的空指针不引用任何内存,因此尝试引用其成员会给您一个段错误。您想要访问链表中最后一个可能的有效指针。为此,您检查cu-&gt; next是否为null。我改变了这个:

while (cu != NULL)
            cu = cu->next;

To This:

while (cu->next != NULL) 
            cu = cu->next;