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

Slides:



Advertisements
Similar presentations
アルゴリズムとデータ構造 第2回 線形リスト(復習).
Advertisements

5.データ構造入門 5-1.連結リスト(Linked List) 5-2.スタック(Stack) 5-3.キュー(Queue)
データ構造とアルゴリズム 第10回 mallocとfree
アルゴリズムとデータ構造 補足資料13-4 「2分探索木の追加・削除(ダイジェスト)」
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造 第3回基本的なデータ構造(リスト) 2015/10/28 アルゴリズムとデータ構造 2015.
アルゴリズムとデータ構造 2011年6月13日
アルゴリズムとデータ構造 補足資料7-3 「単純選択ソートselsort.c」
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
アルゴリズムとデータ構造 補足資料4-2 「線形探索」
アルゴリズムとデータ構造 補足資料6-3 「サンプルプログラムcat3.c」
データ構造とアルゴリズム 第13回 スタックとキュー
データ構造とアルゴリズム 第5回 スタック ~ データ構造(2)~.
Stack & Queue & List 3.
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
INSERT(x,p,L)の例 (一部) 磯 直行 2009年5月5日
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
大岩 元 慶応大学環境情報学部 二分木 データ構造とプログラミング(10) 大岩 元 慶応大学環境情報学部
アルゴリズムとデータ構造 2011年6月20日
データ構造と アルゴリズム 第十一回 理工学部 情報システム工学科 新田直也.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
データ構造とアルゴリズム 第5回 スタック ~ データ構造(2)~.
データ構造とアルゴリズム 第6回 キュー ~ データ構造(2)~.
プログラミング 4 記憶の割り付け.
木の走査.
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
アルゴリズムとデータ構造 補足資料5-2 「サンプルプログラムsetop.c」
アルゴリズムとデータ構造勉強会 第6回 スレッド木
アルゴリズムとデータ構造 補足資料14-2 「ダイレクトチェイニング法」
オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 補足資料4-1 「メモリと配列」
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
アルゴリズムとデータ構造 補足資料6-2 「サンプルプログラムcat2.c」
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
Cプログラミング演習 第10回 二分探索木.
アルゴリズムとデータ構造1 2009年7月9日
アルゴリズムとデータ構造1 2005年7月5日
2005年度 データ構造とアルゴリズム 第6回 「ハッシュ法を用いた探索」
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
簡易データベース 情報画像工学実験 I : 実験2 担当:関屋大雄(工学部1号棟515室)
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
6.データ構造入門 6-1.連結リスト(Linked List) 6-2.スタック(Stack) 6-3.キュー(Queue)
データ構造とアルゴリズム 第11回 リスト構造(1)
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
アルゴリズムとデータ構造1 2006年7月4日
アルゴリズムとデータ構造 2012年6月11日
アルゴリズムとデータ構造1 2006年6月23日
アルゴリズムとデータ構造1 2009年6月15日
第5回 プログラミングⅡ 第5回
アルゴリズムとデータ構造 補足資料9-1 「ハノイの塔」
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
Post-Kona paper 解説 P0083R1: Splicing Maps and Sets (Rev.3) 稲葉 一浩
アルゴリズムとデータ構造 2012年6月21日
アルゴリズムとデータ構造 補足資料7-1 「メモリでの『構造体の配列』」
プログラミング 4 文字列.
アルゴリズムとデータ構造 補足資料6-1 「サンプルプログラムcat1.c」
アルゴリズムとデータ構造 2010年6月17日
アルゴリズムとデータ構造 補足資料5-3 「サンプルプログラムstrcat.c」
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
アルゴリズムとデータ構造1 2005年7月12日
アルゴリズムとデータ構造1 2007年7月6日
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
Presentation transcript:

アルゴリズムとデータ構造 補足資料11-3 「線形リストのオペレータ」 横浜国立大学 理工学部 数物・電子情報系学科 富井尚志

リストのオペレータ 生成 表示(走査) 挿入 削除 p key 21 key 22 key 23 next next next NULL

