0

所以我一直在自学链表,并且一直在为它们写一些非常基本的函数。基本上我一直在使用的东西

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; 

它工作得很好。为什么会这样?

4

2 回答 2

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){
                                                 ^

在这种情况下,无需修改其他代码。

于 2013-06-04T09:27:32.577 回答
0

当您将headList论点传递给addToList您时,实际上是在传递它的副本headOfList并且head是独立的指针。这意味着当您修改函数内部的头指针以指向其他任何内容并返回时,head指针仍然未修改(指向 NULL)。当您执行时cout<<head->data;,您将取消引用 NULL 指针。(head->data等于(*head).data。)

这种情况下的解决方案是添加另一层间接性,即,将指针传递给指向 a 的指针ListNode,正如 Shafik 解释的那样:

addToList(someRandomNumber, &head);
于 2013-06-04T09:37:23.297 回答