Предполагая, что вы управляете экземпляром System
нормально (большое предположение, поскольку я не могу увидеть этот код), у вас есть гигантская дыра в распределении памяти temp
с последующим жестким return 0
в состоянии, гдепроверка "конструктор" не проходит.Более конкретно:
Module *temp = malloc(sizeof(Module)); // memory allocated here...
Module *current;
temp->next = NULL;
if ([any of the constructors are invalid])
return 0; // and leaked here.
Это может быть так же просто, как обмен чека.Очевидно, что другой код, который должен освободить динамические выделения, также должен быть рассмотрен и оценен.
Более простой подход
Код добавления узла сложный и это не должно быть.В конце концов, все, что вам действительно нужно, это найти место, где находится ваш новый узел.
- Если слот в таблице пуст, это первый узел в этом списке.
- Если слот в таблице НЕ пуст, найдите отсортированное местоположение и вставьте его туда..
Оба из них могут быть выполнены с помощью одного цикла while с помощью указателя на указатель, где указанная сущность содержит адрес указателя, который будет содержатьновый узел в или из вышеперечисленных случаев, и в качестве бонуса хирургическая вставка - это буквально два задания.
Это сделано так.Обратите внимание, что большая часть этого кода просто делает объект Module
безопасным.Фактическая вставка - это всего лишь один цикл while и несколько назначений указателей.Предполагается, что таблица в System
изначально содержит NULL-записи:
int addMod(System *system, const char *text, int num1, int num2, int index)
{
// allocate new node here
Module *temp = malloc(sizeof *temp);
if (temp == NULL)
{
perror("Failed to allocate new Module");
return 0;
}
size_t len = strlen(text);
temp->text = malloc(len + 1);
if (temp->text == NULL)
{
perror("Failed to allocate module name");
free(temp);
return 0;
}
// finish copying member data
memcpy(temp->text, text, len);
temp->text[len] = 0;
temp->num1 = num1;
temp->num2 = num2;
// now find where it belongs, and set next appropriately
Module **pp = system->modules + index;
while (*pp && system->compare(temp, *pp) <= 0)
pp = &(*pp)->next;
temp->next = *pp;
*pp = temp;
return 1;
}
Поймите, что это получается из того, как я думаю ваш System
тип выглядит так, как он никогда не был представлен:
typedef struct System
{
Module *modules[MAX_MODULES];
int (*compare)(const Module* lhs, const Module *rhs);
} System;
Я вполне уверен, что это похоже на это.Конечно, вам придется адаптироваться, если это не так.Я предлагаю вам просмотреть это и пройти через это в отладчике.Ничто не заменит его в прямом эфире.
Удачи.