Есть несколько способов подойти к этому. Этот ответ подробно описывает некоторые из них.
Использование void *
После того, как все будет работать и протестировано, вы можете подойти к этому только одним способом: вместо связного Book *
или Student *
вы можете изменить свой связанный список. Тогда все функции управления связанными списками могут быть одинаковыми (добавление узлов, обход списка, удаление узлов), и вам, программисту, придется помнить, какие вещи хранятся в каждом списке.
Если вы сделаете это, я бы предложил упростить функцию для удобства чтения:
void list_delete(list *head) {
while (head) {
list *temp = head->next;
free(head->data);
free(head);
head = temp;
}
}
void free_all_lists()
{
for( i = 0; i < MAX_SIZE; i++ ) {
list_delete(table[i]);
table[i] = NULL;
}
}
Также обратите внимание, что data
каждого узла в этой схеме считается указателем, который выделен отдельно и поэтому отдельно освобожден.
Не беспокойся об этом
Другой вариант - просто убедиться, что код работает, и не беспокоиться о дублировании. Если код относительно прост, штраф (с точки зрения сложности, усилий по обслуживанию и размера кода) также будет относительно небольшим.
Используйте C ++
Шаблонные контейнеры являются важной частью языка и стандарта C ++ и обычно используются только для такого рода приложений.