c++ - 链表的构造函数

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

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

List 有私有(private)变量 *head, *tail, count。

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

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

这是我尝试过的:

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

我的程序可以编译,但是当它试图用这个构造函数创建一个新列表时崩溃了。有什么建议么?

最佳答案

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

head->previous = NULL;

将是未定义的行为。

构造函数只是:

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

(或者如果您的 C++ 足够先进,则将 nullptr 用于 headtail)。

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

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 结束,但这通常是比担心之前的问题更简单。

关于c++ - 链表的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18779543/

相关文章:

arrays - 具有 O(1) 插入和删除的双向链表的紧凑多数组实现

java - 如何评估通过链表或数组列表实现的二叉树的性能?

C++ 未处理的异常。 0xC0000005 : Access violation reading location 0xccccccd0

c++ - CUDA推力库中的函数是否隐式同步?

c++ - boost 日志记录严重性级别过滤器未兑现

C - 无法访问内存地址

同步后Java并发修改异常

c - 销毁 C 中的双向链表

C++如何压缩花哨的for循环

c++ - EigenLib) Eigen::Quaterniond * 3.0 不工作?