アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

78
アアアアアアアアアアアア アアアア 11-3 アアアアアアアアアアアア 「」 アアアアアア アアアア アア アアアアアアア アアアア

Upload: zeke

Post on 22-Feb-2016

59 views

Category:

Documents


0 download

DESCRIPTION

アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」. 横浜国立大学 理工 学部 数物・電子情報系学科 富井尚志. リストのオペレータ 生成 表示(走査) 挿入 削除. p. key. 21. key. 22. key. 23. next. next. next. NULL. リストのオペレータ 生成 表示(走査) 挿入 削除. p. key. 21. key. 22. key. 23. next. next. next. NULL. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

アルゴリズムとデータ構造補足資料 11-3「線形リストのオペレータ」

横浜国立大学理工学部 数物・電子情報系学科富井尚志

Page 2: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p key

next

key

next NULLkey

next

21 2322

リストのオペレータ1. 生成2. 表示(走査)3. 挿入4. 削除

Page 3: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p key

next

key

next NULLkey

next

21 2322

リストのオペレータ1. 生成2. 表示(走査)3. 挿入4. 削除

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n");}

Page 4: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p

key

next

key

next NULLkey

next

21 2322

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n");}

画面出力

Page 5: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p

key

next

key

next NULLkey

next

21 2322

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n");}!=NULL

画面出力

Page 6: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p

key

next

key

next NULLkey

next

21 2322

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n");}

<21>画面出力

Page 7: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p

key

next

key

next NULLkey

next

21 2322

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n");}

<21>画面出力

Page 8: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p

key

next

key

next NULLkey

next

21 2322

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n");}

<21>画面出力

!=NULL

Page 9: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p

key

next

key

next NULLkey

next

21 2322

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n");}

<21> <22>画面出力

Page 10: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p

key

next

key

next NULLkey

next

21 2322

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n");}

<21> <22>画面出力

Page 11: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p

key

next

key

next NULLkey

next

21 2322

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n");}

<21> <22>画面出力

!=NULL

Page 12: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p

key

next

key

next NULLkey

next

21 2322

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n");}

<21> <22> <23>画面出力

Page 13: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

NULLp

key

next

key

next NULLkey

next

21 2322

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n");}

<21> <22> <23>画面出力

Page 14: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

NULLp

key

next

key

next NULLkey

next

21 2322

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n");}

<21> <22> <23>画面出力

==NULL

Page 15: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

NULLp

key

next

key

next NULLkey

next

21 2322

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n");}

<21> <22> <23>画面出力

Page 16: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

NULLp

key

next

key

next NULLkey

next

21 2322

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n");}

<21> <22> <23>画面出力

走査( scan )とは、一つ一つの要素のキーを見ていくこと。「探索」( search )の際にも使う。

Page 17: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p key

next

key

next NULLkey

next

21 2322

リストのオペレータ1. 生成2. 表示(走査)3. 挿入4. 削除

void insert_after(struct list *x, struct list *p){ x->next = p->next; p->next = x;}

Page 18: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p key

next

key

next NULLkey

next

21 2322

void insert_after(struct list *x, struct list *p){ x->next = p->next; p->next = x;}

x key

next

30

ここに挿入する

Page 19: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p key

next

key

next NULLkey

next

21 2322

void insert_after(struct list *x, struct list *p){ x->next = p->next; p->next = x;}

x key

next

30

この値をコピー

Page 20: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p key

next

key

next NULLkey

next

21 2322

void insert_after(struct list *x, struct list *p){ x->next = p->next; p->next = x;}

x key

next

30

この値をコピー

Page 21: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p key

next

key

next NULLkey

next

21 2322

void insert_after(struct list *x, struct list *p){ x->next = p->next; p->next = x;}

x key

next

30

Page 22: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

福沢さんの番号p樋口さんの番号 野口さんの番号 NULL

福沢 野口樋口

