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

节点.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;
}

顺便说一句:上面的代码片段返回链中的第一个匹配节点,原始节点返回最后一个。

另外:如果指针参数(原件中的“开始”)为 NULL,则原件将取消引用 NULL 指针并崩溃(或返回废话)。这个带有 for(;;) 循环的版本只会返回 NULL。

于 2012-11-25T16:27:17.370 回答
0

块中需要注意的 2 点

if(current->node_id == id) {
    result == current;
}
  1. 你不是在检查是否currentNULL。如果任何具有node_id等于的 节点id不存在,最终您将到达列表的末尾(其中nextis NULL)并尝试评估NULL->next并崩溃。printf()在这个块之前放一个,看看会发生什么。

  2. 你已经写result == current了,它对 没有任何作用result。它只是检查是否相等,并且result永远保持不变。它应该是result = current,它分配了currentto的值result

于 2012-11-25T16:29:43.423 回答