单向链表,为什么链表是空的(head == NULL)?
Singly linked list, why is the list empty (head == NULL)?
我创建了一个单链表:
#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 is empty.
但我不知道为什么。 "head" 获取地址,因此 "head" 不应该为 NULL。但显然它是 NULL。
我不知道如何解决这个问题。
参数head
和last
是传值方式,所以函数内部的变化append
与外部变量无关,是独立的。
需要通过引用或指针的指针传递,如:
void append(Node *&head, Node *&last, int data) {
在函数中:append(Node *head, Node *tail, int data)
您应该通过引用传递 head
和 tail
。在您分配 head = newNode
的方法中,它被分配给 head
的本地副本,而不是您传递的 head
。
您必须记住,函数的参数默认情况下是按值传递的,这意味着参数值是 copied 并且该函数仅适用于副本而不适用于原始值.
现在使用 append
函数,当您传递 head
参数时,指针被复制到参数中,并且函数内部对 head
所做的任何更改只会对那个副本。
要使其正常工作,您需要通过引用传递您更改的参数,例如
void append(Node *&head, Node *&last, int data)
现在head
和last
是对原指针变量的引用,对变量的修改是对原变量的修改
传递头部和最后一个变量的地址,它应该工作。
append(&head, &last, 53);
追加函数的变化如下
void append(Node **head, Node **last, int data)
我创建了一个单链表:
#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 is empty.
但我不知道为什么。 "head" 获取地址,因此 "head" 不应该为 NULL。但显然它是 NULL。 我不知道如何解决这个问题。
参数head
和last
是传值方式,所以函数内部的变化append
与外部变量无关,是独立的。
需要通过引用或指针的指针传递,如:
void append(Node *&head, Node *&last, int data) {
在函数中:append(Node *head, Node *tail, int data)
您应该通过引用传递 head
和 tail
。在您分配 head = newNode
的方法中,它被分配给 head
的本地副本,而不是您传递的 head
。
您必须记住,函数的参数默认情况下是按值传递的,这意味着参数值是 copied 并且该函数仅适用于副本而不适用于原始值.
现在使用 append
函数,当您传递 head
参数时,指针被复制到参数中,并且函数内部对 head
所做的任何更改只会对那个副本。
要使其正常工作,您需要通过引用传递您更改的参数,例如
void append(Node *&head, Node *&last, int data)
现在head
和last
是对原指针变量的引用,对变量的修改是对原变量的修改
传递头部和最后一个变量的地址,它应该工作。
append(&head, &last, 53);
追加函数的变化如下
void append(Node **head, Node **last, int data)