【发布时间】:2017-01-09 23:26:18
【问题描述】:
我正在做一个初学者(!)练习。
我很乐意传递基本变量并使用 &variable 参数,因此我可以对返回时不被破坏的变量进行更改。但我仍在学习指针。我正在做基本的 Mutant Bunny 练习(链表练习)。
在其中,我通过声明 Class Bunny 创建了一个链表。我按照您的预期使用数据部分和“下一个”指针进行设置,用于设置链接。
struct Bunny {
string name;
int age;
// more variables here
Bunny* next;
};
当我调用函数来执行诸如使用函数创建兔子之类的事情时,一切都很好:
Bunny* add_node ( Bunny* in_root ){}
这会设置节点并按照我的意愿返回它。我还可以做一些事情,比如调用一个函数来修改兔子类,比如老化兔子。
void advanceAge ( Bunny* in_root ){}
我传入头部,然后我可以修改被调用函数中的兔子,即使它返回主函数,它也会保持修改状态。例如我可以使用:
in_root->age ++;
在被调用的函数中,当我返回“main”时,它仍然会改变。基本上我可以在任何被调用的函数中使用 -> 并且它会永久地进行更改。我认为是因为指针被 -> 取消引用(?),但我仍然在思考它......
到目前为止一切顺利。
当我想调用一个函数来删除列表时,问题就出现了。 (核选项......没有更多的兔子)
我可以删除被调用函数中的所有节点......但它不会改变'main'中的兔子。例如……这不会永久删除节点。
void DeathCheck(Bunny* in_root){
Bunny* prev_ptr;
prev_ptr = in_root;
if (prev_ptr == NULL){
cout << "No list to check age." << endl; return;
} else {
prev_ptr = NULL; // <- what could I code to have this stick? return;}
// rest of DeathCheck
我很好奇是否有办法在被调用的函数中将节点设置为 NULL 并保持不变?
【问题讨论】:
-
您需要提供更多详细信息。 add_node() 究竟是如何工作的。以及完整的兔子列表存储在哪里以及如何存储。在 add_node() 中,您可能没有做您认为您正在做的事情。
标签: c++