リストのオペレータ 生成 表示(走査) 挿入 削除 p 21 22 23 NULL key 21 key 22 key 23 next next next NULL void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n");

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); p key 21 key 22 key 23 next next next NULL 画面出力

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); p !=NULL key 21 key 22 key 23 next next next NULL 画面出力

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); p key 21 key 22 key 23 next next next NULL 画面出力 <21>

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); p key 21 key 22 key 23 next next next NULL 画面出力 <21>

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); p !=NULL key 21 key 22 key 23 next next next NULL 画面出力 <21>

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); p key 21 key 22 key 23 next next next NULL 画面出力 <21> <22>

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); p key 21 key 22 key 23 next next next NULL 画面出力 <21> <22>

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); p !=NULL key 21 key 22 key 23 next next next NULL 画面出力 <21> <22>

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); p key 21 key 22 key 23 next next next NULL 画面出力 <21> <22> <23>

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); p NULL key 21 key 22 key 23 next next next NULL 画面出力 <21> <22> <23>

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); p ==NULL NULL key 21 key 22 key 23 next next next NULL 画面出力 <21> <22> <23>

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); p NULL key 21 key 22 key 23 next next next NULL 画面出力 <21> <22> <23>

void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); p NULL key 21 key 22 key 23 next next next NULL 画面出力 <21> <22> <23> 走査(scan)とは、一つ一つの要素のキーを見ていくこと。 「探索」(search)の際にも使う。

リストのオペレータ 生成 表示(走査) 挿入 削除 p 21 22 23 NULL key 21 key 22 key 23 next next next NULL void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; }

void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } p key 21 key 22 key 23 next next next NULL ここに挿入する x key 30 next

void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } p key 21 key 22 key 23 next next next NULL この値をコピー x key 30 next

void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } p key 21 key 22 key 23 next next next NULL この値をコピー x key 30 next

void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } p key 21 key 22 key 23 next next next NULL x key 30 next

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

void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを挿入する。」 p 福沢さんの番号 福沢 樋口 野口 樋口さんの番号 野口さんの番号 NULL この値をコピー x 夏目さんの番号 夏目 樋口さんの番号

void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを挿入する。」 p 福沢さんの番号 福沢 樋口 野口 夏目さんの番号 野口さんの番号 NULL この値をコピー x 夏目さんの番号 夏目 樋口さんの番号

void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを挿入する。」 p 福沢さんの番号 福沢 樋口 野口 夏目さんの番号 野口さんの番号 NULL x 夏目さんの番号 夏目 樋口さんの番号

void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを挿入する。」 p 福沢さんの番号 福沢 夏目 樋口 野口 夏目さんの番号 樋口さんの番号 野口さんの番号 NULL 番号の写し順に注意!

「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを挿入する。」 イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを挿入する。」 p 福沢さんの番号 福沢 樋口 野口 樋口さんの番号 野口さんの番号 NULL ここに挿入する x 夏目さんの番号 夏目 番号の写し順に注意! 先に、福沢さんの覚えている樋口さんの電話番号を、 メモをとらずに(憶えておかずに)夏目さんの電話番号に書き換えてしまうと。。。

「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを挿入する。」 イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを挿入する。」 p 福沢さんの番号 福沢 樋口 野口 夏目さんの番号 野口さんの番号 NULL x 夏目さんの番号 夏目 番号の写し順に注意! 先に、福沢さんの覚えている樋口さんの電話番号を、 メモをとらずに(憶えておかずに)夏目さんの電話番号に書き換えてしまうと。。。

? void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを挿入する。」 p 福沢さんの番号 福沢 樋口 野口 夏目さんの番号 野口さんの番号 NULL x 夏目さんの番号 夏目 ? 番号の写し順に注意! 先に、福沢さんの覚えている樋口さんの電話番号を、 メモをとらずに(憶えておかずに)夏目さんの電話番号に書き換えてしまうと。。。 樋口さんの電話番号がわからなくなる! ので、連絡網が切れてしまう。

リストのオペレータ 生成 表示(走査) 挿入 削除 p 21 22 23 NULL key 21 key 22 key 23 next next next NULL void delete_next(struct list *p) { struct list *q;   q = p->next; p->next = q->next; free(q); } 削除がないと、領域を解放しないので、増加しっぱなし。

