ポインタを使った 連結リストの動作 INSERT(x,p,L)の例 (一部) 磯 直行 2009年5月5日 連結リストによる INSERT( x,p,init ) p init 30 x 48 40 50 NULL 初期状態 →いまからポインタpが指すセルの次に 変数xの値のセルを追加したい 2 連結リストによる INSERT( x,p,init ) p init 30 x 48 40 50 NULL temp セルのメモリを確保(malloc関数を呼び出す) 型変換してセルを構成して(struct cell *を使う) 一時保存用ポインタtempに保存 3 連結リストによる INSERT( x,p,init ) p init 30 x 48 40 50 NULL temp pが先頭のポインタかどうかを調べる →ここではinit≠pとして話を進めるが, init=pの場合は各自考えよ 4 連結リストによる INSERT( x,p,init ) p init 30 x 48 40 50 NULL temp pが指すセルの次のポインタを tempが指すセルの次のポインタへ代入 →ポインタtempが指すセルの次のセルが同じになる 5 連結リストによる INSERT( x,p,init ) p init 30 x 48 40 50 NULL temp pが指すセルの次のポインタを tempが指すセルの次のポインタへ代入 →tempが指すセルとpが指すセルが同じセルを指す 6 連結リストによる INSERT( x,p,init ) p init 30 x 48 40 × 50 NULL temp tempをポインタpの次のポインタとして代入 →ポインタpの次のセルが変わり, ポインタpの次のセルはtempになる 7 連結リストによる INSERT( x,p,init ) p init 30 x 48 40 50 NULL temp 48 tempが指すセルにxの値を代入 8 連結リストによる INSERT( x,p,init ) p init 30 x 48 48 40 temp 完成! 保存されているデータ数に関係なく いつも同じ回数の処理で終わって速いぞ! 50 NULL (横一列に伸ばしてみればよくわかる!) 先頭のポインタinitは変更がないので INSERT関数はinitを返す 9 配列を使った リストの動作 INSERT(x,p,A)の例 (一部) 磯 直行 2009年5月5日 配列による INSERT(x,p,A) p n 4 10 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 10 20 30 40 50 60 70 80 90 ・・・ 11 48 初期状態(現在のデータ数n=10個) →いまから変数pに保存された番号のセルの次に値xのセルを追加したい 配列による INSERT(x,p,A) p n temp 4 10 10 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 48 10 20 30 40 50 60 70 80 90 注目するセルの番号を保存する変数tempへnを代入 (n=temp+1となる場所を探す) ・・・ 12 配列による INSERT(x,p,A) p n temp 4 10 10 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 48 10 20 30 40 50 60 70 80 90 ・・・ pとtempと比較して配列の最後または途中に追加するのかを判定 →ここではp=temp+1でないので途中に追加するときを考える 13 (最後に追加するのは容易にできる) 配列による INSERT(x,p,A) p n temp 4 10 9 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 48 10 20 30 40 50 60 70 80 90 注目するセルを1つ戻す(tempにtemp-1を代入) ・・・ 14 配列による INSERT(x,p,A) p n 4 10 temp:いま注目しているセルの番号を 9 保存している変数 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 48 10 20 30 40 50 60 70 80 90 保存されている最後のセルを1つ後ろへ代入して空きを1つ作る ・・・ 15 配列による INSERT(x,p,A) p n temp 4 10 9 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 48 10 20 30 40 50 60 70 80 90 pとtempと比較(2回目) →p=temp+1でないので繰り返す ・・・ 16 配列による INSERT(x,p,A) p n temp 4 10 8 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 48 10 20 30 40 50 60 70 80 90 注目するセルを1つ戻す(tempにtemp-1を代入)(2回目) ・・・ 17 配列による INSERT(x,p,A) p n temp 4 10 8 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 48 10 20 30 40 50 60 70 80 90 セルを1つ後ろへ代入して空きを1つ移動(3回目) ・・・ 18 配列による INSERT(x,p,A) p n temp 4 10 8 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 48 10 20 30 40 50 60 70 80 90 pとtempと比較(3回目) →p=temp+1でないので繰り返す ・・・ 19 配列による INSERT(x,p,A) p n temp 4 10 7 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 48 10 20 30 40 50 60 70 80 90 注目するセルを1つ戻す(tempにtemp-1を代入)(3回目) ・・・ 20 配列による INSERT(x,p,A) p n temp 4 10 7 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 48 10 20 30 40 50 60 70 80 90 セルを1つ後ろへ代入して空きを1つ移動(3回目) ・・・ 21 配列による INSERT(x,p,A) p n temp 4 10 7 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 48 10 20 30 40 50 60 70 80 90 pとtempと比較(4回目) →p=temp+1でないので繰り返す ・・・ 22 配列による INSERT(x,p,A) p n temp 4 10 6 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 48 10 20 30 40 50 60 70 80 90 注目するセルを1つ戻す(tempにtemp-1を代入)(4回目) ・・・ 23 配列による INSERT(x,p,A) p n temp 4 10 6 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 48 10 20 30 40 50 60 70 80 90 セルを1つ後ろへ代入して空きを1つ移動(4回目) ・・・ 24 配列による INSERT(x,p,A) p n temp 4 10 6 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 48 10 20 30 40 50 60 70 80 90 pとtempと比較(5回目) →p=temp+1でないので繰り返す ・・・ 25 配列による INSERT(x,p,A) p n temp 4 10 5 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 48 10 20 30 40 50 60 70 80 90 注目するセルを1つ戻す(tempにtemp-1を代入)(5回目) ・・・ 26 配列による INSERT(x,p,A) p n temp 4 10 5 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 48 10 20 30 40 50 60 70 80 90 セルを1つ後ろへ代入して空きを1つ移動(5回目) ・・・ 27 配列による INSERT(x,p,A) p n temp 4 10 5 0 1 2 3 4 5 6 7 8 9 10 11 A 0 x 48 10 20 30 40 50 60 70 80 90 pとtempと比較(6回目) →p=tempとなり,挿入位置を発見! ・・・ 28 配列による INSERT(x,p,A) p n temp 4 10 5 0 1 2 3 4 5 6 7 8 9 10 11 A 0 10 20 30 40 48 50 60 70 80 90 x 48 変数xを配列のtempの場所に代入 ・・・ 完成! でも,データがたくさんあったら やたら遅いぞ! 29 パラパラマンガにするには 1.このパワーポイントを印刷するときに次の設 定にして印刷せよ. ・「印刷対象」を「配布資料」に設定 ・「1ページ当たりのスライド」を6~9に設定 (スライドに枠をつけると良い) 2.枠にそってはさみで切り取る. 3.大型クリップで挟んでパラパラマンガ完成 30
© Copyright 2024 ExpyDoc