возможно ли создать универсальную функцию для структуры списка в C, которая пересекает список, если вы знаете, что различные типы структур всегда будут иметь поле "next".
Да, как упоминалось ранее;Вы должны быть осторожны, чтобы каждая структура начиналась со следующего поля;поэтому две структуры в вашем посте должны быть переупорядочены следующим образом:
typedef struct _list1 {
list1 *next;
int value;
} list1;
typedef struct _list2 {
list2 *next;
int value;
char *string;
} list2;
Это не чистый код, потому что компилятор может переупорядочивать (и дополнять) поля структуры, но в целом это должно работать.
Возможно ли создать общую функцию void freeList ((void) * list) или что-то похожее на ...
Это возможно, если ваши структуры не относится к неправильной памяти;или они делают, но единообразным (и известным) способом (обратите внимание, что первый случай - это подслучай этого последнего).
Если структуры содержат указатели, указывающие на память, которая должна быть освобождена, фактическипри освобождении структуры функция freeList () также должна освободить указанную память. Несколько решений приходят мне на ум:
1 - Если все разные структуры содержат одинаковую структуру «указателей», процедура может освободить эти указатели единообразным образом, заранее зная, что делать. В таком сценарии можно также использовать поля указателя, которые используются не всеми структурами, а только некоторыми.
2 - Каждый отдельный экземпляр структуры может содержать некоторое вспомогательное поле, описывающеерасположение указателя. Например, сразу после поля «next» другое поле «mempntcnt» может указать, сколько указателей (которые должны быть освобождены) следуют за полем «next». Или этот «mempntcnt» может быть передан в качестве параметра freeList ().
3 - Эта проблема может решаться полностью отделенным механизмом, выходящим за рамки freeList (). Многое зависит от конечного использования: я имею в виду, что для данного (своего рода) связанного списка сначала вызовите процедуру, которая освобождает всю память, на которую ссылается сам список, , а затем освобождает список, вызывая общий список freeList(). В конце концов, если нужны разные структуры, то для них используются разные процедуры ...
Надеюсь, я достаточно ясен ...