## page was renamed from リスト処理
== 線形リスト ==
線形リストは同じ形式のデータが一列に並んだものです。<
>
データの追加や削除が配列と比べて楽に行えます。<
>
真ん中あたりにデータを追加する場合を考えると分かります。
Javaで記述してみましょう。
----
このようなインスタンスを使います。
. {{attachment:list1.png}}
. 1つ目の変数には値を保存します
. 2つ目の変数には次の項目へのリンクを記入します。
3つのインスタンスをつないだ例を示します。
. {{attachment:list2.png}}
. これより先につながっていないことを、'''null'''という値で表します。
'''null'''はシステムで用意されている'''定数'''です。
* 参照型の変数はnullで初期化されます。
* nullはどこも参照していないことを表します。
----
=== 追加 ===
途中にデータを追加するには、リンク2箇所を修正すればよい。
. {{attachment:list3.png}}
----
=== 削除 ===
途中のデータを削除するには、リンク1箇所を修正すればよい。
. {{attachment:list4.png}}
削除されたデータからのリンクが残っていますが、リストをたどってこのデータにたどり着くことはできません。
----
=== サンプル ===
値としてItemクラスのインスタンスを使った例です。
クラス名は List1 としました。
. {{attachment:list1.png}}
属性(インスタンス変数)の型は
. 値にはItemクラスのインスタンスが入るので Item
. リンクには次のデータを記憶するためのオブジェクトすなわち List1のインスタンスが入りますから List1
となります。
{{{#!java
public class List1
{
Item val;
List1 link;
void dispList()
{
List1 x;
x = this;
while(x != null)
{
x.val.disp();
x = x.link;
}
}
public static void main(String[] args)
{
List1 a;
List1 b;
List1 c;
a = new List1();
a.val = new Food("パン", 150, 200.0, 200.0);
b = new List1();
a.link = b;
b.val = new Drink("コーヒー", 120, 250);
c = new List1();
b.link = c;
c.val = new Food("みかん", 100, 150.0, 200.0);
a.dispList();
}
}
}}}
mainメソッドでは、変数a,b,cの3つを用いて図のようなリストを作っています。
. {{attachment:list5.png}}
最後に
. a.dispList();
により、aに対してメソッドdispList()を行っています。
メソッドの動作を追っかけてみましょう。
1. aの値がthisに対応づけられます。
1. x = this; により、thisに入っている値が変数xに代入されます。これはaの値と同じです。
1. 11行目のwhileの条件判定を行います。xには先に作ったリストの参照が入っており、nullではありません。
1. 13行目でx.valすなわちItemインスタンス(値はパン)に対しdisp()を行うことで、この内容を表示します。
1. 14行目でxの値をリンクの値で更新します。この結果xはリストの2番目の項目を指すことになります。
1. 再び11行目のwhileの条件判定を行います。xはリストの2番目の項目を指しており、nullではありません。
1. 13行目でx.valすなわちItemインスタンス(値はコーヒー)に対しdisp()を行うことで、この内容を表示します。
1. 14行目でxの値をリンクの値で更新します。この結果xはリストの3番目の項目を指すことになります。
1. 再び11行目のwhileの条件判定を行います。xはリストの3番目の項目を指しており、nullではありません。
1. 13行目でx.valすなわちItemインスタンス(値はみかん)に対しdisp()を行うことで、この内容を表示します。
1. 14行目でxの値をリンクの値で更新します。リンクの値はnullなのでxの値もnullになります。
1. 再び11行目のwhileの条件判定を行います。xはnullです。
1. whileループを抜け、メソッドの実行も終わります。