Why did we declare the table as list_t **table? We don't know up front
how big we want the table to be. Therefore, we need to make the table a
dynamic array. Remember that an array is just a big block of memory and is
basically synonymous with a pointer (see the SparkNotes on arrays
and pointers. What we have is a pointer to a pointer
to
a
linked list; thus list_t **table.

Functions

What basic operations do we need to be able to perform with our hash tables?:
1) We need to be able to create a table.
2) We need to be able to hash; thus we need a hash function.
3) We need to be able to free a table.
4) We need to be able to insert into them.
5) We need to be able to lookup an element in them.
That should do it for a basic implementation.

1. Creation. We need to be able to create a hash table, something like: