>>221
>それと2度目の while の直前で a = b してるけどこれってなんの為にしてるんですか?

>>222
>色々プログラムを書き換えた時に、消し忘れたんじゃないかな?

まず、list型データは線形リストになっている。
aは新規データ操作、リスト全体へのアクセスに使われ、bがデータを保持する。
bは最初NULLを指し、常に最後に取得したデータを指す、
先入れ後出しなデータ構造になっている。

それは理解してるようだが、
a = b; は、aを無駄に初期化せずに次の処理に入る無駄のない処理だ。

その後のループの終了条件はNULLが来ること。
これは、データ件数が0の場合でも、すべてのデータを処理し終えた場合でも
同じ条件でループを抜けることができる効率的な方法だ。

ソースコードでは malloc()に失敗した場合のコードが省かれてるが、
普通はmalloc()に失敗した場合もデータ取得の終了条件になる。
するとaはデータを正しく指さなくなる。
だから確実にデータを保持しているbを代入しなければならない。

データをどの変数が管理するのかをきちんと決めてそれを維持するようにする事が、
錯誤のない、例外が発生しないプログラミングをするために必要だ。