在循环检查空指针时简化DO

Simplify Do While Loop Checking for Null Pointer

本文关键字:DO 空指针 循环 检查      更新时间:2023-10-16

我有一个我不知道的真正基本问题。我正在使用带有哈希表的链条来存储彼此相撞的节点。我使用do while循环至少打印第一个节点一次,并在存在的情况下继续打印链条节点。但是,为了穿越链式列表,我需要更改下一个循环的节点的地址。无论如何我尝试写这篇文章,我发现自己重复了代码,我试图通过使用此循环来避免。请帮助

    do {
        cout << "Bid id: " << table.at(i)->bidId << " title: " << table.at(i)->title <<
        " fund: " << table.at(i)->fund << " amount: " << table.at(i)->amount << endl;
        if (table.at(i)->next!=nullptr){//check if first node has next node         
             table.at(i) = table.at(i)->next; //change address to the next pointer
        }// how do I avoid repeating my condition below?
    }
    while (table.at(i)->next!=nullptr);

此代码将在循环中复制功能,而无需重复检查检查。

while(true)
{
  cout << /* stuff */ endl;
  auto next = table.at(i)->next;
  if(next)
    table.at(i) = next;
  else
    break;
}

从描述中,您确定在循环浏览它们时要重新分配哈希地图内的值吗?我怀疑此代码可能更适合您的意图/需要更好:

auto current = table.at(i);
while(current)
{
  cout << /* stuff */ endl;
  current = current->next;
}

当您发现自己处于这种情况下时,最好质疑您的前提。在这种情况下,我谈论的是您需要do while循环的假设。

如果您的数据不存在或您的容器是空的,则do while将无法完成这项工作,因为它至少会循环一次。

通常,要通过一系列数据集进行迭代,您需要使用forwhile循环。

如果我正确理解代码,则您需要一个前提条件循环,而不是邮政循环循环,就像您现在一样。例如:

while (table.at(i)) {
    cout << "Bunch of stuff";
    table.at(i) = table.at(i)->next;
}

您可以尝试:

for(auto node = table.at(i)->next;node!=nullptr;node=node->next)
  cout << "Bid id: " << node->bidId << " title: " << node->title;

您可能需要使用适当的方法替换node = table.at(i)->next的位置。

您可以在此处使用 c 11 's 范围。您只想知道,在完成分配之前,value->next不是nullptr。休息全部都是由简单而现代的基于循环的范围

for(auto const& value: table) {
  if (value->next != nullptr) {
    value = value->next;
  }
}

以这种方式更快,更安全

如果您真的想在循环后获得最后一个元素,则可以:

do {
    cout << "Bid id: " << table.at(i)->bidId
         << " title: " << table.at(i)->title
         << " fund: " << table.at(i)->fund
         << " amount: " << table.at(i)->amount << endl;
    if (table.at(i)->next == nullptr){
        break;
    }
    table.at(i) = table.at(i)->next;
} while (true);
// table.at(i) != nullptr && table.at(i)->next == nullptr