Microsoft PowerPoint - kougi9.ppt

Similar documents
Microsoft PowerPoint - kougi10.ppt

Microsoft PowerPoint - kougi2.ppt

Microsoft PowerPoint - kougi4.ppt

Microsoft PowerPoint - kougi7.ppt

Microsoft PowerPoint - kougi8.ppt

Microsoft PowerPoint - kougi11.ppt

Microsoft PowerPoint - guidance.ppt

Microsoft PowerPoint - kougi6.ppt

ゲームエンジンの構成要素

Taro-リストⅠ(公開版).jtd

PowerPoint プレゼンテーション

memo

Taro-リストⅢ(公開版).jtd

A/B (2018/10/19) Ver kurino/2018/soft/soft.html A/B

Microsoft PowerPoint - lec10.ppt

プログラミング基礎

情報処理演習 B8クラス

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

PowerPoint Template

Taro-ファイル処理(公開版).jtd

ファイル入出力

PowerPoint プレゼンテーション

プログラミングI第10回

演算増幅器

memo

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

ファイル入出力

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

1 C STL(1) C C C libc C C C++ STL(Standard Template Library ) libc libc C++ C STL libc STL iostream Algorithm libc STL string vector l

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

2006年10月5日(木)実施

PowerPoint Presentation

program7app.ppt

memo

Prog1_12th

Microsoft PowerPoint - 6.pptx

Taro-2分探索木Ⅱ(公開版).jtd

memo

Microsoft Word - 3new.doc

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

r08.dvi

Microsoft Word - no205.docx

ohp08.dvi

memo

1 1.1 C 2 1 double a[ ][ ]; 1 3x x3 ( ) malloc() malloc 2 #include <stdio.h> #include

Prog1_15th

V

Taro-スタック(公開版).jtd

Prog1_10th

Microsoft Word - no12.doc

1 1.1 C 2 1 double a[ ][ ]; 1 3x x3 ( ) malloc() 2 double *a[ ]; double 1 malloc() dou

第1回 プログラミング演習3 センサーアプリケーション

r07.dvi

C言語講座 ~ファイル入出力編~

ohp07.dvi

Microsoft Word - no206.docx

slide4.pptx

卒 業 研 究 報 告.PDF

PowerPoint プレゼンテーション

ex14.dvi

memo

memo

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

mstrcpy char *mstrcpy(const char *src); mstrcpy malloc (main free ) stdio.h fgets char *fgets(char *s, int size, FILE *stream); s size ( )

Microsoft PowerPoint - 05.pptx

