调试链表指针代码:分段错误

问题描述 投票:0回答:3

所以下面的代码:

/*
 * For your reference:
 *
 * SinglyLinkedListNode {
 *     int data;
 *     SinglyLinkedListNode* next;
 * };
 *
 */
SinglyLinkedListNode* insertNodeAtTail(SinglyLinkedListNode* head, int data) {
  SinglyLinkedListNode* temp = head;
  while (temp != NULL) {
    temp = temp->next;
  }
  SinglyLinkedListNode* temp1;
  temp1->data = data;
  temp1->next = NULL;
  temp->next = temp1;
  return temp;
}

因此,基本上,我想在链接列表“ head”的末尾添加“ data”并返回更新后的列表。那哪里出了问题?

编辑:好的,我遇到了第一个错误。但是,即使我在循环条件中将temp!= NULL替换为temp-> next!= NULL仍然存在此错误

c++ pointers debugging linked-list
3个回答
1
投票

您必须为节点分配内存。记住要清理分配的内存。对于每次呼叫new,您都需要一个呼叫delete。因此,我更喜欢智能指针。

循环后,temp包含NULL。您不能取消引用空指针。

SinglyLinkedListNode* insertNodeAtTail(SinglyLinkedListNode* head, int data) {
    if (!head) {
        head = new SinglyLinkedListNode;
        head->next = nullptr;
        head->data = data;
        return head;
    }
    SinglyLinkedListNode* temp=head;
    while(temp->next){
        temp = temp->next;
    }
    SinglyLinkedListNode* temp1 = new SinglyLinkedListNode;
    temp1->data = data;
    temp1->next = nullptr;
    temp->next = temp1;
    return temp;
}

0
投票

它也在这里崩溃:

SinglyLinkedListNode* temp1;
temp1->data=data;

到达循环while(temp!=NULL){的末尾时,此处tempNULL。下面您正在使用类似temp->next=temp1;的语句,这会导致崩溃


0
投票

此功能

SinglyLinkedListNode* insertNodeAtTail(SinglyLinkedListNode* head, int data) {
SinglyLinkedListNode* temp=head;
while(temp!=NULL){
    temp=temp->next;
}
SinglyLinkedListNode* temp1;
temp1->data=data;
temp1->next=NULL;
temp->next=temp1;
return temp;
}

没有道理。在此循环之后

while(temp!=NULL){
    temp=temp->next;
}

指针temp等于NULL。所以这条语句

temp->next=temp1;

调用未定义的行为。

指针temp1未初始化。再次这些声明

temp1->data=data;
temp1->next=NULL;

调用未定义的行为。

函数的用户不知道返回的指针是列表的开头还是最后一个指针。因此,不清楚是将返回的指针分配给头指针还是只是忽略返回的值。

该函数可以通过以下方式查看。

void insertNodeAtTail( SinglyLinkedListNode * &head, int data ) 
{
    SinglyLinkedListNode **current = &head;

    while ( *current != nullptr ) current = &( *current )->next;

    *current = new SinglyLinkedListNode { data, nullptr };
}

该函数的另一种定义可以如下所示

SinglyLinkedListNode* insertNodeAtTail( SinglyLinkedListNode *head, int data ) 
{
    SinglyLinkedListNode *new_node = new SinglyLinkedListNode { data, nullptr };

    if ( head == nullptr )
    {
        head = new_node;
    }
    else
    {
        SinglyLinkedListNode *current = head;

        while ( current->next != nullptr ) current = current->next;

        current->next = new_node;
    }

    return head;
}
© www.soinside.com 2019 - 2024. All rights reserved.