-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

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;
}
于 2013-03-21T21:46:10.190 に答える
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 に答える