【问题标题】:Singly linked list, why is the list empty (head == NULL)?单链表,为什么列表是空的(head == NULL)?
【发布时间】:2015-08-18 20:31:27
【问题描述】:

我创建了一个单链表:

#include <iostream>

using namespace std;

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

bool isEmpty(Node *head){
    if (head == NULL){
        return true;
    }
    else{
        return false;
    }
}

void append(Node *head, Node *last, int data){
    Node *newNode = new Node;
    newNode->data = data;
    newNode->next = NULL;
    if (isEmpty(head)){
        head = newNode;
        last= newNode;
    }
    else{
        last->next = newNode;
        last= newNode;
    }

}

void printList(Node *current){
    if (isEmpty(current)){
        cout << "List is empty." << endl;
    }
    else{
        int i = 1;
        while (current != NULL){
            cout << i << ". Node: " << endl;
            cout << current->data << endl;
            current = current->next;
            i++;
        }
    }
}

void main(){
    Node *head = NULL;
    Node *last = NULL;
    append(head, last, 53);
    append(head, last, 5512);
    append(head, last, 13);
    append(head, last, 522);
    append(head, last, 55);
    printList(head);
}

当我编译它时,输出是这样的:

列表为空。

但我不知道为什么。 “head”获取地址,因此“head”不应为 NULL。但显然它是NULL。 我不知道如何解决这个问题。

【问题讨论】:

  • 您已标记 C++11:开始使用 nullptr 代替 NULL
  • void append(Node*&amp; head, Node*&amp; last, int data).

标签: c++ list c++11 data-structures singly-linked-list


【解决方案1】:

参数headlast是按值传递的,所以函数append内部的变化与外部变量无关,它们是独立的。

需要通过引用或指针的指针来传递,如:

void append(Node *&head, Node *&last, int data) {

【讨论】:

    【解决方案2】:

    函数内:append(Node *head, Node *tail, int data)

    您应该通过引用传递headtail。在您分配head = newNode 的方法中,它被分配给head 的本地副本,而不是您传递的head

    【讨论】:

      【解决方案3】:

      您必须记住,函数的参数默认情况下是按值传递的,这意味着参数值是复制的,并且该函数仅适用于副本,而不适用于原始。

      现在使用append 函数,当您传递head 参数时,指针会复制到参数中,并且函数内对head 所做的任何更改都只会针对该副本进行。

      要使其工作,您需要传递您更改的参数通过引用,例如

      void append(Node *&head, Node *&last, int data)
      

      现在headlast是对原始指针变量的引用,对变量的更改是对原始变量进行的。

      【讨论】:

        【解决方案4】:

        传递头和最后一个变量的地址,它应该工作。

        append(&head, &last, 53);
        

        append 函数的变化如下

        void append(Node **head, Node **last, int data)
        

        【讨论】:

          猜你喜欢
          • 2016-02-22
          • 1970-01-01
          • 2021-03-07
          • 1970-01-01
          • 2021-10-29
          • 1970-01-01
          • 1970-01-01
          • 2015-04-14
          • 2017-12-28
          相关资源
          最近更新 更多