示例#1
0
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;
}
示例#2
0
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;
}