简单的C++链接列表

Lor*_*ron 7 c++ linked-list

我有很多以前使用Java链接列表的经验,但我似乎对这种在C++中的简单尝试感到困惑.我在运行时遇到了分段错误,根据我的理解,它与分配空指针有关,但我对解决方案感到茫然.

编辑:谢谢大家的回复.代码现在正在运行,但试图使用

delete p;
在linkedList :: addNode的末尾导致运行时的分段错误.只是好奇,如果有人知道为什么会这样?

这是我更新的代码:

#include <iostream>
using namespace std;

class Node{
    public:
        int data;
    Node * next;
    Node(int x){
        data = x;
        next = NULL;
        }
    Node(int x, Node * y){
        data = x; 
        next = y;
        }
    };


class linkedList{
Node *head;
public:
    linkedList(){
        head = NULL;
        }
    void addNode(int value){
        Node *p;
        if(head == NULL)
            head = new Node (value, NULL);
        else{
            p=head;
            while(p->next !=NULL)
                p=p->next;
            p->next = new Node (value, NULL);
            }
        }
    void print(){
        Node * p;
        p = head;
        while(p != NULL){
            cout << p->data << "\n";
            p = p->next;
            }
        }
};


int main(void){
linkedList test;
test.addNode(4);
test.addNode(76);
test.addNode(12);
test.print();
return(0);
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*eek 6

首先,在linkedList::addNode方法,你有建设if (head = NULL),这将拉闸分配head; 你想要==运营商.

二,关于线:

head = &(Node (value, NULL));
Run Code Online (Sandbox Code Playgroud)

出于某种不直观的原因,这是行不通的.您将获得对a的引用Node,但是一旦该方法结束,该节点将超出范围,并且尝试引用它将导致分段错误.您需要使用new运算符(与其他类似的行相同):

head = new Node(value, NULL);
Run Code Online (Sandbox Code Playgroud)

如果添加一个删除节点的方法,请确保delete该节点 - 它不会像在Java中一样自动进行垃圾收集.

补充工具栏:想想会发生什么:当你这样做时Node(value, NULL),你正在使用一个像这样声明的临时变量:

Node hiddenTempNode(value, NULL);
Run Code Online (Sandbox Code Playgroud)

这不会为除了堆栈之外的任何地方的对象分配空间 - 它非常类似于为堆栈上的inta和a 分配空间Node *作为单独的变量.因此,只要您离开方法,对象就会消失,指向它的指针在使用时会发生奇怪的事情.

第三,要注意:您可能希望next = NULL在单参数构造函数中设置,以确保它始终具有值.同样适用于您的默认构造函数.

第四:你的linkedList::print方法循环,直到p->nextNULL与印刷的价值p->next; 如果你想得到第一个和最后一个项目,那么这些事件p->next应该被改为p.


edu*_*ffy 2

对于初学者

if(head = NULL)
Run Code Online (Sandbox Code Playgroud)

是一个赋值,而不是检查是否相等。将其更改为

if(head == NULL)
Run Code Online (Sandbox Code Playgroud)

第二,

head = &(Node (value, NULL));
Run Code Online (Sandbox Code Playgroud)

没有意义*将其更改为

head = new Node (value, NULL);
Run Code Online (Sandbox Code Playgroud)

*这实际上创建了一个临时对象,为您提供地址,然后销毁该新创建的对象。

第三,

Node(int x) { data = x; }
Run Code Online (Sandbox Code Playgroud)

不留next任何值,将此行更改为

Node(int x) { data = x; next = NULL; }
Run Code Online (Sandbox Code Playgroud)