我正在实现一个链表。有一个问题:当我在函数内部更改指针时,该更改在函数外部不可见。
#include<bits/stdc++.h>
using namespace std;
//define
class List{
public:
int data;
List *next;
public:
List(int n){
this->data=n;
this->next=NULL;
}
};
void add(List *head,int data){
List * nn = new List (data);
head=nn;
}
// driver code
int main(){
List *head=NULL;
List * nn = new List (45);
head=nn;
cout<<head->data;
return 0;
}
此代码打印45。
class List{
public:
int data;
List *next;
public:
List(int n){
this->data=n;
this->next=NULL;
}
};
void add(List *head,int data){
List * nn = new List (data);
head=nn;
}
// driver code
int main(){
List *head=NULL;
add(head,45);
cout<<head->data;
return 0;
}
此程序不打印任何内容。它只是崩溃了。
此功能:
void add(List *head, int data)
使用copy取得head
指针,因此调用者看不到函数内部指针的更改。这意味着head
中的指针main
没有指向有效的内存,并且对其取消引用会调用未定义的行为(这可能导致崩溃)。
使函数通过reference代替指针:
void add(List * &head, int data)
现在更改函数内部的head
会更改head
函数中的main
。
添加方法中有2个问题:
1)您需要接受指向引用的指针(或指向指针的指针)
2)您需要添加遍历的逻辑,直到列表中的最后一个节点,并在末尾添加新的节点。否则,每次使用新节点重置列表头时,新节点都指向null并成为一个节点列表。
类似的实现,您可以在这里参考https://github.com/alokkusingh/DataStructure。实现是在C(不是C ++)中进行的]