-1

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

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; 
    }
}
4

2 回答 2

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;
}

警告。未经测试;-)

于 2013-03-21T22:11:46.967 回答
1

问题在于您的while陈述中的条件。假设您正在查找 date03/21/2013并且您将“检查”的第一个项目将具有 date 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;
}
于 2013-03-21T21:46:10.190 回答