【问题标题】:Recursive Search Function for a Linked List in CC中链表的递归搜索函数
【发布时间】:2017-11-23 15:34:57
【问题描述】:

我制作了汽车的链接列表。 我正在尝试做一个递归函数搜索。 这就是我所做的。 由于某种原因,这不起作用。请你解释一下为什么以及如何解决它?

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

}

【问题讨论】:

  • 查看底部的Search 调用。提示:它返回了一些东西,但你忽略了那个结果。很可能它的调用者对该返回值感兴趣,即使调用者本身就是通过递归
  • 你并不总是从你的函数中返回一个值——你应该这样做。
  • 这段代码是 UB,因为它退出了声明为非 void 的函数
  • 什么是head->nome?它应该是CarroPtr,但它看起来更像是一个名字。您可能应该使用return head; 而不是return head->nome;else 有点多余,因为 if 会无条件返回。递归调用也是else 代码的一部分(仅在执行else 代码时才会执行)——即使它不在else 块中。
  • 我解决了这个问题,返回的错误。谢谢

标签: c search recursion linked-list singly-linked-list


【解决方案1】:

你的意思好像是下面这个

CarroPtr Search(CarroPtr head,int num)
{
    return head == NULL || head->matricula == num ? head : Search( head->next, num );
}

如果您认为在这种情况下更易读(尽管不是必需的),也可以将三元运算符的条件括在括号中。

CarroPtr Search(CarroPtr head,int num)
{
    return ( head == NULL || head->matricula == num ) ? head : Search( head->next, num );
}

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

Search(head, num);

导致未定义的行为..

【讨论】:

  • 您的返回似乎返回了 bool 和 CarroPtr 的混合。我建议通过在 CarroPtr 的主体中使用 if 来使其更清晰,而不是试图在一行中完成所有操作: if (head==NULL) return NULL; else return (head->matricula == num ? head : Search(head->next, num);
  • @ScottK 函数返回 CarroPtr 类型的指针。可以做的一件事是将条件括在括号中,尽管这不是必需的。
  • @Vlad_from_Moscow:我对您的解决方案感到困惑。不会“返回 head == NULL) || ... 如果 head 等于 NULL,则计算结果为 true?然后 IF 将短路,因为 TRUE || 任何内容都为 true。bool 似乎与返回类型不匹配。如果head != null,然后计算表达式的另一部分,它按预期返回 CarroPtr。我错过了什么吗?
  • @ScottK 这里使用了所谓的条件运算符。您说得对,如果 head 等于 true,则不会评估逻辑 OR 运算符的第二个操作数。但无论如何,头将被返回,即符号后的操作数?将被退回。
  • 感谢@Vlad_from_Moscow 的澄清。我错过了'?运算符的优先级很低。现在您已经添加了括号,它使它更加清晰!谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 2021-03-07
相关资源
最近更新 更多