free_LIST()

の話。

作るべきもの。

仕様の話としては

リストの先頭を与えると、再帰的にリスト末尾から free() してくれるようなラッパー

は必要だと思う。それがスタックを食い潰す実装になっていたらまた問題があるわけだけれども、そこまで規定してある仕様は滅多にない。「NNN要素まで処理できること」と規定されていれば上出来か*1。
一応、ベタに再起をループへ変換するとこんな感じか。C言語で末尾呼び出しの最適化を規定するのはけっこう難しいな。

static LIST* free_LIST_first(LIST *list) {
  LIST* next;
  assert(list != NULL);
  next = list->next;
  free(list->name);
  free(list);
  return next;
}
void free_LIST(LIST *list) {
  while (list != NULL) {
    list = free_LIST_first(list);
  }
}

教育としては。

C言語は計算科学と関係のない要素が多すぎるし、最初に習うプログラミング言語としてはあまりお勧めできないのかなと思うようになった。計算*機*科学の中のハードウェア教育の一環で教えるのなら最良の選択だと思うのは変わりないけれども。

*1:本当は「〜という条件で」が付いていないとダメなのだけども。