1

ノード構造のリンクリストがあり、リストを検索して一致するIDを持つノードを見つけるための関数で、渡されたIDとノードIDを比較するとifステートメントが失敗するようです。ifステートメントは、以下の関数の6行目にあります。* node_id *とidの両方が同じ値であっても、失敗します。

NODE *node_id_search(int id, NODE *start) {
    NODE *result = NULL, *current = start;

    do {

        if(current->node_id == id) {
            result == current;
        }

        current = current->next;
    } while(current->next != NULL && result == NULL);


    return result;
}

node.h

typedef struct node {
    /*@{*/
    /**
     * The node id used to identify the node. The id is a positive integer.
     */
    int node_id;

    /**
     * The node type.
     */
    char node_type[10];

    /**
     * Pointer to the next node element.
     */
    struct node *next;
    /*@}*/
} NODE;
4

3 に答える 3

2

上記の回答(質問との関係がわからない)以外に、私が目にする唯一の問題は次のコードです:

    if(current->node_id == id) {
        result == current; //which should be result = current;
    }

次のように変更します。

if(current->node_id == id){
     result = current;
     return result; // no need to search any further(hence optimized).
}

それ以外は、あなたのコードに問題はありません。

于 2012-11-25T16:21:57.490 に答える
0

あなたのコードは非常に複雑です。次のように減らすことができます。

NODE *node_id_search(int id, NODE *ptr) {

    for( ; ptr; ptr = ptr->next) {
        if(ptr->node_id == id) return ptr;
        }

    return NULL;
}

ところで: 上記のスニペットは、チェーン内の最初の一致するノードを返します。元のノードは最後に返されます。

また、ポインター引数 (元の "start") が NULL の場合、元の引数は NULL ポインターを逆参照してクラッシュします (またはナンセンスを返します)。for(;;) ループを含むこのバージョンは、NULL を返すだけです。

于 2012-11-25T16:27:17.370 に答える
0

ブロックで注意すべき2つのポイント

if(current->node_id == id) {
    result == current;
}
  1. あなたはそうであるかどうかをチェックしていませcurrentNULLnode_id等しい ノードがid存在しない場合、最終的にはリストの最後 ( nextisの場所NULL) に到達し、評価NULL->nextしてクラッシュを試みます。printf()このブロックの前にaを置いて、何が起こるかを確認してください。

  2. あなたが書いたresult == current、これは には何もしませんresult。等しいかどうかをチェックしているだけで、result永遠に同じままです。の値をにresult = current代入する である必要があります。currentresult

于 2012-11-25T16:29:43.423 に答える