int HTIteratorNext(HTIter iter) { if (!iter->is_valid) return 0; // progress to next element in ll if possible if (iter != NULL && LLIteratorHasNext(iter->bucket_it)) return LLIteratorNext(iter->bucket_it); // search until finds non-empty chain or invalid bucket LLIter oldListIter = iter->bucket_it; LinkedList nextChain; do { iter->bucket_num++; if (iter->bucket_num >= iter->ht->num_buckets) { iter->is_valid = false; return 0; } nextChain = iter->ht->buckets[iter->bucket_num]; } while (NumElementsInLinkedList(nextChain) == 0); // reset list iterator LLIteratorFree(oldListIter); iter->bucket_it = LLMakeIterator(nextChain, 0UL); return 1; }
bool LLIteratorNext(LLIter iter) { // defensive programming Verify333(iter != NULL); Verify333(iter->list != NULL); Verify333(iter->node != NULL); // Step 7: if there is another node beyond the iterator, advance to it, // and return true. if (LLIteratorHasNext(iter)) { iter->node = iter->node->next; return true; } // Nope, there isn't another node, so return failure. return false; }