我有一个非常基本的问题,我无法弄明白。我使用哈希表链接来存储相互冲突的节点。我使用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);
答案 0 :(得分:1)
当你发现自己处于这种情况时,最好质疑你的前提。在这种情况下,我在谈论您需要do while
循环的假设。
如果您的数据可能不在那里或者您的容器是空的,那么do while
将无法完成工作,因为它将至少循环一次。
通常,要迭代数据集合,您需要使用for
或while
循环。
答案 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