【问题标题】:control reaches end of non-void function (adding a node at tail)控制到达非空函数的末尾(在尾部添加一个节点)
【发布时间】:2021-08-13 10:06:01
【问题描述】:
*SinglyLinkedListNode* insertNodeAtTail(SinglyLinkedListNode* head, int data) {
     SinglyLinkedListNode *t=new SinglyLinkedListNode(data);
     SinglyLinkedListNode *last{head};

     if(head==nullptr)
     {
         head=t;
         return head;
     }
     else if(last->next==nullptr)
     {
        last->next=t;
        last=t;
        return head;
         
     }
     else
     {
         while(last)
         {
             if(last->next==nullptr)
             {
                 last->next=t;
                last=t;
                return head;
                
             }
             last=last->next;
         }
      }
     }

此函数将一个节点添加到链表的末尾。 如果我在 if-else 块之外编写 return 语句,则工作正常,但如上所述,它会给出错误。 为什么?

【问题讨论】:

  • 你想做t->next = nullptr

标签: c++ dsa


【解决方案1】:

消息说至少有一个代码路径缺少return - 请检查您的最后一个else。如果while 存在是因为last==nullptr,则不存在return

【讨论】:

  • 这在技术上不应该发生,但编译器不知道。代码可以重新排列以避免这种情况。在单线程应用程序中,进入最后一个分支并且最后一个为空是不可能的。如果这不小心被线程化,任何事情都可能发生。
  • @Swift-FridayPie:这显然不是严肃的代码——缺少class、模板和裸露的new 告诉我们很多。多线程是您最不必担心的问题。
【解决方案2】:

就静态分析器而言,while(last) 理论上可以退出。如果你不小心从不同的线程重新输入了这个函数,它甚至可能是正确的。

可以重新排列代码以简化流程。你的函数的目的是你必须遍历 next 的值,如果 next 是 nullptr,你必须替换它。 你确定你总是要返回head吗?这看起来像一个错误\错误。

{
    SinglyLinkedListNode *t =new SinglyLinkedListNode(data);
    if(!head) 
        return head = t;

    SinglyLinkedListNode *last{head};
    while (last->next)
        last = last->next;

    // we go here if last->next is nullptr, 
    // earliest case would be head->next == nullptr
    return (last->next = t);
}

无论如何,这个函数在任何路径都会返回一些东西。

PS:我真的希望构造函数看起来像 SinglyLinkedListNode(Data &d) : data(d), next(nullptr) {} 或者你手上会有 UB 和可能的无限循环

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多