Problem :
How would we augment our hash table such that it stores information on
students? We'd still like to look up a student's name to find them, but
we'd then immediately have access to information about them, such as a
letter grade, their graduation year, etc.

All we'd have to do is modify the linked list structure to include all that information:

Problem :
If something happened to your code and you accidentally lost your hash
function after having stored a lot of data in the hash table, how could
you still search for a specific string? What would the search efficiency
now be?

Just like in the count function above, you could do a linear search of the
hash table until you found what you were looking for. But this is
incredibly inefficient when compared to the normal hash lookup efficiency of
O(1). Since we're essentially doing a linear search through n strings,
the efficiency of this strategy is O(n).

Problem :
Linear probing is another method for collision avoidance. With linear
probing, if a collision occurs, you sequentially look from the current
place in the hashtable for the next open spot, and store the string there.
What disadvantage does this method have for an insertion in terms of
efficiency?

Linear probing insertion could be O(n), while separate chaining is O(1)
as you always insert at the beginning of the list.