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