イメージ: 電話連絡網この連絡網では、「各人は、次に連絡を回す相手の電話番号だけ知っている。」「連絡網が切れないように、途中にメンバーを挿入する。」

夏目さんの番号x 夏目

ここに挿入する

Page 23: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

福沢さんの番号p樋口さんの番号 野口さんの番号 NULL

福沢 野口樋口

イメージ: 電話連絡網この連絡網では、「各人は、次に連絡を回す相手の電話番号だけ知っている。」「連絡網が切れないように、途中にメンバーを挿入する。」

夏目さんの番号x樋口さんの番号

夏目

void insert_after(struct list *x, struct list *p){ x->next = p->next; p->next = x;}

この値をコピー

Page 24: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

福沢さんの番号p夏目さんの番号 野口さんの番号 NULL

福沢 野口樋口

イメージ: 電話連絡網この連絡網では、「各人は、次に連絡を回す相手の電話番号だけ知っている。」「連絡網が切れないように、途中にメンバーを挿入する。」

夏目さんの番号x樋口さんの番号

夏目

void insert_after(struct list *x, struct list *p){ x->next = p->next; p->next = x;}

この値をコピー

Page 25: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

福沢さんの番号p夏目さんの番号 野口さんの番号 NULL

福沢 野口樋口

イメージ: 電話連絡網この連絡網では、「各人は、次に連絡を回す相手の電話番号だけ知っている。」「連絡網が切れないように、途中にメンバーを挿入する。」

夏目さんの番号x樋口さんの番号

夏目

void insert_after(struct list *x, struct list *p){ x->next = p->next; p->next = x;}

Page 26: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

福沢さんの番号p夏目さんの番号 野口さんの番号 NULL

福沢 野口樋口

イメージ: 電話連絡網この連絡網では、「各人は、次に連絡を回す相手の電話番号だけ知っている。」「連絡網が切れないように、途中にメンバーを挿入する。」

樋口さんの番号夏目

void insert_after(struct list *x, struct list *p){ x->next = p->next; p->next = x;}

番号の写し順に注意!

Page 27: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

福沢さんの番号p樋口さんの番号 野口さんの番号 NULL

福沢 野口樋口

イメージ: 電話連絡網この連絡網では、「各人は、次に連絡を回す相手の電話番号だけ知っている。」「連絡網が切れないように、途中にメンバーを挿入する。」

夏目さんの番号x 夏目

ここに挿入する

番号の写し順に注意!先に、福沢さんの覚えている樋口さんの電話番号を、メモをとらずに(憶えておかずに)夏目さんの電話番号に書き換えてしまうと。。。

Page 28: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

福沢さんの番号p夏目さんの番号 野口さんの番号 NULL

福沢 野口樋口

イメージ: 電話連絡網この連絡網では、「各人は、次に連絡を回す相手の電話番号だけ知っている。」「連絡網が切れないように、途中にメンバーを挿入する。」

夏目さんの番号x 夏目

番号の写し順に注意!先に、福沢さんの覚えている樋口さんの電話番号を、メモをとらずに(憶えておかずに)夏目さんの電話番号に書き換えてしまうと。。。

Page 29: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

福沢さんの番号p夏目さんの番号 野口さんの番号 NULL

福沢 野口樋口

イメージ: 電話連絡網この連絡網では、「各人は、次に連絡を回す相手の電話番号だけ知っている。」「連絡網が切れないように、途中にメンバーを挿入する。」

夏目さんの番号x 夏目 ?番号の写し順に注意!先に、福沢さんの覚えている樋口さんの電話番号を、メモをとらずに(憶えておかずに)夏目さんの電話番号に書き換えてしまうと。。。樋口さんの電話番号がわからなくなる! ので、連絡網が切れてしまう。

void insert_after(struct list *x, struct list *p){ x->next = p->next; p->next = x;}

Page 30: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p key

next

key

next NULLkey

next

21 2322

リストのオペレータ1. 生成2. 表示(走査)3. 挿入4. 削除

