我正在尝试实现一个链表。
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;
}
我的程序可以编译,但是当它试图用这个构造函数创建一个新列表时崩溃了。有什么建议么?
最佳答案
通常,head
和 tail
将是空列表的空指针,因此像这样取消引用它们:
head->previous = NULL;
将是未定义的行为。
构造函数只是:
List::List() : head(0), tail(0), count(0) {}
(或者如果您的 C++ 足够先进,则将 nullptr
用于 head
和 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
结束,但这通常是比担心之前的问题更简单。
关于c++ - 链表的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18779543/