void FreeHashTable(HashTable table, ValueFreeFnPtr value_free_function) { HWSize_t i; Verify333(table != NULL); // be defensive // loop through and free the chains on each bucket for (i = 0; i < table->num_buckets; i++) { LinkedList bl = table->buckets[i]; HTKeyValue *nextKV; // pop elements off the the chain list, then free the list while (NumElementsInLinkedList(bl) > 0) { Verify333(PopLinkedList(bl, (LLPayload_t*)&nextKV)); value_free_function(nextKV->value); free(nextKV); } // the chain list is empty, so we can pass in the // null free function to FreeLinkedList. FreeLinkedList(bl, LLNullFree); } // free the bucket array within the table record, // then free the table record itself. free(table->buckets); free(table); }
void FreeHashTable(HashTable table, ValueFreeFnPtr value_free_function) { uint32_t i; // loop through and free the chains on each bucket for (i = 0; i < table->num_buckets; i++) { LinkedList bl = table->buckets[i]; HTKeyValue *nextKV; PopLinkedList(bl, (void **) &nextKV); // pop elements off the the chain list, then free the list while (NumElementsInLinkedList(bl) > 0) { value_free_function(nextKV->value); free(nextKV); } // the chain list is empty, so we can pass in the // null free function to FreeLinkedList. FreeLinkedList(bl, NullFree); } // free the bucket array within the table record, // then free the table record itself. free(table->buckets); free(table); }
// our main function; here, we demonstrate how to use some // of the linked list functions. int main(int argc, char **argv) { ExamplePayloadPtr payload; LinkedListPtr list; LLIterPtr iter; int i; // allocate a list list = AllocateLinkedList(); assert(list != NULL); // insert 100 elements for (i = 0; i < 100; i++) { payload = (ExamplePayloadPtr) malloc(sizeof(ExamplePayload)); assert(payload != NULL); payload->num = i; assert(PushLinkedList(list, (void *) payload) == 1); // make sure our list total is correct assert(NumElementsInLinkedList(list) == i+1); } // sort the list in descending order SortLinkedList(list, 0, &ExamplePayloadComparator); // pop off the first element assert(PopLinkedList(list, (void **) &payload) == 1); assert(payload->num == 99); assert(NumElementsInLinkedList(list) == 99); free(payload); // slice off the last element assert(SliceLinkedList(list, (void **) &payload) == 1); assert(payload->num == 0); assert(NumElementsInLinkedList(list) == 98); free(payload); // make an iterator from the head iter = LLMakeIterator(list, 0); assert(iter != NULL); // peek at the current iterator payload LLIteratorGetPayload(iter, (void **) &payload); assert(payload->num == 98); // move the iterator, peek at next payload assert(LLIteratorNext(iter) == 1); LLIteratorGetPayload(iter, (void **) &payload); assert(payload->num == 97); // free the iterator LLIteratorFree(iter); // free the linked list FreeLinkedList(list, &ExamplePayloadFree); return 0; }