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

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

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

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

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

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

Taro-再帰関数Ⅲ(公開版).jtd

プログラミングI第10回

Taro-再帰関数Ⅱ(公開版).jtd

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

Taro-プログラミングの基礎Ⅱ(公

Microsoft PowerPoint - kougi9.ppt

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Microsoft Word - no15.docx

Microsoft Word - no206.docx

Microsoft PowerPoint - kougi10.ppt

Microsoft PowerPoint - 05.pptx

memo

< F2D837C E95CF CF68A4A94C5816A2E6A>

Taro-最大値探索法の開発(公開版

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

PowerPoint Template

第2回

Prog1_15th

Microsoft Word - no205.docx

2006年10月5日(木)実施

memo

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

kiso2-09.key

Prog1_12th

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

PowerPoint プレゼンテーション

Microsoft PowerPoint - lec10.ppt

Microsoft Word - 13

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

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

Microsoft PowerPoint - 11.pptx

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

Microsoft PowerPoint - 06.pptx

Microsoft PowerPoint - 6.pptx

program7app.ppt

C のコード例 (Z80 と同機能 ) int main(void) { int i,sum=0; for (i=1; i<=10; i++) sum=sum + i; printf ("sum=%d n",sum); 2

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

II 3 yacc (2) 2005 : Yacc 0 ~nakai/ipp2 1 C main main 1 NULL NULL for 2 (a) Yacc 2 (b) 2 3 y

プログラミング基礎

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

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

II ( ) prog8-1.c s1542h017%./prog8-1 1 => 35 Hiroshi 2 => 23 Koji 3 => 67 Satoshi 4 => 87 Junko 5 => 64 Ichiro 6 => 89 Mari 7 => 73 D

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

r07.dvi

Taro-ビット処理(公開版).jtd

PowerPoint Presentation

ohp07.dvi

C言語によるアルゴリズムとデータ構造

untitled

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

Taro-再帰関数Ⅰ(公開版).jtd

プログラミング基礎

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

演算増幅器

Microsoft Word - no12.doc

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

I ASCII ( ) NUL 16 DLE SP P p 1 SOH 17 DC1! 1 A Q a q STX 2 18 DC2 " 2 B R b

I. Backus-Naur BNF : N N 0 N N N N N N 0, 1 BNF N N 0 11 (parse tree) 11 (1) (2) (3) (4) II. 0(0 101)* (

PowerPoint プレゼンテーション

memo

演習課題No12

memo

第2回

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

gengo1-11

1. 入力した正の整数を降順に並べ換えて出力するプログラムを作成せよ プログラムは個別にコンパイルし make コマンドで実行すること 入力データは 50 以下とし 以下の数が混在しているとする 16 進数 : 先頭 1 文字が x または X( エックスの小文字か大文字 ) 8 進数 : 先頭 1

DVIOUT

PowerPoint Presentation

Microsoft Word - 3new.doc

Microsoft PowerPoint - 説明3_if文switch文(C_guide3)【2015新教材対応確認済み】.pptx

untitled

PowerPoint プレゼンテーション

Microsoft Word - no13.docx

プログラミング基礎

Microsoft PowerPoint - algo ppt [互換モード]

プログラミング及び演習 第1回 講義概容・実行制御

Taro-数値計算の基礎Ⅱ(公開版)

Microsoft PowerPoint - 計算機言語 第7回.ppt

第3回 配列とリスト

[Problem F] 古い記憶 良さそうな方法は思いつかなかった アイディア募集中!!! かなり強引に解いている 各判定データに対して 30 秒程度かかる 元の文章と改ざん文章の関係を考える ウィルス感染の可能性は高々 2 回であり 各々の感染では 1 文字削除 1 文字追加 1 文字変更が行われ

Microsoft PowerPoint - prog13.ppt

情報処理演習 B8クラス

講習No.9

I. Backus-Naur BNF S + S S * S S x S +, *, x BNF S (parse tree) : * x + x x S * S x + S S S x x (1) * x x * x (2) * + x x x (3) + x * x + x x (4) * *

Microsoft PowerPoint pptx

Microsoft PowerPoint - prog04.ppt

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

Microsoft PowerPoint - 5Chap15.ppt

cp-7. 配列

プログラミング基礎

株式会社アルウィン C 言語コーディング規約 ver.0.1

C言語入門

02: 変数と標準入出力

Microsoft PowerPoint - kougi8.ppt

Transcription:

0. 目次 1. 再帰的なデータ構造によるリストの表現 1. 1 リストの作成と表示 1. 1. 1 リストの先頭に追加する方法 1. 1. 2 リストの末尾に追加する方法 1. 1. 3 昇順を保存してリストに追加する方法 1. 2 問題 問題 1 問題 2-1 -

1. 再帰的なデータ構造によるリストの表現 リストは データの一部に次のデータの記憶場所を示す情報 ( ポインタという ) を持つ構造をいう データの挿入 削除等ができる 構造体を用いた再帰的なデータ構造 ( 構造体のメンバに他の構造体を指すポインタを含む ) でリストを実現する head は リストの先頭を指すポインタ変数 矢印はポインタ NULL はデータの最後を意味する ヌルポインタと呼ばれる head NULL 空リストは head に NULL を代入して表す head NULL ポインタ変数を使って リストを処理するプログラムを作成する場合 一般的な処理と特別な処理に分類して書き 両者をまとめると簡潔なプログラムになる - 2 -

1. 1 リストの作成と表示 リスト作成法を 3 つ示す 作成法 1 : データ (11,22,33) をリストの先頭に追加していく head NULL head 11 NULL head 22 11 NULL head 33 22 11 NULL 作成法 2 : データ (11,22,33) をリストの末尾に追加していく head NULL head 11 NULL head 11 22 NULL head 11 22 33 NULL 作成法 3 : データ (33,11,22) を昇順を保存しながらリストに追加してく head NULL head 33 NULL head 11 33 NULL head 11 22 33 NULL - 3 -

1. 1. 1 リストの先頭に追加する方法 リストの先頭を指すポインタ変数 head と新たなデータを指すポインタ変数 r が必要である 一般的な処理は 処理 1 : 既存のリストの先頭に 新たなデータを追加する場合への対応 になる 特別な処理は 処理 2 : 空リストに 最初のデータを追加する場合への対応 になる 前者と後者を組み合わせると 簡潔なプログラムになる 処理 1 処理前 head 22 11 NULL 処理後 head 22 11 NULL 5 4 r 2 33 1 3 /* データの読込み */ scanf("%d",&data); /* ポインタ変数の設定 */ 1 r = (struct NODE *)malloc(sizeof(struct NODE)); /* リストへの追加 */ 2 r->info = data; 3 r->next = NULL; 4 r->next = head; 5 head = r; 処理 2 処理前 head NULL 5 3 処理後 head 2 11 NULL r 1 scanf("%d",&data); 1 r = (struct NODE *)malloc(sizeof(struct NODE)); 2 r->info = data; 3 r->next = NULL; 5 head = r; - 4 -

処理 1 と処理 2 をまとめると つぎのようになる 1 2 3 5 4 処理 1 と処理 2 を比較すると 1 2 3 5 が共通で 4 が異なる したがって 処理 1 のときにのみ 4 を実行するように if 文で記述すればよい この結果 次のプログラムを得る プログラム ( ls111.c) 1 /* << ls111.c >> */ 2 /* リストの作成と表示 */ 3 #include <stdio.h> 4 #include <stdlib.h> 5 struct NODE { 6 int info; 7 struct NODE *next; /* nextはポインタ変数 */ 8 }; 9 10 int main() { 11 struct NODE *head, /* リストの先頭を指すポインタ変数 */ 12 *p, /* 作業用ポインタ */ 13 *r; /* 新たなデータを指すポインタ変数 */ 14 int data; /* データ */ 15 16 /* リストの作成 */ 17 18 /* 初期設定 */ 19 head = NULL; 20 21 while( 1 ) { 22 /* データの読み込み */ 23 scanf("%d",&data); if( data <= 0 ) { break; } 24 25 /* データの追加 */ 26 r = (struct NODE *)malloc(sizeof(struct NODE)); /*1 */ 27 r->info = data; /*2 */ 28 r->next = NULL; /*3 */ 29 30 /* 処理 1 */ 31 if( head!= NULL ) { - 5 -

32 r->next = head; /*4 */ 33 } 34 head = r; /*5 */ 35 } 36 37 /* リストの表示 */ 38 printf(" リスト : "); 39 p = head; 40 while( p!= NULL ) { 41 printf("%d ",p->info); 42 p = p->next; 43 } 44 printf("\n"); 45 } 実行結果 % cc ls111.c 0 リスト : 11 0 リスト : 11 11 22 0 リスト : 22 11 11 22 33 44 55 0 リスト : 55 44 33 22 11-6 -

1. 1. 2 リストの末尾に追加する方法 リストの先頭を指すポインタ変数 head と末尾を指すポインタ変数 t と新たなデータを指すポインタ変数 r が必要である 一般的な処理は 処理 1 : 既存のリストの末尾に 新たなデータを追加する場合への対応 になる 特別な処理は 処理 2 : 空リストに 最初のデータを追加する場合への対応 になる 前者と後者を組み合わせると 簡潔なプログラムになる 処理 1 処理前 head 11 22 NULL t ポインタ変数 t はリストの末尾を指す 処理後 head 11 22 4 1 r 2 33 NULL 5 3 t /* データの読込み */ scanf("%d",&data); /* ポインタ変数の設定 */ 1 r = (struct NODE *)malloc(sizeof(struct NODE)); /* リストへの追加 */ 2 r->info = data; 3 r->next = NULL; 4 t->next = r; /* ポインタ変数 t はリストの末尾を指す */ 5 t = r; 処理 2 処理前 head NULL t 6 処理後 head 2 11 NULL 5 3 r 1 t ポインタ変数 tはリストの末尾を指す scanf("%d",&data); 1 r = (struct NODE *)malloc(sizeof(struct NODE)); 2 r->info = data; 3 r->next = NULL; 6 head = r; 5 t = r; - 7 -

処理 1 と処理 2 をまとめると つぎのようになる 1 2 3 6 4 5 処理 1 と処理 2 を比較すると 1 2 3 5 が共通で 4 6 が異なる したがって 処理 1 のときに 4 を実行し 処理 2 のときに 6 を実行するように if~ else 文で記述すればよい この結果 次のプログラムを得る プログラム ( ls112.c) 1 /* << ls112.c >> */ 2 /* リストの作成と表示 */ 3 #include <stdio.h> 4 #include <stdlib.h> 5 struct NODE { 6 int info; 7 struct NODE *next; /* nextはポインタ変数 */ 8 }; 9 10 int main() { 11 struct NODE *head, /* リストの先頭を指すポインタ変数 */ 12 *p, /* 作業用ポインタ */ 13 *r, /* 新たなデータを指すポインタ変数 */ 14 *t; /* リストの末尾を指すポインタ変数 */ 15 int data; /* データ */ 16 17 /* リストの作成 */ 18 19 /* 初期設定 */ 20 head = NULL; 21 22 while( 1 ) { 23 /* データの読み込み */ 24 scanf("%d",&data); if( data <= 0 ) { break; } 25 26 /* データの追加 */ 27 r = (struct NODE *)malloc(sizeof(struct NODE)); /*1 */ 28 r->info = data; /*2 */ 29 r->next = NULL; /*3 */ 30 31 if( head == NULL ) { 32 /* 処理 2 */ - 8 -

33 head = r; /*6 */ 34 } else { 35 /* 処理 1 */ 36 t->next = r; /*4 */ 37 } 38 t = r; /*5 */ 39 } 40 41 /* リストの表示 */ 42 printf(" リスト : "); 43 p = head; 44 while( p!= NULL ) { 45 printf("%d ",p->info); 46 p = p->next; 47 } 48 printf("\n"); 49 } 実行結果 % cc ls121.c 0 リスト : 11 0 リスト : 11 11 22 0 リスト : 11 22 11 22 33 44 55 0 リスト : 11 22 33 44 55-9 -

