2012-10-09 121 views
1

我第一次使用链接列表,并且必须创建一个可以在双链表的末尾插入节点的函数。到目前为止,我有在双向链表的尾部插入

void LinkedList::insertAtTail(const value_type& entry) { 
    Node *newNode = new Node(entry, NULL, tail); 
    tail->next = newNode; 
    tail = newNode; 
    ++node_count; 
} 

节点类接受的值存储,下一个指针的值指向,并在该顺序在先指针的值。每当我尝试在此处插入节点时,都会收到一条错误消息,说明存在未处理的异常,并且在写入位置0x00000008时存在访问冲突。

我不完全确定这里出了什么问题,但我认为它与根据错误消息取消引用空指针有关。我真的很感谢解决这个问题的一些帮助。

编辑:

我应该及早澄清,尾巴是指向在列表中的最后一个节点的指针。尾 - >下一个访问最后一个节点的下一个变量,它在函数运行之前指向NULL,但在执行之后应该指向创建的新节点。

+2

只是一个镜头显示我们:'LinkedList'和'Node'类,没有太多在你的第一篇文章的背景。 –

+0

指向'newNode'的'tail'和'tail-> next'有什么问题吗? *(看起来像一个循环引用,但我可能是错的。)* –

+4

你的'tail'最初是NULL吗?您不能在'tail-> next'中取消引用它,直到它已经指向第一个元素 –

回答

8

哪里tail点开始?如果它是NULL,那么在尝试插入第一个元素时,您将取消引用空指针。

如果您在解除引用前测试tail,这会对您有所帮助吗?

​​

如果tail为null,并且offsetof(Node, next)是8,将解释访问冲突,因为tail->next将在0x00000000地址+ 8是0x00000008,所以分配给tail->next会尝试在该地址写入到内存,这正是你所看到的错误。

+0

感谢大家的帮助!原来,尾巴指向NULL。当我意识到这是一个简单的修复。再次感谢! –

1

这很难说是什么引起的错误,而不插入操作之前知道名单的状态(这实际上是追加而非嵌入,顺便说一句)。

您很可能没有处理追加到空列表的初始情况。基本算法(空列表由空头指针指示的,其他一切都是不确定的):

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

在黑暗