Developer

【基本情報技術者試験】データ構造3 ~リスト~
2022.11.29
Lv1

【基本情報技術者試験】データ構造3 ~リスト~

今回は【基礎理論(アルゴリズム)編】リストについて紹介します。
この記事では、リストの特徴を学んだあとに配列との違いについても説明していきたいと思います。
配列がまだ不安な方はこちらの記事で見直しをしてから学習していきましょう!


リストについて

リストは、それぞれのデータに“次のデータへの宛先情報”を加えた状態で管理するデータ構造になっています。
宛先情報を辿ることで、1番目のデータから順番に各要素にアクセスすることができるんですね!

まずはイラストでイメージを固めておきましょう。

上のイラストのように、各要素は次のデータのアドレス(メモリ上の住所)をポインタ(宛先情報)として保持しているんですね。
また、今回のケースでは、各要素が“次の順番のデータへのポインタ”だけを保持していましたが、実はこのポインタのつけ方が異なるリストがいくつか存在しています。

次のイラストをみながら確認していきましょう。

一番上のリストは単方向リストと呼ばれるもので、それぞれのデータは次の順番のデータへのアドレスのみを保持しています。
このリストの場合は、次に進むことはできても前に戻ることができないんですね…

中段のリストは、環状リストと呼ばれるもので、基本的には単方向リストと変わりません。
しかしながら、リストの終端と先端がつながるようにポインタが設定されているので、1周して元の位置に戻ってくることができます。

一番下のリストは、双方向リストと呼ばれるもので、すべてのデータが前後のデータへのポインタを保持しています。
このリストの場合は、自由に進んだり戻ったりを繰り返すことができます。

 

さて、ここまででリストの特徴についての大まかな説明は終わりになります。
ここから先は配列とリストの違いについて学んでいきましょう。

配列との違いについて

配列の特徴は、“あらかじめ決められた要素数のデータ”を“メモリ上の連続した領域に格納”し、“添え字を用いてデータを管理”する事です。
リストはというと、“ポインタを用いてデータ同士を結び付ける”事で、“メモリ上のバラバラな場所にデータを保管”し、“要素数も任意に変更”できます。

ここで大切なのが、配列とリストではパフォーマンス面に差が生まれるということです。

結論からいうと、配列はデータへのアクセスに強く、リストはデータの挿入・削除に強いという特徴があります。

配列の場合、あるデータにアクセスする際には、インデックス番号を用いる事でピンポイントに要素を指定することができます。
リストの場合は、「1番目のデータ」から「目的のデータ」まで順番にポインタをたどる形でアクセスしなければならないので、
配列に比べて時間がかかります。
だから配列はリストに比べてデータのアクセスに強いんですね。

一方で、連続領域にデータを保管している配列は、要素の挿入や削除の際にデータを少しずつずらしていく作業が必要になります。
リストは、各要素をバラバラな場所に格納して宛先情報だけでデータをつなげているので、挿入や削除を素早く行うことができるんですね。

少し難しいので、次のイラストを参考にしてみてください。

配列の場合

リストの場合

 

配列の場合は、要素数が増えると必要な操作回数も増えてしまいますが、
リストの場合は、どれだけ要素数が増えても一定の操作回数で挿入・削除を行えることになります。

 

それでは最後に、リストと配列の違いを表でまとめておきましょう。

以上でリストの紹介は終わりになります。
これで、リストの特徴と配列との違いについて理解することができましたでしょうか?
ぜひ配列の記事も振り返りながら学習を進めてください。


まとめ

  • リストはポインタを用いてデータを管理する
  • リストには単方向リスト、環状リスト、双方向リストなどの種類がある
  • リストは挿入・削除に強く、配列はデータへのアクセスに強い

演習問題

1.リストに関する次の記述のうち、最も正しいものはどれか?
A.配列に比べてデータへのアクセスを素早く行える
B.添え字を用いてデータへアクセスする
C.先頭の要素よりも終端の要素のほうが早くアクセスできる
D.配列に比べてデータの挿入を素早く行える

2.次のような情報をもつ単方向リストがある。
3番目のデータの値はどれか?
A.東京
B.名古屋
C.大阪
D.沖縄

3.次のような情報をもつ双方向リストが存在する。
4番目のデータとして博多を格納したい。
XとYに入れるべき数字はどれか?

A.20
B.40
C.60
D.80
E.100


前回の演習問題~解答例

1.配列に関する記述として最も正しいものはどれか?
解答:A
解説:
A.配列は添え字を用いてデータを管理します。
B.FIFO形式のデータ構造としてはキューなどがあげられます。
C.ポインタを用いて管理するデータ構造はリストです。

2.a[0,1]+a[2,1]の計算結果として正しいものはどれか?
解答:B
解説:a[0,1]は62, a[2,1]は4を表します。