Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中链表的递归搜索函数_C_Search_Recursion_Linked List_Singly Linked List - Fatal编程技术网

C语言中链表的递归搜索函数

C语言中链表的递归搜索函数,c,search,recursion,linked-list,singly-linked-list,C,Search,Recursion,Linked List,Singly Linked List,我做了一个汽车的链表。 我试图做一个递归函数搜索。 这就是我所做的。 出于某种原因,这不起作用。请你解释一下为什么以及如何修复它 CarroPtr Search(CarroPtr head,int num) { printf("Matricula %d\n", num); if (head == NULL) { return NULL; } if (head->matricula == num) { return head-

我做了一个汽车的链表。 我试图做一个递归函数搜索。 这就是我所做的。 出于某种原因,这不起作用。请你解释一下为什么以及如何修复它

CarroPtr Search(CarroPtr head,int num)
{
   printf("Matricula %d\n", num);

   if (head == NULL)
    {
     return NULL;
    }

   if (head->matricula == num)
    {
     return head->nome;
    }
   else
    {
     head = head->next;
    }

  Search(head, num);

}

看来你的意思是

CarroPtr Search(CarroPtr head,int num)
{
    return head == NULL || head->matricula == num ? head : Search( head->next, num );
}
或者,如果您认为在这种情况下,三元运算符的条件更易于阅读(尽管不是必需的),则可以将其括在括号中

对于您的代码,该函数要么尝试返回不同类型的对象,如
head
head->nome
,要么与调用该函数的语句一样不返回任何内容

Search(head, num);

这会导致未定义的行为。

查看底部的
搜索
调用。提示:它返回了一些东西,但您忽略了该结果。很可能它的调用者对该返回值感兴趣,即使调用者本身是通过递归返回的。您并不总是从函数返回值-您应该返回值。此代码是UB,因为它从声明为非voidWhat is
head->nome
?它应该是一个
CarroPtr
,但它看起来更像一个名字。您可能应该使用
返回头而不是
返回头->nome
else
有点多余,因为
if
执行无条件返回。递归调用也是
else
代码的一部分(它仅在执行
else
代码时执行)-即使它不在
else
块中。我解决了这个问题,返回了错误。谢谢你的回归似乎是布尔和卡洛普特的混合。我建议在CarroPtr的主体中使用if,而不是试图在一行中完成这一切,从而使它更清晰:if(head==NULL)returnnull;else return(head->matricula==num?head:Search(head->next,num);@ScottK函数返回CarroPtr类型的指针。可以做的一件事是将条件括在括号中,尽管它不是必需的。@Vlad\u from\u Moscow:我对你的解决方案感到困惑。不会“return head==NULL”)| |…如果head等于NULL,则求值为true?if将短路,因为true | | |任何东西都是true。bool似乎与返回类型不匹配。如果head!=NULL,则计算表达式的另一部分,该部分将按预期返回CarroPtr。我是否缺少某些内容?@ScottK使用了所谓的条件运算符。您是正确的说法是,如果head等于true,那么逻辑OR运算符的第二个操作数将不会被计算。但无论如何,head将被返回,即符号?后的操作数将被返回。感谢来自_Moscow的@Vlad_的澄清。我遗漏了“?”运算符的优先级非常低。现在您已经添加了bra克茨,这让事情更清楚了!谢谢!
Search(head, num);