基本情報技術者 学習ページ|科目B・アルゴリズムとプログラミング

データ構造を動かす

配列、リスト、スタック、キュー、木は、値をどこに置き、どの順で取り出すかがポイントです。このページでは、データ構造を擬似言語で操作し、添字やポインタに相当する番号の変化を追えるようにします。

一次元配列を操作

一次元配列では、要素番号と値の対応を崩さないことが基本です。挿入や削除を配列上で表すときは、値をずらす向きによって上書きの有無が変わります。

後ろへ一つずつずらす処理では、末尾側から更新します。前から更新すると、元の値を読む前に書き換えてしまうことがあります。コピー元を残す順序を確認します。

配列の移動は、元の値を消さない向きで行う。

二次元配列を読む

二次元配列a[i, j]では、iを行番号、jを列番号として読みます。行ごとの合計なら外側で行、内側で列を動かす形が分かりやすいです。

処理を追うときは、今どの行と列を見ているかを組で記録します。添字の順序を入れ替えると別の要素を参照するため、空欄では特に注意します。

表の左端に行番号、上端に列番号を書いておくと参照位置が安定します。

二次元配列は行番号と列番号を組で追う。

リストはつながりを見る

単方向リストは、各要素が次の要素を示す情報を持つ構造です。擬似言語では、値の配列と次の要素番号を持つ配列に分けると、クラスを使わずに表せます。

探索では先頭の要素番号からnextをたどり、未定義に到達すると終了します。リストは物理的な配列順より、次にどこへ進むかが重要です。

途中のpの値を並べると、たどった節の順序をそのまま確認できます。

リストは配列上の位置より、次の要素へのつながりを見る。

スタックとキュー

スタックは後に入れたものから取り出すLIFO、キューは先に入れたものから取り出すFIFOです。スタックでは追加位置を表す変数、キューでは先頭位置と末尾位置を表す変数を追います。

問題文でpushやpopという名前を使わなくても、末尾への追加と末尾からの削除ならスタック型の動きだと判断できます。

スタックはLIFO、キューはFIFOで取り出す。

木は左右をたどる

2分木では、一つの節から左右二つまでの子へ進みます。2分探索木では、左側に小さい値、右側に大きい値を置く規則を使って探索範囲を絞ります。

配列で木を表すときは、各節の値と左の子番号、右の子番号を別々の配列に持たせられます。探索経路を順に書くと、比較の流れが見えます。

各比較のたびに現在の節番号も記録すると、経路と値を混同しにくくなります。

2分探索木は比較結果で左か右の一方へ進む。

本番の形で解いてみる

科目Bの形: プログラム(擬似言語)を読んで解答群から選ぶ(このページのために作った問題)

次のプログラム中の【a】に入れる正しい答えを、解答群の中から選べ。関数rowTotalは3行4列の整数型二次元配列mと行番号rを受け取り、r行目の4要素の合計を返す。要素番号は1から始まる。

 1○整数型: rowTotal(整数型の二次元配列: m, 整数型: r)
 2  整数型: total ← 0
 3  整数型: j
 4  for (j を 1 から 4 まで 1 ずつ増やす)
 5    total ← total + a
 6  endfor
 7  return total
  1. a: m[r, j]
  2. a: m[j, r]
  3. a: m[r, r]
  4. a: m[j, j]
  5. a: j
答えと解説を見る

正解: a: m[r, j]

r行目を固定し、列番号jだけを1から4まで変えます。したがって加える要素はm[r, j]です。

まちがえやすい点: 行と列を逆にしてm[j, r]としない。

科目Bの形: プログラム(擬似言語)を読んで解答群から選ぶ(このページのために作った問題)

次のプログラム中の【a】、【b】に入れる正しい答えの組合せを、解答群の中から選べ。配列valueは節の値、配列nextは次の節の要素番号を表し、未定義は次の節がないことを表す。関数listSumは、headで示す節から順に値の合計を返す。

 1○整数型: listSum(整数型の配列: value, 整数型の配列: next, 整数型: head)
 2  整数型: total ← 0
 3  整数型: p ← head
 4  while (p ≠ 未定義)
 5    total ← total + a
 6    p ← b
 7  endwhile
 8  return total
  1. a: value[p] b: next[p]
  2. a: value[head] b: next[p]
  3. a: value[p] b: next[head]
  4. a: next[p] b: value[p]
  5. a: p b: p + 1
答えと解説を見る

正解: a: value[p] b: next[p]

現在の節はpで示されるので、加える値はvalue[p]です。次の節へ進むには、その節が保持するnext[p]をpへ代入します。

まちがえやすい点: 配列上で隣の要素へ進むのではなく、next[p]で示された節へ進む。

科目Bの形: プログラム(擬似言語)を読んで解答群から選ぶ(このページのために作った問題)

配列value、left、rightで2分探索木を表す。left[i]とright[i]はそれぞれ節iの左の子と右の子の節番号で、子がないときは未定義である。次のsearchPathを、value={50, 30, 75, 20, 40, 60, 90}、left={2, 4, 6, 未定義, 未定義, 未定義, 未定義}、right={3, 5, 7, 未定義, 未定義, 未定義, 未定義}、root=1、target=60で呼び出したとき、出力される値の並びとして正しいものを選べ。

 1○論理型: searchPath(整数型の配列: value, 整数型の配列: left, 整数型の配列: right, 整数型: root, 整数型: target)
 2  整数型: p ← root
 3  while (p ≠ 未定義)
 4    value[p] を出力する
 5    if (value[p] = target)
 6      return true
 7    elseif (target < value[p])
 8      p ← left[p]
 9    else
10      p ← right[p]
11    endif
12  endwhile
13  return false
  1. 50,30,40
  2. 50,75,60
  3. 50,75,90
  4. 50,30,20
  5. 50,60
答えと解説を見る

正解: 50,75,60

60は50より大きいので右の75へ進みます。次に60は75より小さいので左の60へ進み、一致して終了します。

まちがえやすい点: 値の大小で左右を決め、配列の要素番号順には進まない。

基本情報の学習ページ

ほかの学習ページの一覧と、2択の用語カード(750語)は、基本情報技術者のページにあります。

基本情報技術者のページへ →

このページの内容は、IPA「基本情報技術者試験 シラバス Ver.9.2」(2026年1月公表)と試験要綱Ver.5.6の範囲にもとづきます(2026年10月確認)。IPAは2027年度春ごろから新しい試験制度に移る予定です。