ページ 1 / 1
線形リストについておしえてください。
Posted: 2011年11月10日(木) 21:00
by ちなつ
単方向リストでダミーありの場合とダミーなしの場合がありますが
これはどういうことですか?
たとえばどんな感じかお願いします。_ _
Re: 線形リストについておしえてください。
Posted: 2011年11月10日(木) 21:13
by beatle
Re: 線形リストについておしえてください。
Posted: 2011年11月10日(木) 21:20
by ちなつ
返信ありがとうございます。
番兵ですか!
セルなどは関係ないんですか?
Re: 線形リストについておしえてください。
Posted: 2011年11月10日(木) 21:42
by box
ちなつ さんが書きました:
セルなどは関係ないんですか?
何について言及されているのか、よくわからないです。
ところで、ダミーなしのリスト構造の場合、リストの先頭(あるいは末尾の場合もあるかも)に
挿入しようとする際、「挿入したノードを新たな先頭(あるいは末尾)とする」という、
ちょっと特別な処理が入ります。
一方、ダミーありの場合は、実質的な先頭(あるいは末尾)であってもその前(あるいは後ろ)にダミーがあるわけですから、
とにかくリスト構造の「途中に」挿入することだけを考えればよい、というメリットがあります。
Re: 線形リストについておしえてください。
Posted: 2011年11月10日(木) 21:47
by beatle
「セル」ってなんのことでしょうか?
ドラゴンボールのキャラクタ、エクセルのマス目、細胞など色々意味があります。
仮に、ちなつさんが
http://dixq.net/forum/viewtopic.php?f=3&t=9483
の若槻さんまたは若月さんと同一人物だと仮定すれば、セルは
コード:
struct cell {
struct cell *next;
int data;
};
のことですね。
この場合のセルってのは、要するに「リストの要素1つ分」のことです。
番兵ってのは、使わないダミーのセルをリストの最後尾に置いておくことです。
まずは番兵を使わない場合を想像しましょう。
コード:
struct slist {
struct cell* head;
};
struct slist list;
このリストlistの場合、リストに入っている要素の数が0のとき、list.headをNULLにするのが一般的だと思います。
リストに1つ以上の要素が入ってるとき、list.headは先頭の要素(セル)へのポインタを保持するようにします。
こうすると、リストが空かどうかで、list.headがNULLかそうでないかが変わるので、
いろいろな場所で if (list.head == NULL) { ... } else { ... } などと場合分けしなければ
なりません。
次に番兵を使う場合、リストには初めから一つ、ダミー要素を入れておきます。
そして、リストに要素を追加するときはダミー要素より前に追加するようにします。
こうすると、list.headは絶対にNULLにならず、list.headは常に
「ダミー要素を末尾とするセルの列」
を指し示すことになります。
よって、ifで場合分けする必要がなくなるのです。
これが番兵。
と、書いてるうちにboxさんに先を越されてしまいましたが、せっかく書いたので投稿。
Re: 線形リストについておしえてください。
Posted: 2011年11月11日(金) 00:48
by ちなつ
詳しい説明ありがとうございました!