A chained hash table is one such that a struct _HashEntry does not store a value. Instead, each struct _HashEntry is a list. The list stores not only the value, but also the key of a key-value pair.
When we insert, we compute the hash value as usual. Once we find the correct slot in table, then add the key-value pair to the list for that slot.
When we lookup, we compute the hash value first to locate the right slot in table. Then, we need to perform a linear search through the list to locate the key that is being looked up. This is why both the key and the value need to be stored in the list.
Deletion is lookup followed by removing a node from the list (if the key is found).
Of course, more complex container data structures that support lookup, insertion and deletion can be used for each slot in the hash table. However, because collisions are supposed to be infrequent, a linked list is often sufficient.