单链表,为什么列表是空的(head == NULL)

Singly linked list, why is the list empty (head == NULL)?

本文关键字:head NULL 为什么 链表 单链表 列表      更新时间:2023-10-16

我创建了一个单链表:

#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);
}

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

List为空

但是我不知道为什么。"head"得到一个地址,所以"head"不应该是NULL。但显然它是空的。我不知道如何解决这个问题。

您必须记住,函数的参数默认情况下是按值传递的,这意味着参数值是复制的,并且函数只对复制的起作用,而不是原始的

现在以append函数为例,当你传递head参数时,指针被复制到参数中,并且在函数中对head所做的任何更改都只对该副本进行更改。

要使它工作,你需要传递参数你通过引用改变,如

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

现在headlast是对原指针变量的引用,对变量的修改是对原变量的修改

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

您需要通过引用或指针的指针传递它,例如:

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

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

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

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

append(&head, &last, 53);

和追加函数的变化如下

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