用C ++创建一个列表

时间:2016-11-27 16:46:15

标签: c++ list pointers structure

我目前正在学习指针和结构,我正在进行练习。 我的目标是编写一个函数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;

感谢您的时间和帮助! 干杯

1 个答案:

答案 0 :(得分:1)

您的代码看起来不错,head在调用head_insert后肯定会发生变化。

然而,说

  

头部内的变化(头部 - > val,头部 - >接下来)

错误,您没有“更改”head_insert的头部,您创建了一个新对象tmp_head,之后在head返回时将其分配给head_insert。< / p>

当您使用调试器时,您可能会注意到headNULL执行中仍然head_insert,这是绝对正常的。稍后,当函数返回时,tmp_head被复制到head(就像您head = head_insert(head, 1);一样)并且只有headNULL更改为不{ {1}}。