我目前正在学习指针和结构,我正在进行练习。 我的目标是编写一个函数head_insert,它基本上创建一个新的列表元素,然后将它附加到前面。
注意:我知道c ++中已有数据类型列表,但这只是为了更好地锻炼和理解动态结构背后的概念。
我的代码如下:
struct list{
int val;
list *next = NULL;
};
typedef list* ptr_list;
ptr_list head_insert(ptr_list head, const int element){
ptr_list tmp_head;
tmp_head = new list;
tmp_head->val = element;
tmp_head->next = head;
return tmp_head;
}
int main(){
ptr_list head = NULL;
head = head_insert(head, 1); // This is the crucial step I think, as head is not initialized yet
head = head_insert(head, 2);
return 0;
}
问题是,我希望函数head_insert在head为NULL时工作,即我的列表为空。但是,在调试我的代码时,我注意到在每次调用head_insert头后都保持为NULL,然而在head(head-> val,head-> next)内进行了更改。
为什么?那与tmp_head的范围有关吗? 我怎么能修改我的代码才能按照我的意图工作?
如果我在开头没有将头设置为NULL,而是分配空间并手动将其设置为第一个元素,那么一切都运行得很好:
head = new list;
head->val = 1;
感谢您的时间和帮助! 干杯
答案 0 :(得分:1)
您的代码看起来不错,head
在调用head_insert
后肯定会发生变化。
然而,说
头部内的变化(头部 - > val,头部 - >接下来)
错误,您没有“更改”head_insert
的头部,您创建了一个新对象tmp_head
,之后在head
返回时将其分配给head_insert
。< / p>
当您使用调试器时,您可能会注意到head
在NULL
执行中仍然head_insert
,这是绝对正常的。稍后,当函数返回时,tmp_head
被复制到head
(就像您head = head_insert(head, 1);
一样)并且只有head
从NULL
更改为不{ {1}}。