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 ishead->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);