Document

ポインタを使った
連結リストの動作
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