未经测试,但这可能表达了您的部分想法。不过,我会尝试std::list
改用 :)您应该添加一个复制赋值运算符和一个适当分配/取消分配的析构函数。见这里。
template<typename T>
struct ListNode {
ListNode *next, *prev;
T value;
ListNode(const T &val): value(val), next(0), prev(0) {}
// copy constructor
ListNode(const ListNode &other): value(other.value) {
if(other.next)
append(new ListNode(*other.next));
}
void append(ListNode &n) {
next = &n; n.prev = this;
}
};
如果您value
是一个指针,那么您将希望以与next
上面复制指针成员相同的方式复制它,即:
// copy constructor
ListNode(const ListNode &other): value(new T(*other.value)) {
if(other.next)
append(new ListNode(*other.next));
}
因此,对于上面的示例列表,您可以尝试以下操作:
class LList {
LList(): first(0), last(0) {}
// copy constructor
LList(const LList &other):
first(0),
last(0)
{
if(other.first) {
first = new node(*other.first);
// find last item
last = first;
while(last->next) last = last->next;
}
}
~LList() {
if(first) delete first;
}
// TODO: copy assignment operator
private:
struct node {
node(int val): next(0), prev(0), o(new int(val)) {}
// copy constructor
node(const node &other): next(0), prev(0), o(*other.o)
{
if(other.next) {
next = new node(*other.next);
next->prev = this;
}
}
~node() {
delete o;
if(next) delete next;
}
// TODO: copy assignment operator
node *next;
node *prev;
int *o;
};
node *first; // The pointer to the first node (NULL if none)
node *last; // The pointer to the last node (NULL if none)
};
未经测试,但这就是想法......构造函数通过对下一个项目进行操作来递归地工作。正如链接所解释的,“TODO”项目很重要。您可能还想研究智能指针 - 它们消除了记住删除事物的需要,提高了异常安全性,并且通常是比原始指针更安全的选择。