下面我有一个带搜索功能的链表。此函数不仅搜索列表中的元素,还设置先前节点的地址,稍后将在删除功能中使用该地址。如果在列表中找到该值,则将返回节点的地址,否则前一个节点为null,并且该函数返回null。我收到了分段错误,我不确定为什么。有人能解释一下为什么吗?感谢。
struct IntNodeType {
int value;
IntNodeType * next;
IntNodeType (int v=0, IntNodeType * p=NULL):value(v),next(p)
{
}
};
IntNodeType * Search (IntNodeType * firstNodePtr, int value,
IntNodeType * & prevNode)
{
IntNodeType * cur;
IntNodeType * prev;
cur = firstNodePtr;
prev = prevNode;
while (cur!=NULL)
{
if (cur->value==value)
{
prev -> next = cur;
return cur;
}
cur = cur->next; //update p with the current node's next field
}
prevNode = NULL;
return NULL;
}
答案 0 :(得分:0)
此功能有3种情况:
您要查找的值位于第一个节点中,可以使用简单的if语句if(curr->value==value){return curr;}
对其进行测试。这种情况不是我在这里所要求的,因为它没有指向它的先前节点,除非在问题中另有说明。
该值位于列表中间。在这种情况下,您应声明两个指针,但是,prev指针应指向第一个节点,curr应指向pre-> next curr=pre->next
。现在在循环中,如果找到值return curr;
,则将每个指针移动到下一个节点pre=pre->next
和curr=curr->next
。
找不到值,这在代码中正确执行。
现在回到你的代码。您应该确保前节点未设置为NULL,因为这会在尝试设置其下一个节点时导致错误。此外,应同时遍历pre和curr,以便在设置pre->next
时不会丢失节点之间的连接。