1. 1. 3 昇順を保存してリストに追加する方法 リストの先頭を指すポインタ変数 head と新たなデータを指すポインタ変数 r に加えて 挿入位置を探し 挿入位置の直前の要素を指すポインタ変数 q と 挿入位置の直後の要素を指すポインタ変数 p が必要である 一般的な処理は 処理 1 : 既存のリストに 昇順を保存しながら新たなデータを追加する場合への対応 になる 特別な処理は 処理 2 : 空リストに 最初のデータを追加する場合への対応 になる 前者と後者を組み合わせると 簡潔なプログラムになる 処理 1 リストの途中に追加する場合 処理前 head 22 44 NULL ポインタ変数 q は 挿入位置の直前の要素を指す ポインタ変数 p は 挿入位置の直後の要素を指す q p 処理後 head 22 44 NULL 4 5 r 2 33 1 3 /* データの読込み */ scanf("%d",&data); /* ポインタ変数の設定 */ 1 r = (struct NODE *)malloc(sizeof(struct NODE)); /* リストへの追加 */ 2 r->info = data; 3 r->next = NULL; /* 挿入位置を探す ポインタ変数 p は 挿入位置の直後の要素 ポインタ変数 q は 直前の要素を指す */ 4 q->next = r; 5 r->next = p; - 10 -

