我有单链表,由具有以下结构的节点组成:
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;
}
}
答案 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;
}
警告。未经测试; - )