这部分代码不断抛出错误,"并非所有控制路径都返回值"。我不完全确定如何重写这个,以便我可以修复错误。除了返回之外,这就是我需要这部分代码来做的事情。我应该创建一个我在if / else语句中声明的新变量,然后在结束括号之前返回该变量吗?
node * LList::search(int srchKey)
{
node * p = head;
while (p != NULL)
{
if (p->key == srchKey)
{
return p;
}
else
{
return NULL;
}
p = p->next;
}
}
答案 0 :(得分:3)
如果head
为NULL,search()
将退出而不会到达任何return
语句。返回值将是不确定的。这就是编译器所抱怨的。
如果head
不为NULL,search()
将只检查第一个节点,然后检查return
一个值,它将不会搜索整个列表。因此,return NULL;
语句根本不应该在循环内。它会在遇到不匹配的元素时立即退出search()
,而不是继续到列表中的下一个元素。
这类似于我在Searching array reports "not found" even though it's found中描述的问题。
在执行return NULL;
之前,您应该等到循环结束。如果你到达那里,就意味着找不到正在搜索的项目。
node * LList::search(int srchKey)
{
node * p = head;
while (p != NULL)
{
if (p->key == srchKey)
{
return p;
}
p = p->next;
}
return NULL;
}
答案 1 :(得分:1)
在while循环之后需要另一个return语句。一种可能的代码路径是程序永远不会进入while循环。一个简单的
return NULL;
应该修复它。 编辑:此外,你的循环只会进行一次通过。我会删除(如果p == NULL)块;它没用。我看到你的意图,但实现它的方式就是我上面描述的方式。
答案 2 :(得分:1)
当while
条件为false
时,您没有return
。
如果您没有进入循环,请在return
之外添加while
。
此外,p = p->next;
将永远不会被执行,因为您在到达之前因为if-else
而退出循环。
关于逻辑,在我看来,你根本不需要else
部分。尝试省略它并在例程结束前放置return NULL
。