The bug is in your unload function. You return after cleaning up just 1 list. But you have 26 of them to get through. The outer loop is also out of bounds. You iterate up to N + 1 for some reason.
// Unloads dictionary from memory, returning true if successful, else false
for (int i = 0; i < (N + 1); i++) // Out of bounds. Should ...
I'm sorry, but this code is not passing valgrind.
~/go/test/pset5/ $ valgrind ./speller small
==223== Memcheck, a memory error detector
==223== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==223== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==223== Command: ./speller small