void delete_next(struct list *p){ struct list *q; q = p->next; p->next = q->next; free(q);}

削除がないと、領域を解放しないので、増加しっぱなし。

Page 31: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p key

next

key

next NULLkey

next

21 2322

void delete_next(struct list *p){ struct list *q; q = p->next; p->next = q->next; free(q);}

この要素を削除(領域解放)するq

Page 32: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p key

next

key

next

NULLkey

next

21 23

22

void delete_next(struct list *p){ struct list *q; q = p->next; p->next = q->next; free(q);}

この要素を削除(領域解放)するq

※ 見やすくするために位置をずらしましたが、  メモリ内で確保されている領域が  移動するわけではありません。

Page 33: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p key

next

key

next

NULLkey

next

21 23

22

void delete_next(struct list *p){ struct list *q; q = p->next; p->next = q->next; free(q);}

q

この値をコピー

Page 34: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p key

next

key

next

NULLkey

next

21 23

22

void delete_next(struct list *p){ struct list *q; q = p->next; p->next = q->next; free(q);}

q

この値をコピー

Page 35: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p key

next

key

next

NULLkey

next

21 23

22

void delete_next(struct list *p){ struct list *q; q = p->next; p->next = q->next; free(q);}

q 領域を解放

Page 36: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p key

next NULLkey

next

21 23

void delete_next(struct list *p){ struct list *q; q = p->next; p->next = q->next; free(q);}

Page 37: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

p key

next

key

next

NULLkey

next

21 23

22

void delete_next(struct list *p){ struct list *q; q = p->next; p->next = q->next; /*free(q);*/}

領域解放を忘れると、メモリ内にリンクのない使えない領域が残り続ける。(メモリリーク:メモリ漏れ; プログラムが進むにつれて、だんだんと使えるメモリが減っていく)

必ず、解放しよう!

Page 38: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

福沢さんの番号p樋口さんの番号

野口さんの番号

NULL福沢 野口

樋口

イメージ: 電話連絡網この連絡網では、「各人は、次に連絡を回す相手の電話番号だけ知っている。」「連絡網が切れないように、途中にメンバーを削除する。」

この要素を削除する

Page 39: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

福沢さんの番号p樋口さんの番号

野口さんの番号

NULL福沢 野口

樋口

イメージ: 電話連絡網この連絡網では、「各人は、次に連絡を回す相手の電話番号だけ知っている。」「連絡網が切れないように、途中にメンバーを削除する。」

この要素を削除する

void delete_next(struct list *p){ struct list *q; q = p->next; p->next = q->next; free(q);}

q

Page 40: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

福沢さんの番号p樋口さんの番号

野口さんの番号

NULL福沢 野口

樋口

イメージ: 電話連絡網この連絡網では、「各人は、次に連絡を回す相手の電話番号だけ知っている。」「連絡網が切れないように、途中にメンバーを削除する。」

void delete_next(struct list *p){ struct list *q; q = p->next; p->next = q->next; free(q);}

樋口さんの番号q

この値をコピー

あとで、本部から樋口さんに「あなたは連絡網から削除されました」と電話で伝える(解放する)ために樋口さんの電話番号をメモしておく

Page 41: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

福沢さんの番号p野口さんの番号

野口さんの番号

NULL福沢 野口

樋口

イメージ: 電話連絡網この連絡網では、「各人は、次に連絡を回す相手の電話番号だけ知っている。」「連絡網が切れないように、途中にメンバーを削除する。」

void delete_next(struct list *p){ struct list *q; q = p->next; p->next = q->next; free(q);}

樋口さんの番号q

この値をコピー

Page 42: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

福沢さんの番号p野口さんの番号

野口さんの番号

NULL福沢 野口

樋口

イメージ: 電話連絡網この連絡網では、「各人は、次に連絡を回す相手の電話番号だけ知っている。」「連絡網が切れないように、途中にメンバーを削除する。」

