C 我试图返回包含值项的第一个节点,如果没有找到,则返回NULL

C 我试图返回包含值项的第一个节点,如果没有找到,则返回NULL,c,gcc,linked-list,C,Gcc,Linked List,我正在尝试返回包含值项的第一个节点,如果没有找到,则返回NULL。我写了两个逻辑,根据我的观点是相同的。但是为什么我在其中一个中得到了错误的输出 //THIS IS GIVING ME THE CORRECT OUTPUT struct nodeStruct* List_findNode(struct nodeStruct *head, int item){ struct nodeStruct *temp_node=head; while (temp_node!=NULL)

我正在尝试返回包含值项的第一个节点,如果没有找到,则返回NULL。我写了两个逻辑,根据我的观点是相同的。但是为什么我在其中一个中得到了错误的输出

//THIS IS GIVING ME THE CORRECT OUTPUT
struct nodeStruct* List_findNode(struct nodeStruct *head, int item){

    struct nodeStruct *temp_node=head;

    while (temp_node!=NULL)
    {
        if (temp_node->item == item)
        {
            return temp_node;     

        }
        temp_node=temp_node->next;  

    }
    return NULL;
}

//BUT ACCORDING ME THIS IS THE SAME LOGIC BUT IT'S GIVING WRONG OUTPUT.
struct nodeStruct* List_findNode(struct nodeStruct *head, int item){

    struct nodeStruct *temp_node=head;

    while (temp_node!=NULL)
    {
        if (temp_node->item != item)
        {

            temp_node=temp_node->next;


        }
        return temp_node;  

    }
    return NULL;
}

在后一种情况下,需要继续,否则函数将始终返回

while (temp_node!=NULL)
{
    if (temp_node->item != item)
    {

        temp_node=temp_node->next;
        continue; // here
    }
    return temp_node;  
}
也就是说,您还可以使用for循环:

struct nodeStruct* List_findNode(struct nodeStruct *head, int item) {
    for (struct nodeStruct *temp_node = head;
         temp_node != NULL;
         temp_node = temp_node->next) {
        if (temp_node->item == item) {
            return temp_node;
        }
    }
    return NULL;
}

在第二个代码中,您在
内有无条件
返回
,而
返回临时节点语句应该保留在
else
块中,否则在第一次迭代之后,无论是否找到项,它都将返回。谢谢。但当条件满足时,控制是否会再次返回while循环?另外,返回的temp_节点不是在这里被自动视为else条件吗?我真的不理解你的评论,但是你试图反转第一个if,它是
if(this),然后返回;(其他)下一步;(继续)
(else是隐式的)。因此,反向测试是
if(!this),然后{next;continue;}else{return;}