データ構造とアルゴリズム 第11回 リスト構造(1)

Slides:



Advertisements
Similar presentations
1 データ構造とアルゴリズム 第 3 回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
Advertisements

アルゴリズムとデータ構造 第2回 線形リスト(復習).
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
5.データ構造入門 5-1.連結リスト(Linked List) 5-2.スタック(Stack) 5-3.キュー(Queue)
ISD実習E 2009年6月29日 LISPシステム入門 (第5回) 関数ポインタ eval システム関数.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
第13回構造体.
データ構造とアルゴリズム 第10回 mallocとfree
第12回構造体.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
アルゴリズムとデータ構造 第3回基本的なデータ構造(リスト) 2015/10/28 アルゴリズムとデータ構造 2015.
第8回 プログラミングⅡ 第8回
アルゴリズムとデータ構造 2011年6月13日
構造体.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
情報処理Ⅱ 2007年12月10日(月).
データ構造とアルゴリズム 第13回 スタックとキュー
第4回放送授業.
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
INSERT(x,p,L)の例 (一部) 磯 直行 2009年5月5日
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
構造体 構造体, 構造体とポインタの組み合わせ,.
プログラミング論 関数ポインタ と 応用(qsort)
ネットワークプログラミング 第4回「C言語の基礎~ポインタと配列」
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
データ構造とアルゴリズム 第5回 スタック ~ データ構造(2)~.
データ構造とアルゴリズム 第6回 キュー ~ データ構造(2)~.
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング 4 記憶の割り付け.
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
プログラミング入門2 第11回 情報工学科 篠埜 功.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
第11回 プログラミングⅡ 第11回
アルゴリズムとデータ構造1 2009年6月29日
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回 二分探索木.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
第2回課題 配布した通り.氏名・学生番号を忘れないこと.
簡易データベース 情報画像工学実験 I : 実験2 担当:関屋大雄(工学部1号棟515室)
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
構造体と共用体.
6.データ構造入門 6-1.連結リスト(Linked List) 6-2.スタック(Stack) 6-3.キュー(Queue)
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
ポインタとポインタを用いた関数定義.
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
アルゴリズムとデータ構造 2012年6月11日
アルゴリズムとデータ構造1 2006年6月23日
アルゴリズムとデータ構造1 2009年6月15日
アルゴリズムとデータ構造 補足資料11-3 「線形リストのオペレータ」
ネットワーク・プログラミング Cプログラミングの基礎.
プログラミング論 構造体
データ構造とアルゴリズム論 第9章 連結リスト
アルゴリズムとデータ構造 2010年6月17日
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
マスク合成(のような処理) 出力画像 Out 入力画像1 In1 In1 In2 Out 入力画像2 In
左右反転と180度回転 [0][xsize – 1] [0][0] → i ↓ j [ysize – 1][xsize – 1]
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
Presentation transcript:

データ構造とアルゴリズム 第11回 リスト構造(1) データ構造とアルゴリズム 第11回 リスト構造(1) 静岡大学工学部 安藤 和敏 2011.06.24

目次 変数とメモリの復習 先週の復習 課題8の解説 リスト構造 リストのポインタを用いた実装 実習

コンピュータのメモリのイメージ アドレス 内容 175 1 2 安藤 3 4 浜松 5 6 2004 7 ... ...

変数とメモリ ... ... アドレス 内容 int x; 175 と宣言することによって、xという名前が付けられた4バイト分のメモリ領域が確保される。 1 2 安藤 3 4 浜松 5:x: 6 2004 7 確保されるバイト数はその変数の型に依存する。p.18の表2.3を見よ。 以降は、この確保されたメモリ領域の内容をx と言う名前で参照できるようになる。 ... ...

ポインタとメモリ(教科書p.143-144) int x; int *p=&x; ポインタ変数 pの内容=7 アドレス 内容 175 1:p: 7 2 安藤 3 4 浜松 xの宣言によって確保されたメモリ領域 5 6 2004 7:x:

以降では、前ページのような状況を図示するために、このような矢線を用いて表現する。 ポインタとメモリの関係の図示 int x; int *p=&x; 以降では、前ページのような状況を図示するために、このような矢線を用いて表現する。 アドレス 内容 p: x:

構造体ポインタとメモリ struct COMPLEX a={1,-2}; struct COMPLEX *p=&a; アドレス 内容 1 2 3:p: 5 4 (real) 1 5:a: aの宣言によって確保されたメモリ領域 (img) -2 7 8

構造体ポインタpを介してaのメンバrealを参照するときには、p->real, 構造体ポインタからのメンバの参照 struct COMPLEX a={1,-2}; struct COMPLEX *p=&a; メモリの内容 構造体ポインタpを介してaのメンバrealを参照するときには、p->real, p->img p: (real) 1 a: (img) -2

目次 変数とメモリの復習 先週の復習 課題8の解説 リスト構造 リストのポインタを用いた実装 実習

目次 変数とメモリの復習 先週の復習 課題8の解説 リスト構造 リストのポインタを用いた実装 実習

目次 変数とメモリの復習 先週の復習 課題8の解説 リスト構造 リストのポインタを用いた実装 実習

