[819] Re:長文すみません
投稿者:マスタング
2007/02/20 02:13:25
タイガー改めマスタングです。
私なりに思ったことを書いてみます。
まず思ったのは、自分が少しでも複雑だなと感じる処理を考える場合は、
図を書いてみると理解しやすいです。
掲示板では少々書きづらいので自分なりに紙にでも書いてみてください。
>線形リストif(sagyou->num < fo->next->num)が、他の参考書を見ながら打ってた時
>next->next->...->numという感じで全部比較して見てるのか?となぜか思い
>それで、逐一アドレス表示させるようにしたりして、自分なりに疑問を解消しつつ
>本当に、fo->next->numは、nextだけを見てるのかとまだ疑問だったんですが
>実は言いますと、この投稿フォームに、その疑問を考えながら書いてる間に
>「あれ、これって、for文で回して、単に比較してチェーン変えてるだけだ」
>と、なぜか、その場で気づいたのですが、やはり確認しておこうと思い書きました。
listが数珠つなぎになっていて、forループの中でのfo変数は、
イメージとして、カーソルを表しています。
カーソルが先頭から末尾まで1つずつ各listを指しながら動く感じです。
これは、例えば、for (i = 0; i < num; i++)の、「i」と似ています。
iは、0から(num - 1)まで値を変えながら進んで行きます。
これは、「処理」としては、同じなので抽象化(同じ扱い)ができ、
一般的に、こういったカーソルをiteratorと言います
(若干厳密性はないかもしれないですが、イメージはそんな感じだと思います)。
>free()に関しては、リストでmalloc()を使うのは解るが、それらをfree()にする
>タイミングがよくわからなかったんですが、リストにして結果をはき出したら
>またチェーンでたどってfree()にするのかなとか、まぁ、その、まだまだ
>例題をみながら打ち込みながら理解しつつ、昨日覚えた事を今日忘れるような
>日々つれづれとおくっておりまして、、、
負け組一号さんのサンプルで、startという変数が重要になります。
どこかで(例えば関数で)free処理をするのでしょうが、
start変数は、listの先頭を表していますので、これさえあれば
listにつながっているデータは全てfreeできます。
関数でfreeするなら、引数でstartを渡してあげればOKです。
つまり、どこでfreeするかはユーザの自由ですが、freeするタイミングまで
start変数を管理できていればOKな訳です。
start変数を管理(保持)する方法としては、ある関数内(ローカル)に持ち歩くか、
static変数(あるいは、グローバル変数)などで持っておくかの
どちらかになると思います。
もちろん、別のデータ(構造)内に保持していても同じです。
freeするタイミングは重要ではないと思うのですが、
言えることがあるとすれば、いらなくなった時です。
>ただ、nextポインタがNULLになってるポインタを順次free()していけば出来るのかな
>と思い、試してみます。
これは、違います。
nextポインタがNULLであろうが、NULLでなかろうが、
現在、カーソルが指しているlistをfree()します。
しかし、現在指しているlistをfree()してしまうと、
listに入っているnextの(ポインタの)情報がとれなくなってしまうので、
現在のlistのnextの情報を先にとっておきます。
そして、現在のlistをfree()します。
その処理を現在のカーソルがNULLになるまで繰り返します。
つまり、nextがNULLになるまで繰り返すのです。
まだ不明な点があればいくらでも聞いてください。