[英]Linked List Segmentation Fault 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;
}
快速浏览:
可以说有100个结构,范围是1〜99。
第100个(可能)为NULL。
while(current1 != NULL && (current1->next->data != d))
当上面的代码到达第99个结构时。 您执行2个检查。
1)检查第99位是否不为NULL ..返回true
2)检查百分位数的数据是否与d不同
但是没有第100个结构。
这会导致不确定的行为可能和可能会导致段错误。
这在很多方面都是错误的:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.