リストの先頭に追加する場合 処理前 head 22 44 NULL ポインタ変数 q は 挿入位置の直前の要素を指す ポインタ変数 p は 挿入位置の直後の要素を指す q NULL p 処理後 head 22 44 NULL 6 r 2 11 1 5 3 /* データの読込み */ scanf("%d",&data); /* ポインタ変数の設定 */ 1 r = (struct NODE *)malloc(sizeof(struct NODE)); /* リストへの追加 */ 2 r->info = data; 3 r->next = NULL; /* 挿入位置を探す ポインタ変数 p は 挿入位置の直後の要素 ポインタ変数 q は 直前の要素を指す */ 6 head = r; 5 r->next = p; リストの末尾に追加する場合 処理前 head 22 44 NULL ポインタ変数 q は 挿入位置の直前の要素を指す ポインタ変数 p は 挿入位置の直後の要素を指す q p NULL 処理後 head 22 44 r 2 55 NULL 1 3 /* データの読込み */ scanf("%d",&data); /* ポインタ変数の設定 */ 1 r = (struct NODE *)malloc(sizeof(struct NODE)); /* リストへの追加 */ 2 r->info = data; 3 r->next = NULL; /* 挿入位置を探す ポインタ変数 p は 挿入位置の直後の要素 ポインタ変数 q は 直前の位置を指す */ 4 q->next = r; 4-11 -

