0

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

3 回答 3

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元素,您有两件事要做:

  • 首先,您必须确保current1NULL尝试到达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;
}

两者都会运作良好。选择您喜欢的那个。

于 2013-07-09T22:11:18.493 回答
1

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

于 2013-07-09T22:08:03.997 回答
0

在您告诉我们有错误的那一行中,您永远不会检查是否current1->next存在NULL。在您的程序中的某个时刻,current1->next is NULL,因此您试图取消引用 address 0。此时,代码相当于((struct list *)0)->data. 因此分段错误。

于 2013-07-09T22:09:19.483 回答