简化循环检查空指针时的操作

时间:2018-02-08 21:00:55

标签: c++ list

我有一个非常基本的问题,我无法弄明白。我使用哈希表链接来存储相互冲突的节点。我使用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);

6 个答案:

答案 0 :(得分:1)

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

如果您的数据可能不在那里或者您的容器是空的,那么do while将无法完成工作,因为它将至少循环一次。

通常,要迭代数据集合,您需要使用forwhile循环。

答案 1 :(得分:1)

此代码将复制循环中的功能,而不会将检查重复为NULL。

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;
}

答案 2 :(得分:0)

如果我正确理解了代码,你需要一个前置条件循环,而不是后置条件循环,就像你现在所做的那样。例如:

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

答案 3 :(得分:0)

您可以尝试:

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来获取第一个条目的链接。

答案 4 :(得分:0)

您可以在此处使用基于的 C ++ 11 范围。您只想知道value->next在执行作业之前不是nullptr。休息全部由简单和现代 range based for loop

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

这种方式更快更安全

答案 5 :(得分:0)

如果您真的希望能够在循环后获得最后一个元素,您可以这样做:

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