処理 2 空リストに追加する場合 処理前 head NULL q NULL 6 処理後 head 2 11 NULL 3 r 1 p NULL scanf("%d",&data); 1 r = (struct NODE *)malloc(sizeof(struct NODE)); 2 r->info = data; 3 r->next = NULL; 6 head = r; 処理 1 と処理 2 をまとめると つぎのようになる 1 2 3 4 6 5 処理 1 と処理 2 を比較すると 1 2 3 が共通である つぎに 空リストに追加する場合と空でないリストの先頭に追加する場合は ポインタ変数 p とポインタ変数 head が一致し リストの途中と末尾に追加する場合は ポインタ変数 p とポインタ変数 head が一致しないので 4 と 6 の処理を if ~ else 文で記述する 最後に リストの途中に追加する場合とリストの先頭に追加する場合は ポインタ変数 p が NULL でないので 処理 5 を記述する - 12 -

この結果 次のプログラムを得る プログラム ( ls113.c) 1 /* << ls113.c >> */ 2 /* リストの作成と表示 */ 3 #include <stdio.h> 4 #include <stdlib.h> 5 struct NODE { 6 int info; 7 struct NODE *next; /* nextはポインタ変数 */ 8 }; 9 10 int main() { 11 struct NODE *head, /* リストの先頭を指すポインタ変数 */ 12 *p, /* 挿入位置の直後の要素を指すポインタ変数 */ 13 *q, /* 挿入位置の直前の要素を指すポインタ変数 */ 14 *r, /* 新たなデータを指すポインタ変数 */ 15 *s; /* 作業用ポインタ */ 16 int data; /* データ */ 17 18 /* リストの作成 */ 19 20 /* 初期設定 */ 21 head = NULL; 22 23 while( 1 ) { 24 /* データの読み込み */ 25 scanf("%d",&data); if( data <= 0 ) { break; } 26 27 /* データの追加 */ 28 r = (struct NODE *)malloc(sizeof(struct NODE)); /* 1 */ 29 r->info = data; /*2 */ 30 r->next = NULL; /*3 */ 31 32 /* 追加する位置を見つける 33 ポインタ変数 pは 挿入位置の直後の要素 34 ポインタ変数 qは 挿入位置の直前の位置を指す */ 35 p = head; 36 q = NULL; 37 while( p!= NULL ) { 38 if( p->info > data ) { break; } 39 q = p; 40 p = p->next; 41 } 42 43 /* 追加位置を見つけた */ 44 if( p == head ) { 45 /* 空リストに追加する場合 46 リストの先頭に追加する場合 */ - 13 -

