Suggest how to allocate and deallocate storage for elements within the hash table itself by linking all unused slots into a free list
Practical implementations that I have seen worked like this:


In a hash table, a slot is either used (contains a hash value and a value), has been never used, or has been used and emptied, and we need to distinguish this. With no additional space if at all possible. 
If the values are pointers, and neither “all bits zero” nor “all bits one” are valid pointers, then we store “all bits zero” or “all bits one” as data to mark a “never used” or “not used anymore” slot. 
If (2) doesn’t work: There are many more possible hash values than slots. Therefore most hash values never happen. We pick two random hash values which we store as the hash value to represent “empty” and “not used anymore” slots. As long as these are not used, fine. If they are used, we pick two different random hash values and modify the table accordingly (number of slots used should be less than the square root of possible hash values). 


I’ve never seen a “free list” being used, because the hash value determines where an entry needs to be stored. Everyone just uses an array.