bon*_*ipe 0 c++ pointers class linked-list
大家好我正在用C++中的类做LinkedList实现,到目前为止我只做了节点类和添加方法.但它不起作用,例如我添加一个新元素,当我检查第一个指针时,它指向我刚添加的最后一个元素...
节点类:
template<class T>
class Node
{
private:
T element;
public:
Node<T> *next;
Node( T e ){
element = e;
next = NULL;
}
friend ostream& operator<<(ostream& os, const Node<T>& nd)
{
os << nd.element;
return os;
}
};
Run Code Online (Sandbox Code Playgroud)
和LinkedList类:
template<class T>
class LinkedList{
private:
int size;
public:
Node<T> *first;
Node<T> *last;
LinkedList(){
first = NULL;
last = NULL;
size = 0;
}
void add( T element ){
Node<T> n (element);
if( size == 0 ){
first = &n;
}else{
last->next = &n;
}
last = &n;
size++;
}
int getSize(){
return size;
}
};
Run Code Online (Sandbox Code Playgroud)
所以例如我主要做的是:
LinkedList<int> list;
list.add(5);
list.add(7);
cout << *list.first;
Run Code Online (Sandbox Code Playgroud)
并且它显示'7'作为第一个元素......
提前致谢.
你不能这样做.通过"this",我的意思是存储指向本地范围Node实例的指针,并期望该对象在其原始范围之外保持不变:
void add( T element ){
Node<T> n (element); // This will only exist for the function's duration
if( size == 0 ){
first = &n; // <-- naughty
}else{
last->next = &n; // <-- naughty
}
last = &n; // <-- naughty
size++;
}
Run Code Online (Sandbox Code Playgroud)
你可以看到,你一直非常顽皮.函数退出后,该节点将被删除.实际上,它只存在于堆栈中,所以它有点消失.幸运的是,当您再次调用该函数时,您恰好会返回相同的堆栈地址,因此看起来您的第一个节点已更改.
所以你会怎么做?在堆上分配:
void add( T element ){
Node<T> *n = new Node<T>(element);
if( size == 0 ){
first = n;
}else{
last->next = n;
}
last = n;
size++;
}
Run Code Online (Sandbox Code Playgroud)
这不再顽皮,你可以继续制作其他与指针相关的错误,这些错误是C或C++程序员通过的基本仪式.=)
确保在完成链接列表后,对其进行爬网以及delete每个节点释放您分配的内存.