搜索链表

Searching a Linked List

本文关键字:链表 搜索      更新时间:2023-10-16

下面我有一个带有搜索功能的链表。此函数不仅搜索列表中的元素,还设置上一个节点的地址,稍后将在删除函数中使用。如果在列表中找到该值,将返回节点的地址,否则前一个节点为 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;
}

此函数有 3 种情况:

  1. 您尝试查找的值位于第一个节点中,可以使用简单的 if 语句if(curr->value==value){return curr;} 进行测试。我猜这种情况不是这里需要的,因为它没有指向它的先前节点,除非问题中另有说明。

  2. 该值位于列表的中间。在这种情况下,您应该声明两个指针,但是,prev 指针应指向第一个节点,curr 应指向 pre->next curr=pre->next 。现在在循环中,如果找到该值return curr;否则将每个指针移动到下一个节点pre=pre->nextcurr=curr->next

  3. 找不到该值,并在代码中正确执行。

现在回到你的代码。您应该确保前节点未设置为 NULL,因为这会在尝试设置其下一个节点时导致错误。此外,pre 和 curr 应该同时遍历,这样在设置pre->next时就不会丢失节点之间的连接。