html5-img
1 / 78

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

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

zeke
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

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

  4. 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 画面出力

  5. 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 画面出力

  6. 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>

  7. 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>

  8. 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>

  9. 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>

  10. 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>

  11. 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>

  12. 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>

  13. 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>

  14. 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>

  15. 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>

  16. 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)の際にも使う。

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

  18. 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

  19. 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

  20. 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

  21. 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

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

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

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

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

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

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

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

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

  30. リストのオペレータ 生成 表示(走査) 挿入 削除 p 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); } 削除がないと、領域を解放しないので、増加しっぱなし。

  31. 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

  32. 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 この要素を削除(領域解放)する ※見やすくするために位置をずらしましたが、   メモリ内で確保されている領域が   移動するわけではありません。

  33. 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

  34. 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

  35. 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

  36. 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

  37. 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 領域解放を忘れると、メモリ内にリンクのない使えない領域が残り続ける。 (メモリリーク:メモリ漏れ; プログラムが進むにつれて、だんだんと使えるメモリが減っていく) 必ず、解放しよう!

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

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

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

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

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

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

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

  45. 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

  46. 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

  47. 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

  48. 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

  49. 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

  50. 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

More Related