void delete_next(struct list *p){ struct list *q; q = p->next; p->next = q->next; free(q);}

樋口さんの番号q

本部から樋口さんに「あなたは連絡網から削除されました」と電話を入れる(解放する)

Page 43: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

福沢さんの番号p野口さんの番号 NULL

福沢 野口

イメージ: 電話連絡網この連絡網では、「各人は、次に連絡を回す相手の電話番号だけ知っている。」「連絡網が切れないように、途中にメンバーを削除する。」

void delete_next(struct list *p){ struct list *q; q = p->next; p->next = q->next; free(q);}

Page 44: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

リストのオペレータ1. 生成2. 表示(走査)3. 挿入4. 削除struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

Page 45: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD }

p

d

newp

Page 46: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD }

NULLp

d

newp

Page 47: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

NULLp

1d

newp

!=EOD

Page 48: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

NULLp

1d

newp

key

next

Page 49: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

NULLp

1d

newp

key

next

1

Page 50: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

NULLp

1d

newp

NULLkey

next

1

Page 51: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

1d

newp

NULLkey

next

1

Page 52: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

2d

newp

NULLkey

next

1

!=EOD

Page 53: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

2d

newp

NULLkey

next

1key

next

Page 54: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

2d

newp

NULLkey

next

1key

next

2

Page 55: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

2d

newp

NULLkey

next

1key

next

2

Page 56: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

2d

newp

NULLkey

next

1key

next

2

Page 57: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

3d

newp

NULLkey

next

1key

next

2

!=EOD

Page 58: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

3d

newp

NULLkey

next

1key

next

2key

next

Page 59: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

3d

newp

NULLkey

next

1key

next

2key

next

3

Page 60: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

3d

newp

NULLkey

next

1key

next

2key

next

3

Page 61: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

3d

newp

NULLkey

next

1key

next

2key

next

3

Page 62: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

4d

newp

NULLkey

next

1key

next

2key

next

3

!=EOD

Page 63: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

4d

newp

NULLkey

next

1key

next

2key

next

3key

next

Page 64: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

4d

newp

NULLkey

next

1key

next

2key

next

3key

next

4

Page 65: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

4d

newp

NULLkey

next

1key

next

2key

next

3key

next

4

Page 66: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

4d

newp

NULLkey

next

1key

next

2key

next

3key

next

4

Page 67: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

5d

newp

NULLkey

next

1key

next

2key

next

3key

next

4

!=EOD

Page 68: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

5d

newp

NULLkey

next

1key

next

2key

next

3key

next

4key

next

Page 69: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

5d

newp

NULLkey

next

1key

next

2key

next

3key

next

4key

next

5

Page 70: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

5d

newp

NULLkey

next

1key

next

2key

next

3key

next

4key

next

5

Page 71: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

5d

newp

NULLkey

next

1key

next

2key

next

3key

next

4key

next

5

Page 72: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

6d

newp

NULLkey

next

1key

next

2key

next

3key

next

4key

next

5

!=EOD

Page 73: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

6d

newp

NULLkey

next

1key

next

2key

next

3key

next

4key

next

5key

next

Page 74: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

6d

newp

NULLkey

next

1key

next

2key

next

3key

next

4key

next

5key

next

6

Page 75: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

6d

newp

NULLkey

next

1key

next

2key

next

3key

next

4key

next

5key

next

6

Page 76: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

6d

newp

NULLkey

next

1key

next

2key

next

3key

next

4key

next

5key

next

6

Page 77: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

-1d

newp

NULLkey

next

1key

next

2key

next

3key

next

4key

next

5key

next

6

==EOD

Page 78: アルゴリズムとデータ構造 補足資料 11-3 「線形リストのオペレータ」

struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; }

get_data() 関数が返す値リストa[]={ 1, 2, 3, 4, 5, 6, EOD } EOD: -1※

p

NULLkey

next

1key

next

2key

next

3key

next

4key

next

5key

next

6