Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
情報工学実験II実験2 アルゴリズム
(リスト構造とハッシュ)
0.プログラム書ける?
1.アドレスとポインタ
2.構造体
3.構造体とポインタ
4.リスト構造
実験を始める前に...C言語を復習しよう
0.プログラム書ける?
講義を聴いているだけでOK?
言語の要素技術を覚えればOK?
配列
データ型関数
クラス
オブジェクトポインタ
文字列
要素技術
目的のプログラム
?
2
0.プログラム書ける?
講義を聴いているだけでOK?
言語の要素技術を覚えればOK?
配列
データ型関数
クラス
オブジェクトポインタ
文字列
要素技術
目的のプログラム
?データ構造 アルゴリズム
3
0.プログラム書ける?
よく使われるデータ構造やアルゴリズムをパターンとして習得し,目的に応じて使い分ける.
どんなプログラムを書けばよいかを考える...
– プログラムを構成する3要素を意識する.
入力
(内部)処理
出力
プログラム
入力データ
出力データ 4
0.プログラム書ける?
教科書(入門書)やチュートリアルに書かれているサンプルプログラムを書き写す(写経).
– コピー&ペーストは駄目!
– 本1冊分のサンプルプログラムを打ち込んでみるべし.
– いろいろなコンパイルエラーに遭遇しよう.
リファレンスの引き方を覚える.
– その場その場で必要な関数やクラスを調べる能力.
– 標準関数やライブラリを必ずしも全て覚える必要はない.
「プログラムが苦手」と感じる人は...
5
0.プログラム書ける?
目的に応じたデータ構造を考え,処理の手順(アルゴリズム)を考える.
– 「このデータを扱うならリストで」,「この問題は要素間に親子関係があるから木構造で」
デバッガやプロファイラなどのツールを積極的に使う.
– 統合開発環境は開発者の必携ツール
外部ライブラリ等を調べて使う.
– 典型的なソースは自分で書かない方がよいこともある.
性能,信頼性,汎用性,etc.
簡単なプログラムが書けるようになったら...
6
本日の実験で作るプログラム
Federer 11255 Nadal 8845 Murray 8390 Djokovic 7330
Federer11255
Nadal8845
Murray8390
Djokovic7330
next next next next=null
ノード ノード ノード ノード
ルート
7
情報工学実験II実験2 アルゴリズム
(リスト構造とハッシュ)
0.プログラム書ける?
1.アドレスとポインタ
2.構造体
3.構造体とポインタ
4.リスト構造
実験を始める前に...C言語を復習しよう
1.アドレスとポインタ
アドレス: メモリ空間内の住所
0a ・・・
: 1 byte
7f aa 30 00 17 90 2300 12
90
= =
10010000 8 bits9
1.アドレスとポインタ
アドレス: メモリ空間内の住所
・・・
: 1 byte
00 00 00 7b(123(10進数))
整数型aのメモリ領域が確保され,123が格納される.
int型: 4byteのメモリを使用 10
1.アドレスとポインタ
実際に確認してみよう.
11
1.アドレスとポインタ
ポインタ: アドレスを格納する「変数」
int a = 0, b = 00
12ff60a
012ff61
b
???
12ff62
p(ポインタ)
int *p
p = &a0
12ff600
12ff61
12ff6012ff62
012ff60
012ff61
*p = 10012ff6012ff62
10012ff60
012ff61
b = *p + 112ff6012ff62
10012ff60
10112ff61
メモリのアドレス
メモリに格納された値
(ポインタpをint型ポインタとして宣言)
(ポインタpに変数aのアドレスを代入)
(ポインタpが指すアドレスに100を格納)
(ポインタpが指すアドレスに格納されている値に1を足した値を変数bに格納) +1 12
1.アドレスとポインタ
ポインタ: アドレスを格納する「変数」
変数a, bに格納されている値は?
13
1.アドレスとポインタ
void *malloc( size_t size ):指定されたバイト分のメモリ領域を確保する.確保した領域の先頭のアドレスを返す.
sizeof 演算子:指定されたデータ型のメモリ領域サイズを返す.
int型のメモリ領域を確保し,その先頭のアドレスをポインタiに記憶させる.
14
1.アドレスとポインタ
ポインタ: アドレスを格納する変数
...データ型毎に区別しなくてもよいのでは?
データ型毎にメモリ量が異なる
15
情報工学実験II実験2 アルゴリズム
(リスト構造とハッシュ)
0.プログラム書ける?
1.アドレスとポインタ
2.構造体
3.構造体とポインタ
4.リスト構造
実験を始める前に...C言語を復習しよう
Member(member型変数)
2.構造体
構造体:様々なデータ(メンバ)をまとめて扱うデータ型
構造体変数Memberを宣言すると同時に、データ型memberとして定義
↓以降、memberをintやcharと同様に使えるようになる
12ff58
???
name
12ff5c
???
point
12ff60
???
age(char型ポインタ) (int型変数) (int型変数)
17
???
2.構造体
構造体の宣言および利用方法
– メンバはピリオド(.)を用いて指定
bob
12ff58
???
name
12ff5c
???
point
12ff60
???
age
394670
Bobmallocで確保strcpyで格納
(char型ポインタ) (int型変数) (int型変数)
12ff5c
???
12ff60
???100 21
12ff58
???394670
12ff5c
100
12ff5c
394670
Bob
12ff58
394670
18
情報工学実験II実験2 アルゴリズム
(リスト構造とハッシュ)
0.プログラム書ける?
1.アドレスとポインタ
2.構造体
3.構造体とポインタ
4.リスト構造
実験を始める前に...C言語を復習しよう
構造体の最初のアドレスを記憶
12ff60
???
3.構造体とポインタ 構造体を参照するポインタ
– メンバはアロー演算子(->)を用いて指定
member
394670
???
name394674
???
point394678
???
agejohn
(member型ポインタ)
3946a8
???
mallocで確保
mallocで確保
394670
???
394674
???
394678
???394670
strcpyで格納John
3946a8
394670
3946a8
394670
3946a8
John
394674
50
394674
50
394678
19
20
情報工学実験II実験2 アルゴリズム
(リスト構造とハッシュ)
0.プログラム書ける?
1.アドレスとポインタ
2.構造体
3.構造体とポインタ
4.リスト構造
実験を始める前に...C言語を復習しよう
4.リスト構造 リスト構造:
– ノード内に,データ部と次のノードへの参照(ポインタ)を持つデータ構造
Bob 102
Linda294
Mike105
John44
next next next next=null
394670
3946a8
name(char型ポインタ)
394678
102
point (int型変数)
394682
394684
next(member型ポインタ)
394684
3946c8
394688
102
3946a2
abff60
3946a8
Bob
3946c8
Linda
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
Member(member型変数)
Member(member型変数)
abff60
1266fa
12
name(char型ポインタ)
M22
4.リスト構造
リスト構造:構造体を宣言
typedef struct Member{char *name;int point;struct Member *next;
} member;
member型変数
???
???
name(char型ポインタ)
???
???
point(int型変数)
???
???
next(member型ポインタ)
Member型構造体
23
4.リスト構造
リスト構造:最初のノード(=ルート)を作成
– member型ポインタroot:先頭ノードのアドレスを記憶(始めはNULL)
root(member型ポインタ)
394670
???NULL
24
4.リスト構造
リスト構造:最初のノード(=ルート)を作成
– 関数addMemberを実行(リスト先頭のnameとpointを引数とする)
関数addMember (Bob, 102)
root(member型ポインタ)
394670
NULLリスト先頭のpoint
リスト先頭のname
25
4.リスト構造
リスト構造:最初のノード(=ルート)を作成
– member型ポインタcurMemberを宣言→rootの内容(NULL)をコピー
curMember(member型ポインタ)
関数addMember (Bob, 102)
root(member型ポインタ)
394670
NULL
abff60
???NULL
リスト先頭のpointリスト先頭のname
26
4.リスト構造
リスト構造:最初のノード(=ルート)を作成
– member型ポインタnewMemberを宣言
curMember(member型ポインタ)
関数addMember (Bob, 102)
root(member型ポインタ)
394670
NULL
abff60
???NULL
newMember(member型ポインタ)
abff61
???
27
4.リスト構造
リスト構造:最初のノード(=ルート)を作成
– 関数createMemberを実行(リスト先頭のnameとpointを引数とする)
curMember(member型ポインタ)
関数addMember (Bob, 102)
root(member型ポインタ)
394670
NULL
abff60
???NULL
関数createMember (Bob, 102)newMember
(member型ポインタ)
abff61
???
28
4.リスト構造
リスト構造:最初のノード(=ルート)を作成
– member型ポインタnewMemberを宣言→ メモリ領域を確保
curMember(member型ポインタ)
関数addMember (Bob, 102)
root(member型ポインタ)
394670
NULL
abff60
???NULL
newMember(member型ポインタ)
abff61
???
関数createMember (Bob, 102)newMember
(member型ポインタ)
12ff6a
???
Member型構造体
13af61
???13af62
???13af63
???
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
13af61
29
4.リスト構造
リスト構造:最初のノード(=ルート)を作成
– nameと pointに引数, nextにNULLをコピー
curMember(member型ポインタ)
関数addMember (Bob, 102)
root(member型ポインタ)
394670
NULL
abff60
???NULL
newMember(member型ポインタ)
abff61
???
関数createMember (Bob, 102)newMember
(member型ポインタ)
12ff6a
???
Member型構造体
13af61 13af62 13af63
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
13af61??? ??? ???Bob 102 NULL
30
4.リスト構造
リスト構造:最初のノード(=ルート)を作成
– 関数createMemberのnewMemberの内容を、関数addMemberのnewMemberにコピー(関数createMemberの処理終了)
curMember(member型ポインタ)
関数addMember (Bob, 102)
root(member型ポインタ)
394670
NULL
abff60
???NULL
newMember(member型ポインタ)
関数createMember (Bob, 102)newMember
(member型ポインタ)
12ff6a
13af61
Member型構造体
13af61
Bob13af62
10213af63NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
13af61
abff61
???13af61
create!
31
4.リスト構造
リスト構造:最初のノード(=ルート)を作成
– curMemberがNULLの場合・・・
curMember(member型ポインタ)
関数addMember (Bob, 102)
root(member型ポインタ)
394670
NULL
NULLNULL
newMember(member型ポインタ)
abff61
13af61
関数createMember (Bob, 102)newMember
(member型ポインタ)
12ff6a
???
Member型構造体
13af61
Bob13af62
10213af63NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
13af61
abff60
32
NULL
4.リスト構造
リスト構造:最初のノード(=ルート)を作成
– curMemberがNULLの場合・・・
– rootにnewMemberの内容をコピー
関数addMemberの処理終了=最初のノード作成完了
curMember(member型ポインタ)
関数addMember (Bob, 102)
root(member型ポインタ)
13af61
abff60
???NULL
newMember(member型ポインタ)
関数createMember (Bob, 102)newMember
(member型ポインタ)
12ff6a
???
Member型構造体
13af61
Bob13af62
10213af63NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
13af61
abff61
394670
13af6113af61
33
4.リスト構造
リスト構造:最初のノード(=ルート)を作成
– つまり・・・rootに関数createMemberで作った構造体の情報が格納
curMember(member型ポインタ)
関数addMember (Bob, 102)
root(member型ポインタ)
394670
13af61
abff60
???NULL
newMember(member型ポインタ)
abff61
13af61
関数createMember (Bob, 102)newMember
(member型ポインタ)
12ff6a
???
Member型構造体
13af61
Bob13af62
10213af63NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
13af61
Member型構造体
13af61
Bob13af62
10213af63NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
34
4.リスト構造
リスト構造:最初のノード(=ルート)を作成
– つまり・・・rootに関数createMemberで作った構造体の情報が格納
curMember(member型ポインタ)
関数addMember (Bob, 102)
root(member型ポインタ)
394670
13af61
abff60
???NULL
newMember(member型ポインタ)
abff61
13af61
関数createMember (Bob, 102)newMember
(member型ポインタ)
12ff6a
???
Member型構造体
13af61
Bob13af62
10213af63NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
13af61
Member型構造体
13af61
Bob13af62
10213af63NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
add!
35
4.リスト構造
リスト構造:2番目のノードを作成
– member型ポインタcurMemberを宣言→rootの内容(NULL)をコピー
curMember(member型ポインタ)
関数addMember (Linda, 294)
root(member型ポインタ)
394670
13af61
abff60
???13af61
newMember(member型ポインタ)
ea9130
43f701
関数createMember (Linda, 294)newMember
(member型ポインタ)
733578
???
Member型構造体
43f701
Linda43f702
29443f703NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
43f701
Member型構造体
13af61
Bob13af62
10213af63NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
36
4.リスト構造
リスト構造:2番目のノードを作成
– curMemberのnext(=rootのnext)がNULL?
curMember(member型ポインタ)
関数addMember (Linda, 294)
root(member型ポインタ)
394670
13af61
abff60
???13af61
newMember(member型ポインタ)
ea9130
43f701
関数createMember (Linda, 294)newMember
(member型ポインタ)
733578
???
Member型構造体
43f701
Linda43f702
29443f703NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
43f701
Member型構造体
13af61
Bob13af62
10213af63NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
37
4.リスト構造
リスト構造:2番目のノードを作成
– もし、curMemberのnext(=rootのnext)がNULLなら・・・
– curMemberのnextにnewMemberの内容をコピー
curMember(member型ポインタ)
関数addMember (Linda, 294)
root(member型ポインタ)
394670
13af61
abff60
???13af63
newMember(member型ポインタ)
ea9130
43f701
関数createMember (Linda, 294)newMember
(member型ポインタ)
733578
???
Member型構造体
43f701
Linda43f702
29443f703NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
43f701
Member型構造体
13af61
Bob
13af62
102
13af63
NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
43f701
38
4.リスト構造
リスト構造:2番目のノードを作成
– つまり・・・関数createMemberで作った新しい構造体がrootに接続
curMember(member型ポインタ)
関数addMember (Linda, 294)
root(member型ポインタ)
394670
13af61
abff60
???NULL
newMember(member型ポインタ)
ea9130
43f701
関数createMember (Linda, 294)newMember
(member型ポインタ)
733578
???
Member型構造体
43f701
Linda43f702
29443f703NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
43f701
Member型構造体
13af61
Bob
13af62
102
13af63
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
Member型構造体
43f701
Linda43f702
29443f703NULL
point(int型変数)
next(member型ポインタ)
name(char型ポインタ)
43f701
39
4.リスト構造
リスト構造:2番目のノードを作成
– つまり・・・関数createMemberで作った新しい構造体がrootに接続
curMember(member型ポインタ)
関数addMember (Linda, 294)
root(member型ポインタ)
394670
13af61
abff60
???NULL
newMember(member型ポインタ)
ea9130
43f701
関数createMember (Linda, 294)newMember
(member型ポインタ)
733578
???
Member型構造体
43f701
Linda43f702
29443f703NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
43f701
Member型構造体
13af61
Bob
13af62
102
13af63
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
Member型構造体
43f701
Linda43f702
29443f703NULL
point(int型変数)
next(member型ポインタ)
name(char型ポインタ)
43f70143f701
add!
40
4.リスト構造
リスト構造:3番目以降のノードを作成
– curMemberのnext(=rootのnext)がNULL?– nextがNULLになるまでcurMembeを更新
curMember(member型ポインタ)
関数addMember (Mike, 105)
root(member型ポインタ)
394670
13af61
abff60
???13af61
newMember(member型ポインタ)
Member型構造体
13af61
Bob
13af62
102
13af63
43f701
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
Member型構造体
43f701
Linda43f702
29443f703NULL
point(int型変数)
next(member型ポインタ)
name(char型ポインタ)
132910
3dfd00
関数createMember (Mike, 105)newMember
(member型ポインタ)
453578
???
Member型構造体
3dfd00
Mike3dfd01
1053dfd02NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
3dfd00
create!nextがNULLじゃない!
41
4.リスト構造
リスト構造:3番目以降のノードを作成
– curMemberのnext(=rootのnext)がNULL?– nextがNULLになるまでcurMembeを更新
curMember(member型ポインタ)
関数addMember (Mike, 105)
root(member型ポインタ)
394670
13af61
abff60
???13af61
newMember(member型ポインタ)
Member型構造体
13af61
Bob
13af62
102
13af63
43f701
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
Member型構造体
43f701
Linda43f702
29443f703NULL
point(int型変数)
next(member型ポインタ)
name(char型ポインタ)
nextの内容をコピー
43f701
132910
3dfd00
関数createMember (Mike, 105)newMember
(member型ポインタ)
453578
???
Member型構造体
3dfd00
Mike3dfd01
1053dfd02NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
3dfd00
42
4.リスト構造
リスト構造:3番目以降のノードを作成
– curMemberのnext(=rootのnext)がNULL?– nextがNULLになるまでcurMembeを更新
curMember(member型ポインタ)
関数addMember (Mike, 105)
root(member型ポインタ)
394670
13af61
abff60
newMember(member型ポインタ)
132910
3dfd00
関数createMember (Mike, 105)newMember
(member型ポインタ)
453578
???
Member型構造体
3dfd00
Mike3dfd01
1053dfd02NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
3dfd00
Member型構造体
13af61
Bob
13af62
102
13af63
43f701
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
Member型構造体
43f701
Linda43f702
29443f703NULL
point(int型変数)
next(member型ポインタ)
name(char型ポインタ)
nextの内容がNULL!!
43f701
43
4.リスト構造
リスト構造:3番目以降のノードを作成
– curMemberのnextにnewMemberの内容をコピー
curMember(member型ポインタ)
関数addMember (Mike, 105)
root(member型ポインタ)
394670
13af61
abff60
newMember(member型ポインタ)
132910
3dfd00
関数createMember (Mike, 105)newMember
(member型ポインタ)
453578
???
Member型構造体
3dfd00
Mike3dfd01
1053dfd02NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
3dfd00
Member型構造体
13af61
Bob
13af62
102
13af63
43f701
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
Member型構造体
43f701
Linda43f702
29443f703NULL
point(int型変数)
next(member型ポインタ)
name(char型ポインタ)
43f701
3dfd00
44
4.リスト構造
リスト構造:3番目以降のノードを作成
– つまり・・・関数createMemberで作った新しい構造体がリストの最後に接続
curMember(member型ポインタ)
関数addMember (Mike, 105)
root(member型ポインタ)
394670
13af61
abff60
???13af61
newMember(member型ポインタ)
132910
3dfd00
関数createMember (Mike, 105)newMember
(member型ポインタ)
453578
???
Member型構造体
3dfd00
Mike3dfd01
1053dfd02NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
3dfd00
Member型構造体
13af61
Bob
13af62
102
13af63
43f701
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
Member型構造体
43f701
Linda43f702
29443f703NULL
point(int型変数)
next(member型ポインタ)
name(char型ポインタ)
43f701
3dfd00
Member型構造体
3dfd00
Mike3dfd01
1053dfd02NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
45
4.リスト構造
リスト構造:3番目以降のノードを作成
– つまり・・・関数createMemberで作った新しい構造体がリストの最後に接続
curMember(member型ポインタ)
関数addMember (Mike, 105)
root(member型ポインタ)
394670
13af61
abff60
???13af61
newMember(member型ポインタ)
132910
3dfd00
関数createMember (Mike, 105)newMember
(member型ポインタ)
453578
???
Member型構造体
3dfd00
Mike3dfd01
1053dfd02NULL
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
3dfd00
Member型構造体
13af61
Bob
13af62
102
13af63
43f701
name(char型ポインタ)
point(int型変数)
next(member型ポインタ)
Member型構造体
43f701
Linda43f702
29443f7033dfd00
point(int型変数)
next(member型ポインタ)
name(char型ポインタ)
43f701
3dfd00
3dfd
Mik
nam(char型ポ
add!
46
4.リスト構造
リスト構造:ノードを消すとき
– prevMember->next = curMember->next
name:Lindapoint:294
next:NULLnext:ノード3のアドレス
name:Bobpoint:102next:ノード2の
アドレス
name:Mikepoint:105
next:NULL
ノード2のアドレス
curMemberノード1のアドレス
prevMember
ノード2ノード1 ノード3
next:ノード3のアドレス
47