1 / 45

データ構造とアルゴリズム

データ構造とアルゴリズム. 第 4 回 リスト ~ データ構造(1)~. 前回の問題. 問題 以下の4個のメンバーから構成される構造体を定義せよ。型名を IMAGE とする。 ・整数値の番号 n ・ローマ字タイトル  name ・実数値の平均輝度  avL ・次の IMAGE 型構造体へのポインタ  next. 前回の問題の解答. struct IMAGE{ int n; char name[20]; double avL; struct IMAGE *next; };. 正答率= 41 %.

ravi
Download Presentation

データ構造とアルゴリズム

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. データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~

  2. 前回の問題 • 問題 以下の4個のメンバーから構成される構造体を定義せよ。型名をIMAGEとする。 ・整数値の番号 n ・ローマ字タイトル name ・実数値の平均輝度 avL ・次のIMAGE型構造体へのポインタ next

  3. 前回の問題の解答 struct IMAGE{ int n; char name[20]; double avL; struct IMAGE *next; }; 正答率=41% 簡単すぎるかと反省してたので、ちょっとビックリでガッカリ 文字数を指定して文字列にする! 多かった間違い 第1位 char name;  ⇒ char name[20]; 第2位 セミコロン無し

  4. 本日の内容 • リスト • 抽象データ型としてのリスト • 配列によるリストの実現 • 連結リストによるリストの実現

  5. D C C B A D B A 基本的な抽象データ型 • (List) • リストの特殊なケース •      (Stack) • (Queue, 待ち行列) 3つとも情報関連の資格試験に頻出する.重要なのでよく理解しておくこと.

  6. 最後の要素 最初の要素 リストの数学的表現 (p.26~)   • リスト: 線形リスト(linear list)と呼ぶこともある. • ai : • n: • n = 0 a0,a1, a2, …, ai-1, ai, ai+1, … , an-1

  7. 抽象データ型としてのリスト • 抽象データ型:  リスト 操作 要素を 並べたもの

  8. 表記法についての説明 • L: リスト • p    :位置を表わす変数 • x    :挿入したいデータ 要素の型はすべて同じであればよい. 教科書ではelememttype型としている. x p a0 a1 … ai-1 ai … an-1 L n

  9. 代表的なリスト操作 • INSERT(x, p, L) 新要素の挿入 • DELETE(p, L)要素の削除 • LOCATE(x, L)要素xの位置を探す • RETRIEVE(p, L)位置pにある要素を返す • FIND(i, L)i番目の要素を返す • TOP(L)、LAST(L)先頭、末尾の位置を返す • NEXT(p, L)、PREVIOUS(p, L)pの直前、直後の位置を返す • CREATE(L)新規に空リストLを作成する

  10. INSERT(x, p, L) p x E A B C D F G H L p A B C D L

  11. p A B C D E F G H L DELETE(p, L) p A B C D E F G H L

  12. LOCATE(x, L) x D A B C D F G H L 配列のインデクスなら[3] ポインタならば、ここを指すポインタ

  13. RETRIEVE(p, L) p A B C D F G H L

  14. FIND(i, L) i = 3のときは? A B C D F G H L

  15. TOP(L) と LAST(L) TOP(L) LAST(L) A B C D F G H L

  16. NEXT(p,L)とPREVIOUS(p,L) NEXT(p, L) PREVIOUS(p, L) p A B C D F G H L

  17. CREATE(L) CREATE(L) 空リストの先頭の位置が返る L

  18. リストの実現(実装) • すべての操作が常に必要になるとは限らない • すべての操作を効率よく実行できるデータ構造の実現は困難 ⇒プログラムの実装の際には,                              を採用する • リストの実現に使用できるデータ構造 • 配列 • 連結リスト(linked list) • ポインタを用いてデータ間の関係を表現したデータ構造 Insert,Deleteの実現方法の例を説明する

  19. last 配列によるリストの実現 例) int a[MAXLENGTH]; a[0] 5 a[1] 10 リスト MAXLENGTH 個 22 空 a[MAXLENGTH-1]

  20. p p last 2 A ③ L ① L 3 ② Insert(x, p, L) A x [0] B [0] B [1] L [1] last [2] L [2] 2 [3] [3] [4] [4] [5] [5]

  21. p p last ① 4 I last T 3 ② T Delete(p, L) [0] E [0] E [1] X X [1] [2] E E [2] [3] I I [3] [4] T T [4] 4 [5] [5]

  22. p 配列で実現する場合の注意点 [0] E [1] I last [2] 2 T [3] [4] [5] [6] lastがMAXLENGTH – 1の場合,リストは満杯 (これ以上,要素を挿入できない)

  23. mallocの復習 malloc(n); • メモリ上に • 普通、n には

  24. ? mallocの使用例 struct ITEM{ int element; struct ITEM *next; }; ptr = (struct ITEM*)malloc(sizeof(struct ITEM)); • メモリ空間上に、 • mallocは ptr

  25. メモリ空間上のイメージ 内容 番地 FF1F0204 00000000 mallocするのか。 それじゃ、ここがstruct ITEMの分確保できるから、ここをつかうぞ。 00000004番地を使うことをptrにメモしておこう。 00000004 00000008 0CFFFF1A 0000000C FF001121 00000010 00000004 ptrが格納されている場所 00000128

  26. 値を返すとは?(2週目のスライド再掲) 関数 float triangle(int L, int H){ return L*H/2.0; } 関数triangle を呼び出す メインプログラム S = triangle(5, 7); (5*7/2.0=17.5) 計算結果を 関数の呼び出し元に返す (Sに17.5が代入される)

  27. ポインタを返すとは? 関数 struct cell* LAST (struct cell* init){ リストの末尾の位置を探す; return 末尾へのポインタ; } 関数LAST君、末尾のセルは どこか調べてね メインプログラム pt = LAST(init); 末尾のセルは 0104番地にありますよ pt にアドレス 0104が 代入される

  28. 50 復習 ドット演算子 . struct SAMPLE{ int width; int height; }; int main(void) { struct SAMPLE data1; data1.width = 50; … return 0; } data1 width height 構造体のメンバにアクセスするときは、ドット演算子を使って、メンバ名を指定する。

  29. 復習  間接演算子 *     a int main(void) { int a=5, b; int *pt; pt = &a; b = *pt; … return 0; } 5 pt b 5

  30. 構造体へのポインタのときは? data1.width (*pt).width pt->width int main(void) { struct SAMPLE data1; struct SAMPLE *pt; pt = &data1; (*pt).width = 50; … return 0; } pt data1.width data1.height

  31. a0 a1 a2 an-1 ポインタによるリストの実現 init ここではポインタのみになっているが、実装を簡単にするため、ヘッダも完全なセルにすることもある.

  32. a0 a1 a2 an-1 例)整数のリスト(単方向リスト版) • 型定義 struct CELL { int element; struct CELL *next; }; init • CELL型 • 要素(element)と • 次のセルを指すポインタからなる

  33. B A C x Insert(x, p, L) init p

  34. B A C Insert(x, p, L)の実現(1) 重要!! 教科書p.30のソースと よく見比べて理解すること init p

  35. B A C Insert(x, p, L)の実現(2) • リストの途中への挿入の場合 init p r

  36. B A C Insert(x, p, L)の実現(3) • リストの途中への挿入の場合 init q p r

  37. B A C Insert(x, p, L)の実現(4) init q p r

  38. B A C Insert(x, p, L)の実現(5) init q p x r

  39. B A C 先頭へのInsert • ②、③が異なる p (先頭への挿入のときpはNULL) ② q = init; init ③ init = r ; r

  40. p ③ free(q); C A B B D Delete(p, L) init

  41. ap+1 ap-1 ap 双方向リスト     • 「要素」と「次のセルを指すポインタ」, 「前のセルを指すポインタ」で構成される連結リストは, • 長所: • 短所: 

  42. ap+1 ap-1 ap 例)整数のリスト(双方向リスト版) 前の要素を指す ポインタが増えた • 型定義 struct CELL { int element; struct CELL *next; struct CELL *previous; };

  43. init p p [0] E [1] last I [2] T I E 2 [3] [4] [5] T [6] 計算量の比較      

  44. init p p [0] E [1] last I [2] T E I 2 [3] [4] [5] T [6] メモリの使用効率に関する比較  データが 入っていない ポインタ用の空間

  45. 内容 内容 内容 番地 番地 番地 0093 0095 0106 010E 0100 010A 0108 010F 00FF 0107 0091 0096 0100 0108 0110 0106 010E 0112 0101 0109 0111 0098 009C 009A 0112 0102 010A 0114 0104 010C 0113 0103 010B 0099 009D 009B 0114 0104 010C 0000 0102 0000 0105 010D 0115 本日の問題 の様に連結されている時、下の番地表での連結を矢印で示せ。 一つのセルは連続した2つの番地に入っているとする。 ROOT 0093 0094 009D 0000 0091 ROOT

More Related