我正在学习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;
}
您要确保测试current1 != NULL
中的current1
至少有一个元素,这样current1->next
就可以保证工作,但它可能会返回NULL
本身,导致current1->next->data
在尝试从下一个元素获取数据时崩溃。
在这一行中,您不知道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
元素,你有两件事要做:
- 首先,在尝试到达
next
之前,您必须确保current1
不是NULL
- 就在你必须确定
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;
}
两者都能很好地工作。选择你喜欢的。
在您告诉我们有错误的那一行中,您从未检查current1->next
是否为NULL
。在程序中的某个时刻,current1->next
是NULL
,因此您正在尝试取消引用地址0
。在这一点上,该代码相当于((struct list *)0)->data
。因此出现了分段故障。