【发布时间】:2013-07-09 03:19:00
【问题描述】:
大家好,我正在用 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;
}
};
还有 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;
}
};
例如,我主要做以下事情:
LinkedList<int> list;
list.add(5);
list.add(7);
cout << *list.first;
它显示'7'作为第一个元素......
提前致谢。
【问题讨论】:
-
一个非常重要的问题是你添加的节点是一个本地对象,即它只存在于
add()函数内部。您正在获取其地址并尝试将其存储在列表中,但该地址将在add()返回后立即失效。 -
那我应该怎么添加呢?
-
最简单的直接修复方法是使用
Node<T> *n = new Node<T>(element);代替Node<T> n(element),然后使用n代替&n。但是您还需要确保在将节点对象从列表中删除(或清除或销毁列表时)时delete。因此,更好的解决方案是将next指针声明为std::unique_ptr<Node<T>>,将它们创建为unique-ptr 并将它们分别移动到first和last->next。
标签: c++ class pointers linked-list