首页 > 解决方案 > C++ 链表 HEAD 不断重置为 NULL

问题描述

我需要帮助来理解为什么我的链接列表方法不能按预期工作。

#include <iostream>
using namespace std;

class Node {
public:
    int Data;
    Node* Next;
    
    Node(int data) {
        Data = data;
        Next = NULL;
    }
};

void insertNodeAtEnd(Node* HEAD, int data) {
    Node* it = HEAD;
    if (HEAD == NULL) { HEAD = new Node(data); }
    else {
        while (it->Next != NULL) { it = it -> Next; }
        it -> Next = new Node(data);
    }
}

void printLinkedList(Node* HEAD) {
    Node* it = HEAD;
    while (it != NULL) {
        cout << it->Data << endl;
        it = it -> Next;
    }
}

int main() {
    Node* HEAD = NULL;
    // Node* HEAD = new Node(0);
    
    insertNodeAtEnd(HEAD, 5);
    insertNodeAtEnd(HEAD, 2);
    insertNodeAtEnd(HEAD, 10);
    
    printLinkedList(HEAD);
    return 0;
}

上面的main()函数不起作用(即:没有输出,一旦控制离开,HEAD 就会一直重置为 NULL insertNodeAtEnd()),我在 SO 上发现了类似的问题,解释这是因为指针是按值传递的,这对我来说有部分意义。如果指针作为值传递,
为什么当我在函数中Node* HEAD = NULL;替换为时它会按预期工作?Node* HEAD = new Node(0);main()

如果我初始化 HEAD like ,如何添加节点,但不是在最初Node* HEAD = new Node(0);的情况下?HEAD = NULL我能够通过使用使其正常工作,pointer to pointer但我不明白为什么这种方法不起作用。如果我没有正确解释我的问题,我很抱歉,如果需要任何澄清,请告诉我。

标签: c++pointerslinked-list

解决方案


根本问题可以简化为以下代码:

void insertNodeAtEnd(Node* HEAD, int data) {
    //...
    if (HEAD == NULL) { HEAD = new Node(data); }
    //...
}

int main() {
    Node* HEAD = NULL;
    insertNodeAtEnd(HEAD, 5);
    //...

您似乎认为分配给HEADinsideinsertNodeAtEnd会改变HEAD内部的变量main。这不是真的。您的指针是按值传递的,因此会为函数复制地址。更改此复制的变量不会更改HEADinside of的值main

要解决此问题,您可以将指针传递给指针,如下所示:

void insertNodeAtEnd(Node** HEAD, int data) {
    //...
    if (*HEAD == NULL) { *HEAD = new Node(data); }
    //...
}

int main() {
    Node* HEAD = NULL;
    insertNodeAtEnd(&HEAD, 5);
    //...

这个指向指针的指针仍然是按值传递的,但是它指向的指针将与 on from 相同main


推荐阅读