搜索链接列表

时间:2016-03-07 04:09:34

标签: c++ pointers

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

}

1 个答案:

答案 0 :(得分:0)

此功能有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. 找不到值,这在代码中正确执行。

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