Вы должны освободить указатели памяти индивидуально. Здесь на самом деле нет волшебной пули, вам нужно перебрать связанный список и освободить указатели для каждого узла, а затем, если сам связанный список выделен динамически, вы должны его освободить.
Важно освободить вещи в правильном порядке, чтобы вы не получили висячие указатели . Другими словами, если у вас есть указатель p, который указывает на другой указатель p2, вам нужно обязательно освободить p2, а затем p. Вы не хотите освобождать p, прежде чем освободить p2, потому что, когда вы пытаетесь освободить p2, вы проходите через висячий указатель (например, free (p-> p2), но p уже освобожден).