47 head = r; /*6 */ 48 } else { 49 /* リストの末尾に追加する場合 50 リストの途中に追加する場合 */ 51 q->next = r; /*4 */ 52 } 53 if( p!= NULL ) { 54 /* リストの途中に追加する場合 55 リストの先頭に追加する場合 */ 56 r->next = p; /*5 */ 57 } 58 } 59 60 /* リストの表示 */ 61 printf(" リスト : "); 62 s = head; 63 while( s!= NULL ) { 64 printf("%d ",s->info); 65 s = s->next; 66 } 67 printf("\n"); 68 } 実行結果 % cc ls131.c 0 リスト : 11 0 リスト : 11 22 44 33 11 0 リスト : 11 22 33 44 55 88 22 11 44 99 66 33 77 0 リスト : 11 22 33 44 55 66 77 88 99-14 -

1. 2 問題 問題 1 リスト作成 ( 作成法 1 による ) 後 リスト中のデータの個数を出力するプログラムを完成せよ プログラム ( ls121.c) 1 /* << ls121.c >> */ 2 #include <stdio.h> 3 #include <stdlib.h> 4 struct NODE { 5 int info; 6 struct NODE *next; /* next はポインタ変数 */ 7 }; 8 9 int main() { 10 struct NODE *head, 11 *p, 12 *r; 13 int count, /* データの個数を保存する変数 */ 14 data; 15 16 /* リストの作成 */ 17 head = NULL; 18 19 while( 1 ) { 20 /* データの読み込み */ 21 scanf("%d",&data); if( data <= 0 ) { break; } 22 23 r = (struct NODE *)malloc(sizeof(struct NODE)); 24 r->info = data; 25 r->next = NULL; 26 27 if( head!= NULL ) { 28 r->next = 1 ; 29 } 30 head = 2 ; 31 } 32 33 count = 0; 34 /* リストをたどりデータの個数を求める */ 35 p = 3 ; 36 while( p!= NULL ) { 37 count++; p = 4 ; 38 } - 15 -

39 printf("%d\n",count); 40 } 実行結果 % cc ls121.c 0 0 11 0 1 11 22 0 2 11 22 33 44 55 0 5-16 -

問題 2 リスト作成 ( 作成法 2 による ) 後 円状に並ぶリストにして 先頭から 7 個のデータを出力するプログラムを完成せよ head 11 22 33 上記の場合 11 22 33 11 22 33 11 と出力される プログラム ( ls122.c) 1 /* << ls122.c >> */ 2 /* リストの作成と表示 */ 3 #include <stdio.h> 4 #include <stdlib.h> 5 struct NODE { 6 int info; 7 struct NODE *next; /* nextはポインタ変数 */ 8 }; 9 10 int main() { 11 struct NODE *head, 12 *p, 13 *r, 14 *t; 15 int count, 16 data; 17 18 /* リストの作成 */ 19 20 /* 初期設定 */ 21 head = NULL; 22 23 while( 1 ) { 24 /* データの読み込み */ 25 scanf("%d",&data); if( data <= 0 ) { break; } 26 27 /* データの追加 */ 28 r = (struct NODE *)malloc(sizeof(struct NODE)); 29 r->info = data; 30 r->next = NULL; 31 32 if( head == NULL ) { 33 /* 処理 2 */ 34 head = r; 35 } else { 36 /* 処理 1 */ 37 t->next = r; - 17 -

38 } 39 t = r; 40 } 41 42 /* 円上に並ぶようにする */ 43 5 ; 44 45 /* 出力 */ 46 printf(" 出力 : "); 47 p = head; 48 count = 0; 49 while( p!= NULL ) { 50 printf("%d ",p->info); 51 count++; 52 if( count == 7 ) { break; } 53 p = p->next; 54 } 55 printf("\n"); 56 } 実行結果 % cc ls122.c 0 出力 : 11 22 33 0 出力 : 11 22 33 11 22 33 11 11 22 33 44 55 66 77 88 99 0 出力 : 11 22 33 44 55 66 77-18 -