Original : Hello World! (0x0xbfab85e0) Copy : Hello World! (0x0x804a050) fgets mstrcpy malloc mstrcpy (main ) mstrcpy malloc free fgets stream 1 ( \n

Microsoft Word - Cプログラミング演習(10)

memo

第2回

C言語入門

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

Microsoft Word - Cプログラミング演習(12)

PowerPoint Presentation

Microsoft Word - cpro_m_13.doc

Microsoft Word - Cプログラミング演習(9)

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

演習課題No12

PowerPoint プレゼンテーション

Taro-2分探索木Ⅰ(公開版).jtd

Microsoft Word - no15.docx

新版明解C言語 実践編

Taro-ポインタ変数Ⅰ(公開版).j

02: 変数と標準入出力

memo

(2) 構造体変数の宣言 文法は次のとおり. struct 構造体タグ名構造体変数名 ; (1) と (2) は同時に行える. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... 構造体変数名 ; 例 : struct STUDENT{ stdata; int id; do

PG13-6S

02: 変数と標準入出力

Microsoft PowerPoint - handout07.ppt [互換モード]

PowerPoint プレゼンテーション

ポインタ変数

PowerPoint プレゼンテーション

02: 変数と標準入出力

‚æ2›ñ C„¾„ê‡Ìš|

Microsoft PowerPoint - prog04.ppt

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Microsoft Word - Cプログラミング演習(8)

Transcription:

C プログラミング演習 第 9 回ポインタとリンクドリストデータ構造 1

今まで説明してきた変数 #include "stdafx.h" #include <math.h> int _tmain(int argc, _TCHAR* argv[]) { double x; double y; char buf[256]; int i; double start_x; double step_x; FILE* fp; printf( "start_x =" ); fgets( buf, 256, stdin ); sscanf( buf, "%lf n", &start_x ); printf( "step_x =" ); fgets( buf, 256, stdin ); sscanf( buf, "%lf n", &step_x ); fp = fopen( "z: data.csv", "w" ); for( i = 0; i < 20; i++ ) { x = start_x + ( i * step_x ); y = sin( x ); printf( "x= %f, y= %f n", x, y ); fprintf( fp, "x=, %f, y=, %f n", x, y ); fprintf( stderr, "file z: data.csv created n" ); fclose( fp ); return 0; プログラムが使うメモリ空間 メイン関数の実行時に自動的に確保 2

今日の内容 #include "stdafx.h" #include <math.h> int _tmain(int argc, _TCHAR* argv[]) { プログラムが使うメモリ空間 new を使い必要な分を確保 new new の実行によりメモリアドレスが得られる 3

今日の内容 #include "stdafx.h" #include <math.h> int _tmain(int argc, _TCHAR* argv[]) { プログラムが使うメモリ空間 new を使い必要な分を確保 new delete 不要になったら delete を実行するのがルール 4

例えば,new を 10 回実行すると プログラムが使うメモリ空間 プログラミングテクニック 確保して得られた 10 個のメモリアドレスを, メモリの どこに, どうやって 格納しておくのか? メモリエリアが 10 回確保される 5

リストの模式図 データ部分とポインタ部分で 1 単位を構成する ( これをリストセルと呼ぶ ) NULL データ部分 ポインタ部分 (= 次のリストセルのメモリアドレス ) リストの末端を表す メモリ中では [00 00 00 00] という値をとる リストセル 6

リストの基本操作の例 リストの生成 (new_list) 生成前何も無い生成後 NULL サイズ 1 のリスト リストの追加 (insert_list) 生成前長さ k のリスト (k 0) リストの削除 (delete_list) 生成前長さ k のリスト (k 1) リストの探索 (find_list) 生成後長さ k+1 のリスト ( 先頭に追加 ) 生成後長さ k-1 のリスト ( ある特定要素値を持つものを削除 ) リスト内から, ある特定要素値を持つものを探索 7

再帰的構造体 : リストの定義の例 struct data_list { int data; struct data_list *next; ; data int 型のデータ next メモリアドレス 8

リストの生成を行う関数 struct data_list *new_list(int x) { struct data_list *c = new(struct data_list); c->data = x; c->next = NULL; 確保したメモリエリアのアドレスが c にセットされる data に x の値を, next に NULL をセット プログラムが使うメモリ空間 メモリエリアを確保 data next return c; c に入っているメモリアドレスを使い, 構造体にアクセス 9

リストの追加を行う関数 void insert_list(struct data_list *p, int x) { struct data_list *c = new(struct data_list); c->data = p->data; c->next = p->next; p->data = x; p->next = c; 要素の追加 NULL 新しく作ったセル x の値 NULL 10

プログラム例 下記のような, サイズ 4 のリストを作るプログラム 12 345 67 89 NULL 11

new_list(89) 89 NULL このメモリアドレス = a 12

insert_list(a, 67) 67 89 NULL このメモリアドレス = a 13

insert_list(a, 345) 345 67 89 NULL このメモリアドレス = a 14

insert_list(a, 12) 12 345 67 89 NULL このメモリアドレス = a 15

#include "stdafx.h" #include <math.h> struct data_list { int data; struct data_list *next; ; struct data_list *new_list(int x) { struct data_list *c = new(struct data_list); c->data = x; c->next = NULL; return c; void insert_list(struct data_list *p, int x) { struct data_list *c = new(struct data_list); c->data = p->data; c->next = p->next; p->data = x; p->next = c; int _tmain(int argc, _TCHAR* argv[]) { int ch; struct data_list *a; a = new_list( 89 ); insert_list( a, 67 ); insert_list( a, 345 ); insert_list( a, 12 ); printf( "Enter キーを 1,2 回押してください. プログラムを終了します n"); ch = getchar(); ch = getchar(); return 0; 16

実際のメモリの中身 12, ポインタ 89, NULL 67, ポインタ 345, ポインタ 16 進数表示であることに注意 12 345 67 89 NULL 17

構造体リストの長所 動的メモリ管理 (new) により 必要な分だけのメモリを 好きなときに得られる セル数の制限を気にしなくてよい 削除したセルの再利用も簡単化できる ごみ集めの自動化が可能 18

例題 1. リストの要素の表示 リストの個々の要素をたどり, 要素値を順に表示するプログラム 19

リストの表示を行う関数 void print_list(struct data_list *p) { struct data_list *x; if ( p == NULL ) { return; printf( "%d", p->data ); x = p->next; while( x!= NULL ) { printf( ", %d", x->data ); x = x-> next; printf( " n" ); 20

#include "stdafx.h" #include <math.h> struct data_list { int data; struct data_list *next; ; void print_list(struct data_list *p) { struct data_list *x; if ( p == NULL ) { return; printf( "%d", p->data ); x = p->next; while( x!= NULL ) { printf( ", %d", x->data ); x = x-> next; printf( " n" ); struct data_list *new_list(int x) { struct data_list *c = new(struct data_list); c->data x; c->next = NULL; return c; void insert_list(struct data_list *p, int x) { struct data_list *c = new(struct data_list); c->data p->data; c->next p->next; p->data x; p->next = c; int _tmain(int argc, _TCHAR* argv[]) { int ch; struct data_list *a; a = new_list( 89 ); insert_list( a, 67 ); insert_list( a, 345 ); insert_list( a, 12 ); print_list( a ); printf( "Enter キーを 1,2 回押してください. プログラムを終了します n"); ch getchar(); ch = getchar(); return 0; 21

実行結果の例 22

例題 2. リストの探索 リストの個々の要素をたどり, 要素による探索を行うプログラム 23

リストの探索 find_list(67) 12 345 67 89 NULL 24

リストの探索 find_list(67) 12 345 67 89 NULL 25

リストの探索 find_list(67) 12 345 67 89 NULL 見付かった 26

リストの探索を行う関数 int find_list(struct data_list *p, int data ) { struct data_list *x; x = p; while( x!= NULL ) { if ( x->data == data ) { return 1; x = x-> next; return 0;; 27

#include "stdafx.h" #include <math.h> struct data_list { int data; struct data_list *next; ; #include "stdafx.h" int find_list(struct data_list *p, int data ) { struct data_list *x; x = p; while( x!= NULL ) { if ( x->data == data ) { return 1; x = x-> next; return 0;; struct data_list *new_list(int x) { struct data_list *c = new(struct data_list); c->data x; c->next = NULL; return c; void insert_list(struct data_list *p, int x) { struct data_list *c = new(struct data_list); c->data p->data; c->next p->next; p->data x; p->next = c; int _tmain(int argc, _TCHAR* argv[]) { int ch; struct data_list *a; a = new_list( 89 ); insert_list( a, 67 ); insert_list( a, 345 ); insert_list( a, 12 ); if ( find_list( a, 65 ) ) { printf( "65 はリスト中にある n" ); ; if ( find_list( a, 67 ) ) { printf( "67 はリスト中にある n" ); ; printf( "Enter キーを 1,2 回押してください. プログラムを終了します n"); ch getchar(); ch = getchar(); return 0; 28

例題 3. リストの削除 リストの個々の要素をたどり, 要素の削除を行うプログラム 29

リストの削除 delete_list(67) 12 345 67 89 NULL 30

リストの削除 delete_list(67) 12 345 67 89 NULL 31

リストの削除 delete_list(67) y x 12 345 67 89 NULL 32

リストの削除 delete_list(67) y 12 345 89 NULL 33

リストの削除 delete_list(67) y 12 345 89 NULL 34

リストの削除を行う関数 void delete_list(struct data_list **p, int data ) { struct data_list *x; struct data_list *y; x = *p; y = NULL; while( x!= NULL ) { if ( x->data == data ) { if ( y!= NULL ) { y->next = x->next; delete( x ); break; else { (*p) = x->next; delete( x ); break; y = x; x = x-> next; return; 35

#include "stdafx.h" #include <math.h> struct data_list { int data; struct data_list *next; ; void delete_list(struct data_list **p, int data ) { struct data_list *x; struct data_list *y; x = *p; y = NULL; while( x!= NULL ) { if ( x->data == data ) { if ( y!= NULL ) { y->next = x->next; delete( x ); break; else { (*p) = x->next; delete( x ); break; y = x; x = x-> next; return; void print_list(struct data_list *p) { struct data_list *x; if ( p == NULL ) { return; printf( "%d", p->data ); x = p->next; while( x!= NULL ) { printf( ", %d", x->data ); x = x-> next; printf( " n" ); struct data_list *new_list(int x) { struct data_list *c = new(struct data_list); c->data x; c->next = NULL; return c; void insert_list(struct data_list *p, int x) { struct data_list *c = new(struct data_list); c->data = p->data; c->next = p->next; p->data = x; p->next = c; int _tmain(int argc, _TCHAR* argv[]) { int ch; struct data_list *a; a = new_list( 89 ); insert_list( a, 67 ); insert_list( a, 345 ); insert_list( a, 12 ); print_list( a ); delete_list( &a, 67 ); print_list( a ); printf( "Enter キーを キーを1,2 回押してください. プログラムを終了します n"); ch getchar(); ch = getchar(); return 0; 36

再帰的構造体を用いた実装法 データとポインタをメンバとする構造体を定義する リストの末端は NULL( 空ポインタ ) 先頭の要素セルをおさえるためのポインタ変数を使う ( 例題 1, 例題 2, 例題 3 でのメイン関数内での変数 a ) 最後尾の要素セルをおさえるためのポインタ変数が役立つ場合もある ( 次回授業でのリストの併合のケース ) 必要に応じて途中のセルをおさえるためのポインタ変数を適宜用意 37

リストの長さを求める関数 38

length の実行状況 最初 x 12 345 67 89 NULL 39

x 12 345 67 89 NULL 40

x 12 345 67 89 NULL 41

x 12 345 67 89 NULL 42

12 345 67 89 NULL 結果 :4 43