0

我正在尝试实现一个链表。

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; 
}

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

4

1 回答 1

2

通常,head并且tail将是空列表的空指针,因此像这样取消引用它们:

head->previous = NULL;

将是未定义的行为。

构造函数只是:

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

(或nullptr用于head并且tail如果您的 C++ 足够先进)。

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

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但这通常比担心早期问题更简单。

于 2013-09-13T06:26:54.670 回答