所以我一直在教自己链接列表,并一直在努力为他们编写一些非常基本的功能。基本上我一直在使用
struct ListNode{
int data;
ListNode *next
};
我正在尝试创建一个函数来将数字添加到列表中,到目前为止我得到的是
void addToList(int numberToAdd, struct ListNode *headOfList){
ListNode *newItem=new ListNode;
newItem->data=numberToAdd;
if(headOfList==NULL){
newItem->next=NULL;
headOfList=newItem;
}}
到目前为止,我只尝试将一个ListNode添加到声明为
的空列表中ListNode *head=NULL;
在我的主要功能中。我遇到的问题是在我做完
之后addToList(someRandomNumber,head);
如果我这样做,我会收到错误,
cout<<head->data;
但如果我进入我的addToList函数并执行
cout<<headOfList->data;
它完美无缺。为什么会这样?
答案 0 :(得分:1)
headOfLst
正在按值传递,因此当您修改变量时,它不会反映在main
中:
void addToList(int numberToAdd, struct ListNode *headOfList){
^^^^^^^^^^^^
如果你传递它有一个双指针,你将能够修改指针本身:
void addToList(int numberToAdd, struct ListNode **headOfList){
然后稍后的作业将是:
*headOfList=newItem;
修改
并且main
中的调用应该像这样修改:
addtolist(1,&head);
另一个选择是传递对指针的引用:
void addToList(int numberToAdd, struct ListNode *& headOfList){
^
在这种情况下,不需要修改其他代码。
答案 1 :(得分:0)
当您将headList
参数传递给addToList
时,您实际上正在传递副本。 headOfList
和head
是独立的指针。这意味着当您修改函数内部的头指针以指向其他任何内容并返回时,head
指针仍未修改(指向NULL)。执行cout<<head->data;
时,您将取消引用NULL指针。 (head->data
等于(*head).data
。)
在这种情况下,解决方案是添加另一个间接级别,即将指针传递给指向ListNode
的指针,正如Shafik所解释的那样:
addToList(someRandomNumber, &head);