c++ - 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
但我不明白为什么这种方法不起作用。如果我没有正确解释我的问题,我很抱歉,如果需要任何澄清,请告诉我。
解决方案
根本问题可以简化为以下代码:
void insertNodeAtEnd(Node* HEAD, int data) {
//...
if (HEAD == NULL) { HEAD = new Node(data); }
//...
}
int main() {
Node* HEAD = NULL;
insertNodeAtEnd(HEAD, 5);
//...
您似乎认为分配给HEAD
insideinsertNodeAtEnd
会改变HEAD
内部的变量main
。这不是真的。您的指针是按值传递的,因此会为函数复制地址。更改此复制的变量不会更改HEAD
inside 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
。
推荐阅读
- vue.js - 在 Vuetify 和 Vue JS 中将 prop 传递给父级
- ruby-on-rails - Ruby 2.5.1、Ruby Java Bridge (RJB) 和 Ubuntu 18.04:获取“未定义常量 DL 和 Fiddle”。
- wordpress - 我可以更改 wordpress 主题中的登录弹出窗口吗?
- python - Django在文件字段中将csv文件返回给用户
- twilio - 我收到这些错误是因为我的 webhook 没有发送任何 TwiML 吗?
- sql-server - t-sql 查询递归更新数据
- atom-editor - 如何为更漂亮的原子禁用数组和对象的配置中的换行?
- spring-cloud-stream - 使用基于密钥的 Spring Cloud Stream SFTP Source Private Key Property not Found
- python - 如何保持传递给 jsonify() 函数的排序字典的顺序?
- ruby-on-rails - 将新行添加到索引而不必重新索引所有内容?