Link 列出空指针错误

Link List null ptr error

这是在主函数中。使用 visual studio 2017.

list a;
a.insertAtEnd("i", 1);
a.insertAtEnd("love", 1);

此处主要是调用末尾的第二个插入时。程序崩溃并提示 getnext() 为 NULL。即使在创建每个新节点时,下一个指针都被声明为 NULL。

    class node {
public:
    node(string value) {
        next = NULL;
        data = value;
    }
    void setNext(node *temp) {
        next = temp;
    }
    void setdata(string value) {
        data = value;
    }
    node* getNext() {
        return next;
    }

调试器显示此函数有问题^

string getData() {
    return data;
}
void createDetail() {
    detail *tmp = new detail();
    d = tmp;
}
void setDetail(int lin) {
    d->insertAtEnd(lin);
}
void getDetails() {
    d->print();
}
private:
    node *next;
    string data;
    detail *d;
};


class list {
public:
    list() {
        head = NULL;
    }
    void insertAtEnd(string, int);
    void insertAfter(string, string);
    void display();
private:
    node *head;
};

void list::insertAtEnd(string value, int lin) { //main func being used
if (head == NULL) {
    node *temp = new node(value);
    temp->createDetail();
    temp->setDetail(lin);
    head = temp;
}
else {
    node *temp2 = head;
    while (temp2->getNext() != NULL || temp2->getData()!=value)
    {
        temp2 = temp2->getNext();
    }
    if (temp2->getData() == value)
    {
        temp2->setDetail(lin); //if same line then increment frequency, dont create new detail as word exists
    }
    else
    {
        node *temp = new node(value);
        temp->createDetail();
        temp->setDetail(lin);
        temp2->setNext(temp);
    }

}
}

while (temp2->getNext() != NULL || temp2->getData() != value)
{
    temp2 = temp2->getNext();
}

temp2->getNext() != NULL 对于列表中的最后一项将为 NULL,并且列表中最后一项中的数据可能与值不匹配。在这种情况下,

while (NULL != NULL || "I" != "love") // false or true = true. Enter loop
{
    temp2 = NULL;
}

下一次迭代失败,因为

while (NULL->getNext() != NULL || temp2->getData() != value)
{
    temp2 = temp2->getNext();
}

咔嚓。

我的解决方案更改了很多代码。你可能不喜欢它。另请注意,我已经删除了所有无法编译的内容,因为它被排除在问题之外。

class node
{
    friend class list; // list has access to node's private members
public:
    node(string value)
    {
        next = NULL;
        data = value;
    }
    // removed setNext. Only list should ever be allowed to set the next member
    void setdata(string value)    {
        data = value;
    }
    // same deal for get. Some shmuck could delete link->getNext();, so why let them?
    string getData()
    {
        return data;
    }
private:
    node *next;
    string data;
};

这是一个更安全的列表节点。用户只能与之交互的是数据。其余的被安全地锁起来,只暴露给 list.

class list
{
public:
    list()
    {
        head = NULL;
    }
    void insertAtEnd(string);
private:
    node *head;
};

除了因为它支持问题中未包含的代码而删除的内容外,未更改。

void list::insertAtEnd(string value)
{ //main func being used
    node **cur = &head; // double pointer abstracts away need to test for head. 
                        // Now all nodes are equal and we're always pointed at a next.

    while (*cur != NULL && (*cur)->getData() != value) // note && not ||
    //we loop until out of nodes unless we find a match  
    {
        cur = &(*cur)->next; // get pointer to next next 
    }
    if (*cur != NULL) // pointing at a node. Must have exited because of match
    {
        // did stuff I ommtted because no MCVE
    }
    else // not pointing at node. Need a new node.
    {
        *cur = new node(value);
    }
}

大屠杀。我没有在这里做大量的解释,而是评论了我在做什么以及为什么。