我正在尝试将项目添加到列表的前面 . 基本上,我在这里要做的是:
-
从空列表开始;
-
读一个数字;
-
调用函数,其中创建新节点以存储数字,并且下一指针指向null;
-
如果列表为空,则此新节点是列表的开头(并且只有元素)
-
如果有更多元素,则此新节点指向列表的头部并成为新头 .
我的函数做我想要的(至少我可以在调试器中看到),但在它返回之后我的列表为空并且头再次为空 .
struct node{
int data;
node *next;
};
void insert_front(node *list, int num){
node * newnode = new (node);
newnode->data = num;
newnode->next = nullptr;
if (list == nullptr)
list = newnode;
else{
newnode->next = list;
list = newnode;
}
}
int main()
{
int n;
node *head = nullptr;
cout << "Input numbers to store (0 finishes input): ";
cin >> n;
while (n != 0){
insert_front(head, n);
cin >> n;
}
return 0;
}
也试过这个,但它甚至没有编译:
void insert_front(node &lst, int num){
node *newnode = new node();
newnode->data=num;
newnode->next=lst;
lst=newnode;
}
我故意避免使用OOP,模板,typedef等尽可能地获得“更干净”的代码,以便我能理解一切是如何工作的 .
3 回答
您需要对指针varibable的引用:node *&list
如果你不使用引用,你将修改你的“lst”指针的副本,所以在离开这个函数后列表将继续指向旧的前面 . c中的参考参数以“&”符号为前缀 . 在单个旧C(不是你的情况)中,你需要一个指向指针的指针 .
您按值传递列表 .
看到这个比喻:
不要通过引用传递,因为您无法分配它 .
然后在插入时:
或者,您可以让插入函数也更新
list
以反映新头,但您必须将指针传递给头指针本身: