我正在学习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;
}
任何建议都会有所帮助:)
答案 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
。因此分割错误。