データ構造と アルゴリズム 第五回 知能情報学部 新田直也.

Slides:



Advertisements
Similar presentations
アルゴリズムと データ構造 第 3 回 基本的なデータ構造(2) : 配列 1. 前回の復習 アルゴリズムの計算量 最悪(最大)計算量 計算量の漸近的評価 (オーダ)  多項式時間アルゴリズム( polynomial time algorithm )  指数時間アルゴリズム( exponential.
Advertisements

アルゴリズムとデータ構造 第2回 線形リスト(復習).
5.データ構造入門 5-1.連結リスト(Linked List) 5-2.スタック(Stack) 5-3.キュー(Queue)
プログラミング言語としてのR 情報知能学科 白井 英俊.
データ構造とアルゴリズム 第10回 mallocとfree
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造 第3回基本的なデータ構造(リスト) 2015/10/28 アルゴリズムとデータ構造 2015.
第8回 プログラミングⅡ 第8回
構造体.
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
データ構造とアルゴリズム 第13回 スタックとキュー
データ構造とアルゴリズム 第5回 スタック ~ データ構造(2)~.
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
INSERT(x,p,L)の例 (一部) 磯 直行 2009年5月5日
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
データ構造と アルゴリズム 第十一回 理工学部 情報システム工学科 新田直也.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
構造体 構造体, 構造体とポインタの組み合わせ,.
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
データ構造とアルゴリズム 第5回 スタック ~ データ構造(2)~.
データ構造とアルゴリズム 第6回 キュー ~ データ構造(2)~.
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング 4 記憶の割り付け.
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
メモリの準備 メモリには、その準備の方法で2種類ある。 静的変数: コンパイル時にすでにメモリのサイズがわかっているもの。 普通の変数宣言
アルゴリズムとデータ構造勉強会 第6回 スレッド木
プログラミング入門2 第11回 情報工学科 篠埜 功.
オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也.
プログラミング入門2 第11回 情報工学科 篠埜 功.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
データ構造と アルゴリズム 第七回 知能情報学部 新田直也.
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
Cプログラミング演習 第10回 二分探索木.
アルゴリズムとデータ構造1 2005年7月5日
アルゴリズムとデータ構造 2010年6月21日
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング 4 木構造とヒープ.
簡易データベース 情報画像工学実験 I : 実験2 担当:関屋大雄(工学部1号棟515室)
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
6.データ構造入門 6-1.連結リスト(Linked List) 6-2.スタック(Stack) 6-3.キュー(Queue)
データ構造とアルゴリズム 第11回 リスト構造(1)
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
アルゴリズムとデータ構造1 2006年6月23日
アルゴリズムとデータ構造1 2009年6月15日
アルゴリズムとデータ構造 補足資料11-3 「線形リストのオペレータ」
ネットワーク・プログラミング Cプログラミングの基礎.
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
プログラミング論 構造体
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2010年6月17日
演算子のオーバーロード.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
データ構造と アルゴリズムI 第三回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

データ構造と アルゴリズム 第五回 知能情報学部 新田直也

連結リスト(復習) 各要素がリンクでつながっているリスト n番目の要素には先頭からn回リンクをたどらなければたどり着かない. 先頭 5 2 7 3 11 5 2 7 3 11 5 2 7 3 11 5 2 7 3 11

連結リストによるリストの実装(復習) read, write: O(n) insert: O(n) delete: O(n) 先頭 5 2 3 11 7 先頭 5 2 7 3 11

連結リストのプログラム(1) C言語での実装には構造体とポインタを用いる. Webページを考えて見ればよい. Javaではクラスとその参照だけで実装できる. Webページを考えて見ればよい.

連結リストのプログラム(2) struct CELL { int value; struct CELL *next; } 内容 1ページに相当 (構造体) 次ページのアドレス (ポインタ) CELL value next

連結リストのプログラム(3) ポインタの復習: 構造体の復習: p がポインタ(アドレス)なら,*p は pが示す先を表す. *p s がメンバ m を持つ構造体なら,s.m は s のメンバ m を示す. *p <html> <body> <H1>5</H1> <A HREF=“…”>次へ</A> </body> </html> p s s.value s.next

連結リストのプログラム(4) 先頭の要素を示すポインタ(リンク): ポインタを使ったアクセス: struct CELL *header; *((*header).next) header (*header).value (*header).next (*(*header).next).value (*(*header).next).next

連結リストのプログラム(5) リストの最後は? リストを順に表示するプログラム: 略記法: next が何も指さない(NULL). p リストの最後は? next が何も指さない(NULL). リストを順に表示するプログラム: struct CELL *header; struct CELL *p; for (p = header; p != NULL; p = (*p).next ) { printf(“%d\n”, (*p).value); } 略記法: (*p).next は p->next と書ける. ( (*p).value も同様.) *p (*p).value (*p).next

連結リストの read, write read と write struct CELL *header; int read(int n) { struct CELL *p; p = header; for (; n > 0; n--) { if (p == NULL) { return ERR; } p = p->next; return p->value; struct CELL *header; void write(int n, int e) { struct CELL *p; p = header; for (; n > 0; n--) { if (p == NULL) { return; } p = p->next; p->value = e;

連結リストの insert (1) insertは? 新しいページのURLを r とすると… r->next = p->next; p->next = r; p *p *(p->next) p->value p->next

連結リストの insert (2) 新しいページをどうやって作る? そのURLは? → malloc 関数 void *malloc(int n); n バイトのメモリを確保し,その先頭アドレスを返す. struct CELL *r; r = malloc(sizeof(struct CELL)); CELL構造体1つ分のメモリサイズ

連結リストの insert (3) insert void insert(int n, int e) { struct CELL *p; struct CELL *r; r = malloc(sizeof(struct CELL)); r->value = e; if (n == 0) { r->next = header; header = r; } else { n--; p = header; for (; n > 0; n--) { if (p == NULL) return; p = p->next; } r->next = p->next; p->next = r;

連結リストの insert (4) バグを含んだ insert void insert(int n, int e) { struct CELL *p; struct CELL c; c.value = e; if (n == 0) { c.next = header; header = &c; } else { n--; p = header; for (; n > 0; n--) { if (p == NULL) return; p = p->next; } c.next = p->next; p->next = &c; 復帰時に c が消えてしまう!

連結リストの delete(1) deleteは? 削除ページの直前のページのURLを p とすると… p->next = (p->next)->next; p *p *(p->next) p->value p->next (p->next)->next

連結リストの delete (2) リンクを切っただけではページは削除されない.ページ自体を削除するには? → free 関数 void free(void *p); p から始まるメモリを解放する. r = (p->next)->next ; free(p->next); p->next = r;