リストとは何か? [10,8,4,23,95,6] [浜松, 湖西, 磐田, 袋井] のように、ある決まった型の要素が順番に並べられたものをリストと呼ぶ。上の例は、整数のリストであるが整数でなくても良い。例えば、 [浜松, 湖西, 磐田, 袋井] もリストである。

リストの配列を用いた実装 リストは配列を用いて表現することもできる。例えば、次のリスト [10,8,4,23,95,6] は、以下のようにデータが入っている整数型の配列 a によって表現できる。 10 8 4 23 95 6 a 1 2 3 5

リストの配列を用いた実装の欠点 例えば、以下のように配列で表現されたリストの先頭に 2 を挿入するときに、どうしたらよいのか? 10 8 4 23 95 6 a 1 2 3 5 10 8 4 23 95 6 a 10 8 4 23 95 6 a 10 8 4 23 95 6 a

リストの配列を用いた実装の欠点 10 8 4 23 95 6 a 10 8 4 23 95 6 a 10 8 4 23 95 6 a 10 8 4 23 95 6 a 2 2 を a の先頭に挿入するためには、全ての要素を右に一つずつ移動する必要がある!

目次 変数とメモリの復習 先週の復習 課題8の解説 リスト構造 リストのポインタを用いた実装 実習

リストのポインタを用いた実装 ― リスト構造 ― リストのポインタを用いた実装 ― リスト構造 ― リスト構造と呼ばれるデータ構造を使えば、前のページで述べたような欠点は克服される。 リスト構造は、セルと呼ばれる構造体がポインタでつながれたものである。 ポインタ 10 8 4 セル 23 95 6

セル 10 8 4 23 95 6 一つのセルは、データと次のセルへのポインタからなる構造体である。 データ 次のセルへのポインタ root 先頭のセルへのポインタ 23 95 6

リスト構造のC言語による実装 (ソースコード list0.c の説明) 構造体タグ CELL の宣言。 struct CELL { int data; struct CELL *next; }; CELL 構造体CELLは、int 型 data と構造体CELLへのポインタ next をメンバとして持つ。 (data) (next)

セルを作る(1) struct CELL *cell1, *cell2, *cell3; cell1 = (struct CELL *) malloc(sizeof(struct CELL)); メモリの内容 ポインタ変数 cell1, cell2, cell3 のためのメモリ領域が確保される。 cell3: cell2: cell1:

セルを作る(2) struct CELL *cell1, *cell2, *cell3; そのアドレスは、適切な型に変換(キャスト)されなければならない。 struct CELL *cell1, *cell2, *cell3; cell1 = (struct COMPLEX *) malloc(sizeof(struct COMPLEX)); (struct CELL *) malloc(sizeof(struct CELL)) メモリの内容 mallocによって確保されたメモリ領域。sizeof(struct CELL)バイト。mallocはこのメモリのアドレスを返す。 cell1: (data) (next)

それ以降は、ここの内容はポインタ cell1 を介して参照できる。 セルを作る(3) struct CELL *cell1,*cell2,*cell3; a = (struct CELL *) malloc(sizeof(struct CELL)); cell1 = メモリの内容 ポインタ変数 cell1 にmallocによって確保されたメモリのアドレスが代入される。 cell1: それ以降は、ここの内容はポインタ cell1 を介して参照できる。 cell1->data, cell1->next で。 (data) (next)

セルを作る(4) struct CELL *cell1,*cell2,*cell3; cell1 =(struct CELL *) malloc(sizeof(struct CELL)); cell1->data = 10; cell1->next = NULL; cell1: (data) 10 (next) NULL

以降では、この様に簡略化した図を用いて説明をする。 セルを作る(4) struct CELL *cell1,*cell2,*cell3; cell1 =(struct CELL *) malloc(sizeof(struct CELL)); cell1->data = 10; cell1->next = NULL; 以降では、この様に簡略化した図を用いて説明をする。 cell1: (data) 10 cell1 (data) (next) 10 NULL (next) NULL

同様にして、セルへのポインタ cell2 と cell3 は左図のようなセルを指し示すようになる。 (data) (next) 10 NULL 同様にして、セルへのポインタ cell2 と cell3 は左図のようなセルを指し示すようになる。 cell2 (data) (next) 8 NULL cell3 (data) (next) 4 NULL

cell1の指し示すセル構造体のアドレスをrootに代入する。 セルをつなげる (1) root = cell1; cell1->next=cell2; cell2->next=cell3; (data) (next) cell1 10 NULL root (data) (next) cell2 8 NULL cell1の指し示すセル構造体のアドレスをrootに代入する。 (data) (next) cell3 4 NULL

cell2の指し示すセル構造体のアドレスを セルをつなげる (2) root = cell1; cell1->next=cell2; cell2->next=cell3; (data) (next) cell1 10 NULL root (data) (next) cell2 8 NULL cell2の指し示すセル構造体のアドレスを cell1->nextに代入する。 (data) (next) cell3 4 NULL

cell3の指し示すセル構造体のアドレスを セルをつなげる (3) root = cell1; cell1->next=cell2; cell2->next=cell3; (data) (next) cell1 10 root (data) (next) cell2 8 NULL cell3の指し示すセル構造体のアドレスを cell2->nextに代入する。 (data) (next) cell3 4 NULL

目次 変数とメモリの復習 先週の復習 課題8の解説 リスト構造 リストのポインタを用いた実装 実習