繁体   English   中英

删除链表中的节点 - 分段错误

[英]Deleting node in linked list - segmentation fault

问题需要给定链表的头指针和要删除的链表中节点的位置,从链表中删除节点。 有关问题的更多详细信息,请访问: https : //practice.geeksforgeeks.org/problems/delete-a-node-in-single-linked-list/1

代码返回分段错误,但不确定我哪里出错了。 我的代码如下:

Node* deleteNode(Node *head,int x)
{
    //Your code here
    struct Node* temp = head;

    if(x==0){
        //change head
        head = temp->next;
        free(temp);
    }
    //find previous node of node to be deleted
    for(int i=0; temp!=NULL && i<x-1; ++i){
        //traverse
        temp = temp->next;
    }
    //now temp should be pointing to previous node
    //store pointer to next of node to be deleted
    struct Node* next = temp->next->next;
    free(temp->next);
    temp->next= next;
}

您应该在开始时以及在执行最后 3 行代码之前检查head == nullptr if temp == nullptr因为您可以退出 for 循环,因为用户试图删除的节点超出了大小.

您还应该考虑从您的函数中返回void

你可以这样做:

void deleteNode(Node *head,int x)
{
    // this way you avoid dereferencing nullptr with temp->next later on
    if(head == nullptr) return;
    //Your code here
    struct Node* temp = head;

    if(x==0){
        //change head
        head = temp->next;
        free(temp);
    }
    //find previous node of node to be deleted
    for(int i=0; temp!=NULL && i<x-1; ++i){
        //traverse
        temp = temp->next;
    }
    //now temp should be pointing to previous node
    //store pointer to next of node to be deleted

    // you need to check to see if temp is nullptr here or if the node
    // after temp is nullptr because either of those can cause you to 
    // get a segmentation fault because of dereferencing a nullptr
    if(temp == nullptr || temp->next == nullptr) return;
    struct Node* next = temp->next->next;
    free(temp->next);
    temp->next= next;
}

您的代码包含许多可以取消引用空指针的地方。 例如这里:

struct Node* temp = head;

if(x==0){
    //change head
    head = temp->next;
    free(temp);
}

如果head已经是空指针。 此外,您似乎假设这会更改caller 中head变量,但事实并非如此。 你必须通过一个双指针来实现这一点。 最后,看起来你的函数应该在free(temp);之后返回free(temp); .

然后,看这部分:

for(int i=0; temp!=NULL && i<x-1; ++i){
    //traverse
    temp = temp->next;
}
//now temp should be pointing to previous node
//store pointer to next of node to be deleted

不,它不一定指向一个节点, temp也可以包含一个空指针,这是 for 循环的第二个中断条件。 如果是这种情况,您必须检查并退出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM