在单链表中搜索节点

时间:2013-03-21 21:31:58

标签: c++ linked-list singly-linked-list

我有单链表,由具有以下结构的节点组成:

struct date
{
    int day, month, year;       
};
struct Node
{
    string item;
    date Exp;
    int count;
    Node *link;
};
typedef Node* NodePtr;

当我搜索到期日期时,所有其他节点在我搜索时显示,但不显示第一个节点。当我改变节点的顺序时会发生这种情况。这是一个简单的错误吗?

这是我用于搜索节点的函数:

NodePtr search_date(NodePtr head, int month, int day, int year)
{
    // Point to the head node
    NodePtr here = head;

    // If the list is empty nothing to search
    if (here == NULL)
        return NULL;

    // Search for the item    
    else{
        //while you have still items and you haven't found the target yet 
        while (here-> Exp.day != day && 
               here-> Exp.month != month && 
               here->Exp.year != year &&
               here->link != NULL) 
            here = here->link; 

        // Found the target, return the pointer at that location 
        if (here-> Exp.month == month &&
            here-> Exp.day == day &&
            here-> Exp.year == year) 
            return here;

        // Search unsuccessful, return Null 
        else 
            return NULL; 
    }
}

2 个答案:

答案 0 :(得分:1)

问题出在while声明中。让我们说你正在寻找约会03/21/2013以及你将要检查的第一个项目"将具有日期04/21/2013。天数不相等,因此条件将被评估为false,即使有记录显示您要查找的日期,您也永远不会达到它。

此功能可能如下所示:

NodePtr search_date(NodePtr node, int month, int day, int year)
{    
    // while there is some node still:
    while (node)
    {
        // if we found the right node, return it:
        if (node->Exp.month == month &&
            node->Exp.day == day &&
            node->Exp.year == year) 
            return node;

        // move to the next node:
        node = node->link;
    }

    // we haven't found it:
    return NULL;
}

答案 1 :(得分:1)

@LiHO基本上是正确的:你的比较逻辑是有缺陷的。

解决此问题的一个好方法是为date

创建一个比较运算符
struct date
{
    int day, month, year;

    bool operator==(const date &lhs, const date &rhs)
    {
      return (rhs.day == lhs.day) && (rhs.month == lhs.month) (rhs.year == lhs.year);
    }
};

然后你的循环简化为

NodePtr search_date(NodePtr head, const date &wantedDate)
{
  for (NodePtr p == head; p != NULL; p = p->link)
    if (p.Exp == wantedDate)
     return p;

  return NULL;
}

警告。未经测试; - )