C结构链表分段错误



我正在学习C中的链表,我的删除函数有问题。线路出现分段故障:

while(current1 != NULL && (current1->next->data != d))

void delete(int d)
{
    struct list * current1 = head; 
    struct list * current2;
    if (len() == 0)
    { //prtError("empty");
        exit(0);
    }
    if (head -> data == d)
    { 
        head = head -> next;
    }
    //Check if last node contains element
    while (current1->next->next != NULL)
        current1 = current1->next;
    if(current1->next->data == d)
            current1->next == NULL; 
    current1 = head; //move current1 back to front */
    while(current1 != NULL && (current1->next->data != d))
        current1 = current1 -> next; 
    current2 = current1 -> next;
    current1 -> next = current2 -> next; 
}

您要确保测试current1 != NULL中的current1至少有一个元素,这样current1->next就可以保证工作,但它可能会返回NULL本身,导致current1->next->data在尝试从下一个元素获取数据时崩溃。

在这一行中,您不知道current1->next是否为NULL。如果是NULL,并且您尝试访问current1->next->data,则会以segmentation fault结束。

你有两个解决方案来修复你的循环:

while(current1 != NULL && (current1->data != d))
    //                             ^^^^^^^
    current1 = current1 -> next; 

if ( current1 != NULL )
    while (current1->next != NULL && (current1->next->data != d))
        //         ^^^^^^
        current1 = current1 -> next; 

但在第二种情况下,您必须确保在第一个循环current1 != NULL

回答评论:

这是相同的错误,你不知道current1是否是NULL,并且你试图访问next元素,你有两件事要做:

  • 首先,在尝试到达next之前,您必须确保current1不是NULL
  • 就在你必须确定current2不是NULL之后

你有两种可能性(很容易做到):

if ( NULL != current1 )
{
    current2 = current1->next;
    if ( NULL != current2 )
        current1->next = current2->next;
}

if ( NULL != current1 && NULL != current1->next )
{
    current2 = current1->next;
    current1->next = current2->next;
}

两者都能很好地工作。选择你喜欢的。

在您告诉我们有错误的那一行中,您从未检查current1->next是否为NULL。在程序中的某个时刻,current1->nextNULL,因此您正在尝试取消引用地址0。在这一点上,该代码相当于((struct list *)0)->data。因此出现了分段故障。

相关内容

  • 没有找到相关文章

最新更新