链表的构造函数

时间:2013-09-13 06:23:38

标签: c++ linked-list doubly-linked-list

我正在尝试实现链接列表。

列表有私有变量* head,* tail,count。

我理解数据结构中的逻辑,但不可否认我是C ++的新手,所以我觉得我可能错误地使用了构造函数。

* head和* tail是列表节点指针。列表节点然后有指向上一个和下一个(双链表)的指针。

这是我试过的:

List::List():head(), tail(), count(0) {
    head->previous = NULL; 
    head->next = tail;
    tail->previous = head; 
    tail->next = NULL; 
}

我的程序编译但在尝试使用此构造函数创建新列表时崩溃。有什么建议?

1 个答案:

答案 0 :(得分:2)

通常情况下,headtail将为空列表的空指针,因此请将它们解释为:

head->previous = NULL;

将是未定义的行为。

构造函数只是:

List::List() : head(0), tail(0), count(0) {}

(如果你的C ++足够先进,可以nullptrhead使用tail

如果您在列表的开头和结尾喜欢虚拟节点的人的类型,您需要在尝试使用它们之前分配它们:

List::List() : count(0) {
    head = new somethingOrOther();
    tail = new somethingOrOther();

    head->previous = NULL; 
    head->next = tail;

    tail->previous = head; 
    tail->next = NULL; 
}

这个技巧通常用于大大简化列表插入和删除,因为您无需担心是在最后插入还是在开始时删除。

缺点是列表遍历和搜索节点(包括删除)必须从head->next开始并以tail->previous结束,但这通常比担心早期问题更简单。