链表分段错误C



我正在学习C中的链表,我的删除函数有问题,一直给我一个分段错误。我不知道代码出了什么问题。

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; 
}

这在很多方面都是错误的:

1)

while (current1->next->next != NULL)

如果列表只有一个元素:

current1 = head;
current1->next = NULL; 
current1->next->next = Seg Fault

2)
如果你要查看最后一个元素是否有提供的数据,请确保在找到它后从函数返回,并为它释放内存:

while(current1->next->next != NULL)
    current1 = current1->next;
if(current1->next->data == d){
        free(current->next);
        current1->next == NULL;
        return; 
}


3)
如果你按照上面的方式搜索,如果最后一个元素有你的数据(尽管这是一个毫无意义的搜索;不需要单独进行),你就可以从下面的代码中消除一个错误案例。但您仍然会遇到这样的情况:在列表中找不到您的数据,并且current1位于最后一个元素上(因此是!= NULL),但current1->next->data != d会使您的程序崩溃。如果您没有从2)处的函数返回,就会发生这种情况。

current1 = head; //move current1 back to front */
while(current1 != NULL && (current1->next->data != d))
    current1 = current1 -> next; 


4)
已删除节点的可用内存:

current2 = current1 -> next;
current1 -> next = current2 -> next; 
free(current2);

快速浏览:

假设有100个结构,范围从1到99。
第100个将(可能)为NULL。


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

当上面的代码到达第99个结构体时。您执行2次检查。

1)检查第99个是否不是NULL。。返回true
2)检查第100个数据是否与d不同

但没有第100个结构
这导致了未定义的行为,可能,也可能导致segfault。

相关内容

  • 没有找到相关文章

最新更新