我第一次使用链表并且必须创建一个可以在双向链表的末尾插入节点的函数。到目前为止我已经
了void LinkedList::insertAtTail(const value_type& entry) {
Node *newNode = new Node(entry, NULL, tail);
tail->next = newNode;
tail = newNode;
++node_count;
}
Node类接受要存储的值,指向下一个指针的值,以及该顺序中前一个指针的值。每当我尝试在此处插入节点时,我都会收到一条错误消息,指出存在未处理的异常,并且写入位置0x00000008时存在访问冲突。
我不完全确定这里出了什么问题,但我认为它与根据错误消息取消引用空指针有关。我真的很感激帮助解决这个问题。
编辑:
我应该早点澄清,tail是一个指向列表中最后一个节点的指针。 Tail-> next访问最后一个节点的下一个变量,该函数在函数运行之前指向NULL,但在执行之后应该指向创建的新节点。
答案 0 :(得分:8)
tail
最初指向哪里?如果它为NULL,那么在尝试插入第一个元素时,您将取消引用空指针。
如果在解除引用之前测试tail
会有帮助吗?
void LinkedList::insertAtTail(const value_type& entry) {
Node *newNode = new Node(entry, NULL, tail);
if (tail)
tail->next = newNode;
tail = newNode;
++node_count;
}
如果tail
为空且offsetof(Node, next)
为8,则会解释访问冲突,因为tail->next
将位于地址0x00000000 + 8,即0x00000008,因此分配给{{1会尝试写入该地址的内存,这正是您所看到的错误。
答案 1 :(得分:1)
如果在插入操作之前知道列表的状态(实际上追加而不是插入),很难分辨导致错误的原因。
您很可能没有处理附加到空列表的初始情况。基本算法是(空列表由NULL头指针指示,其他一切都是不确定的):
def append (entry):
# Common stuff no matter the current list state.
node = new Node()
node->payload = entry
node->next = NULL
# Make first entry in empty list.
if head = NULL:
node->prev = NULL
head = node
tail = node
return
# Otherwise, we are appending to existing list.
next->prev = tail
tail->next = node
tail = node
答案 2 :(得分:1)
假设您的LinkedList既有头尾,也可以尝试:
void LinkedList::insertAtTail(const value_type& entry)
{
Node *newNode = new Node(entry, NULL, tail);
if (tail)
tail->next = newNode;
tail = newNode;
if (!head)
head = newNode;
++node_count;
}
在黑暗中拍摄