This is a common error in this pset. Let's look at these statements and think about what could happen:
node *head = table[hash_index];
if (head -> next != NULL)
Now, let's say that table[hash_index] is null. (This is very likely with a small dictionary or a very large table size.) If it is null, then table[hash_index]->next doesn't exist. ...
Initially you have declared node *table[N] as global pointer.
As you might have already guessed, all global variables/ pointers are set to default values.(In this case, each pointer is set to NULL).
So head = table[hash_index]; // It's still NULL
When you do head->next, you're trying to de-reference NULL which results in seg-fault.
You don't actually assign to p->parents
// TODO: Recursively create blood type histories for parents
p->parents = create_family(generations - 1);
p->parents = create_family(generations - 1); // Still parents, you meant 
You print parents here
print_family(p->parents, generation + 1); // seg fault