控件到达非void函数的末尾(在尾部添加一个节点)


*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-检查您的最后一个else。如果因为last==nullptr而存在while,则不存在return

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

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

{
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和可能的无限循环

最新更新