Проблема, похоже, в том, что вы не используете free () для освобождения структур node* n
и node* h
. Вам необходимо изменить функцию load () следующим образом:
// Loads dictionary into memory, returning true if successful else false
bool load(const char *dictionary)
{
FILE *file = fopen(dictionary, "r");
char w[LENGTH + 1];
// Check if memory is available
if (file == NULL)
return false;
while(fscanf(file, "%s", w) != EOF)
{
node *n = malloc(sizeof(node));
// Check if memory is available
if (n == NULL)
return false;
n->next = NULL;
strcpy(n->word, w);
int pos = hash(n->word);
node *h = malloc(sizeof(node));
if (h == NULL)
table[pos] = n;
else
{
n->next = table[pos];
table[pos] = n;
}
counter++;
free(n);
free(h);
}
size();
fclose(file);
return true;
}
Кроме того, как отмечено в комментариях выше, я не вижу причин для использования node * h. Вы можете опустить эту часть:
if (h == NULL)
table[pos] = n;
else
{
n->next = table[pos];
table[pos] = n;
}
в эту:
n->next = table[pos];
table[pos] = n;
Более того, функция unload () должна измениться следующим образом:
// Unloads dictionary from memory, returning true if successful else false
bool unload(void)
{
for (int i = 0; i < N; i++)
{
node *ptr = malloc(sizeof(node));
if (ptr == NULL) {
return 1;
}
node *tmp = NULL;
ptr = table[i];
// Free each linked list
while (ptr != NULL)
{
tmp = ptr;
ptr = ptr->next;
free(tmp);
}
}
return false;
}