所以我在一个带链接列表的实验室工作,如果在遍历列表后找不到元素,我必须输出一个错误消息。我的问题是,我是否应该在while循环之后或者在else语句之后放置这个if语句?如果我把它放在其他第二个之后,那么当其他人完成执行时,该功能是否应该结束? 我尝试运行它并且我仍然得到了相同的预期输出,但是我试图找出它最有意义的地方,因为实验室的效率和风格得分。
void AnyList::deleteNode(int deleteData)
{
if (count == 0)
{
cerr << "Cannot delete from an empty list.\n";
}
else
{
Node *current = ptrToFirst;
bool found = false;
if (current->getData() == deleteData)
{
ptrToFirst = current->getPtrToNext();
delete current;
current = NULL;
count--;
found = true;
}
else
{
Node *trailCurrent = current;
current = current->getPtrToNext();
while (current != NULL && !found)
{
if (current->getData() == deleteData)
{
trailCurrent->setPtrToNext(current->getPtrToNext());
delete current;
current = NULL;
trailCurrent = NULL;
count--;
found = true;
}
else
{
trailCurrent = current;
current = current->getPtrToNext();
}
}
//if (!found) <-- Does it make more sense to put it here?
//{
// cerr << "Item to be deleted is not in the list.\n";
//}
}
//if (!found) <-- Or here?
//{
// cerr << "Item to be deleted is not in the list.\n";
//}
}
}
答案 0 :(得分:2)
将if (!found)
块置于可能实际运行的更有限的范围内,有助于读者理解和维护代码。
没有功能的区别(即程序在任何一种方式都做同样的事情)。
不应该是性能差异(使用优化版本)。当current->getData() == deleteData
为true
时,它会设置found
true
,因此无法检查if (!found)
。您的编译器应该足够聪明,可以从if (current->getData() == deleteData)
块控制的语句块的末尾跳过if (!found) { ... }
块,在这种情况下,性能将与`if(!found)是更局部化的范围。
答案 1 :(得分:2)
它不应该有所作为。
请注意,函数的整个后半部分都在else
语句中,如果第一个条件current->getData() == deleteData
未评估为true(如预期的那样),则该语句将运行。您也是通过第一行的count == 0
检查完成的。这很好,但是如果您有多个级别if
/ else
语句,则可能会很难阅读。
而不是将所有内容都放入else
语句中,如下所示:
if (condition) {
// do something
} else
// otherwise, do everything else
}
我建议使用这种风格:
if (condition) {
// do something
return someValue;
}
// otherwise, do everything else
如果第一个if
语句的条件为真,则“否则......”代码将不会运行,因为该函数将立即返回。
这将使您更容易理解程序的范围,哪些括号属于什么,并使您更容易回答问题,例如您提出的问题。