C结构链表清单分段错误

时间:2013-07-09 22:05:58

标签: c list linked-list fault

我正在学习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; 
}

任何建议都会有所帮助:)

3 个答案:

答案 0 :(得分:1)

您确保current1至少有一个元素与您的测试current1 != NULL一致,因此current1->next保证可以正常工作,但它可能会返回NULL本身导致{{ 1}}在尝试从 next 元素中获取数据时崩溃。

答案 1 :(得分:1)

在此行,您不知道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元素,您有两件事要做:< / p>

  • 首先,在尝试访问current1
  • 之前,您必须确保NULL不是next
  • 在您必须确定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;
}

两者都能很好地运作。选择你喜欢的那个。

答案 2 :(得分:0)

在您告诉我们出错的行中,您永远不会检查current1->next是否为NULL。在您的计划中的某个时刻,current1->next NULL,因此您尝试取消引用地址0。此时,代码等同于((struct list *)0)->data。因此分割错误。