void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; free(q); } p key 21 key 22 key 23 next next next NULL この要素を削除(領域解放)する q

void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; free(q); } p key 21 key 23 next next NULL key 22 next q この要素を削除(領域解放)する ※見やすくするために位置をずらしましたが、   メモリ内で確保されている領域が   移動するわけではありません。

void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; free(q); } p key 21 key 23 next next NULL この値をコピー key 22 next q

void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; free(q); } p key 21 key 23 next next NULL この値をコピー key 22 next q

void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; free(q); } p key 21 key 23 next next NULL key 22 next 領域を解放 q

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

void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; /*free(q);*/ } p key 21 key 23 next next NULL key 22 next 領域解放を忘れると、メモリ内にリンクのない使えない領域が残り続ける。 (メモリリーク:メモリ漏れ; プログラムが進むにつれて、だんだんと使えるメモリが減っていく) 必ず、解放しよう!

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

void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; free(q); } イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを削除する。」 p 福沢さんの番号 福沢 野口 樋口さんの番号 NULL 樋口 野口さんの番号 q この要素を削除する

void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; free(q); } イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを削除する。」 p 福沢さんの番号 福沢 野口 樋口さんの番号 NULL この値をコピー 樋口 野口さんの番号 q 樋口さんの番号 あとで、本部から樋口さんに 「あなたは連絡網から削除されました」 と電話で伝える(解放する)ために 樋口さんの電話番号をメモしておく

void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; free(q); } イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを削除する。」 p 福沢さんの番号 福沢 野口 野口さんの番号 NULL この値をコピー 樋口 野口さんの番号 q 樋口さんの番号

void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; free(q); } イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを削除する。」 p 福沢さんの番号 福沢 野口 野口さんの番号 NULL 樋口 野口さんの番号 q 樋口さんの番号 本部から樋口さんに 「あなたは連絡網から削除されました」 と電話を入れる(解放する)

void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; free(q); } イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを削除する。」 p 福沢さんの番号 福沢 野口 野口さんの番号 NULL

リストのオペレータ 生成 表示(走査) 挿入 削除 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 } 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; d p newp

get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } 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; d p newp NULL

get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d !=EOD 1 p newp NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 1 p newp NULL key next

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 1 p newp NULL key 1 next

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 1 p newp NULL key 1 next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 1 p newp key 1 next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d !=EOD 2 p newp key 1 next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 2 p newp key key 1 next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 2 p newp key 2 key 1 next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 2 p newp key 2 key 1 next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 2 p newp key 2 key 1 next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d !=EOD 3 p newp key 2 key 1 next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 3 p newp key key 2 key 1 next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 3 p newp key 3 key 2 key 1 next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 3 p newp key 3 key 2 key 1 next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 3 p newp key 3 key 2 key 1 next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d !=EOD 4 p newp key 3 key 2 key 1 next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 4 p newp key key 3 key 2 key 1 next next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 4 p newp key 4 key 3 key 2 key 1 next next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 4 p newp key 4 key 3 key 2 key 1 next next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 4 p newp key 4 key 3 key 2 key 1 next next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d !=EOD 5 p newp key 4 key 3 key 2 key 1 next next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 5 p newp key key 4 key 3 key 2 key 1 next next next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 5 p newp key 5 key 4 key 3 key 2 key 1 next next next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 5 p newp key 5 key 4 key 3 key 2 key 1 next next next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 5 p newp key 5 key 4 key 3 key 2 key 1 next next next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d !=EOD 6 p newp key 5 key 4 key 3 key 2 key 1 next next next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 6 p newp key key 5 key 4 key 3 key 2 key 1 next next next next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 6 p newp key 6 key 5 key 4 key 3 key 2 key 1 next next next next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 6 p newp key 6 key 5 key 4 key 3 key 2 key 1 next next next next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d 6 p newp key 6 key 5 key 4 key 3 key 2 key 1 next next next next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; d ==EOD -1 p newp key 6 key 5 key 4 key 3 key 2 key 1 next next next next next next NULL

struct list * get_list( void ) { int d; struct list *p,*newp; get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 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; p key 6 key 5 key 4 key 3 key 2 key 1 next next next next next next NULL