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

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

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

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

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

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

プログラミングI第10回

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

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

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

Microsoft PowerPoint - kougi9.ppt

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

PowerPoint Template

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

PowerPoint プレゼンテーション

Microsoft PowerPoint - 06.pptx

Microsoft Word - no206.docx

PowerPoint プレゼンテーション

第2回

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

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

Microsoft Word - 13

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

第3回 配列とリスト

Microsoft PowerPoint - 05.pptx

memo

Microsoft PowerPoint - lec10.ppt

Microsoft PowerPoint - kougi10.ppt

< F2D837C E95CF CF68A4A94C5816A2E6A>

memo

第2回

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

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

memo

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

Microsoft Word - no205.docx

PowerPoint Presentation

Microsoft PowerPoint - 11.pptx

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

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

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)* (

r07.dvi

ohp07.dvi

Microsoft Word - 3new.doc

untitled

Prog1_10th

Prog1_15th

PowerPoint プレゼンテーション

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

O(N) ( ) log 2 N

情報処理演習 B8クラス

Microsoft Word - no15.docx

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) * *

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

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

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

PowerPoint プレゼンテーション

memo

kiso2-09.key

/* do-while */ #include <stdio.h> #include <math.h> int main(void) double val1, val2, arith_mean, geo_mean; printf( \n ); do printf( ); scanf( %lf, &v

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

文字数は1~6なので 同じ本数の枝を持つパスで生成される呪文の長さは最大で6 倍の差がある 例えば 上図のようなケースを考える 1サイクル終了した時点では スター節点のところに最強呪文として aaaaaac が求まる しかしながら サイクルを繰り返していくと やがてスター節点のところに aaaaaa

演算増幅器

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

PowerPoint Presentation

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

:30 12:00 I. I VI II. III. IV. a d V. VI

Microsoft PowerPoint - 6.pptx

Microsoft PowerPoint - 5Chap15.ppt

Microsoft Word - no12.doc

main

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

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

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

:30 12:00 I. I VI II. III. IV. a d V. VI

木構造の実装

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

memo

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

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

memo

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

超初心者用

memo

C による数値計算法入門 ( 第 2 版 ) 新装版 サンプルページ この本の定価 判型などは, 以下の URL からご覧いただけます. このサンプルページの内容は, 新装版 1 刷発行時のものです.

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

PowerPoint プレゼンテーション

プログラミング基礎

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

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

PowerPoint Presentation

slide5.pptx

P05.ppt







<8B9E8B40925A904D D862E706466>

Transcription:

リスト Ⅲ 0. 目次 2. 基本的な操作 2. 1 リストから要素の削除 2. 2 リストの複写 2. 3 リストの連結 2. 4 問題 問題 1 問題 2-1 -

2. 基本的な操作 2. 1 リストから要素の削除 まず 一般的な処理を書き つぎに 特別な処理を書く 一般的な処理は 処理 1 : リスト中に 削除するデータを見つけ 削除する場合への対応 特別な処理は 処理 2 : 先頭のデータを削除する場合への対応 になる 処理 1 ( 1 ) 削除前 head x NULL 変数 x : 削除データ ( 2 ) 削除データ xを見つける p head x NULL q 変数 p: 削除データを指すポインタ変数変数 q: 削除データの直前を指すポインタ変数 ( 3 ) 削除データ x を削除するために ポインタを変更する p head x NULL q->next = p->next; ( 4 ) 削除後 q head NULL - 2 -

処理 2 ( 1 ) 削除前 head x NULL 変数 x : 削除データ ( 2 ) 削除データ xを見つける p head x NULL q 変数 p: 削除データを指すポインタ変数変数 q: 削除データの直前を指すポインタ変数 ( 3 ) 削除後 head x NULL q->next = p->next; - 3 -

処理 1, 処理 2 をまとめて 次のプログラムを得る プログラム ( ls211.c) 1 /* << ls211.c >> */ 2 /* リストからデータの削除 */ 3 #include <stdio.h> 4 #include <stdlib.h> 5 struct NODE { 6 int info; 7 struct NODE *next; 8 }; 9 struct NODE *mlist(); 10 void slist(struct NODE *p); 11 12 int main() { 13 int x; 14 struct NODE *head, /* リストの先頭を指すポインタ変数 */ 15 *p, /* 削除データを指すポインタ変数 */ 16 *q; /* 削除データの直前を指すポインタ変数 */ 17 18 /* リストの作成 */ 19 head = mlist(); 20 21 while( 1 ) { 22 /* リストの表示 */ 23 printf(" 現在のリスト : "); 24 slist(head); 25 26 /* 削除データ xの読込 */ 27 scanf("%d",&x); 28 if( x == 0 ) { break; } 29 printf(" 削除データ : %d \n",x); 30 31 /* 削除 */ 32 33 /* 初期設定 */ 34 p = head->next; 35 q = head; 36 37 /* 削除位置を見つける */ 38 while( p!= NULL ) { 39 if( p->info == x ) { break; } 40 q = p; 41 p = p->next; 42 } 43 44 /* 削除データが見つかった場合 */ 45 if( p!= NULL ) { 46 q->next = p->next; - 4 -

47 } 48 } 49 } 実行結果 % cc ls211.c 11 22 22 33 0 現在のリスト : 11 22 22 33 22 削除データ : 22 現在のリスト : 11 22 33 22 削除データ : 22 現在のリスト : 11 33 11 削除データ : 11 現在のリスト : 33 33 削除データ : 33 現在のリスト : 0-5 -

2. 2 リストの複写 考え方 元のリストを先頭から末尾へたどりながら 新たなリストを作成していく ( 1 ) 複写前 head 11 22 33 NULL head1 NULL ( 2 ) 複写中 head 11 22 33 NULL head1 11 NULL ( 3 ) 複写中 head 11 22 33 NULL head1 11 22 NULL ( 4 ) 複写後 head 11 22 33 NULL head1 11 22 33 NULL - 6 -

ひとつずつ要素を複写 ( 1 ) 要素 11の複写前 p ポインタ変数 pは複写の対象要素を指す head 11 22 33 NULL head1 NULL p1 ポインタ変数 p1は 複写先リストの末尾を指す ( 2 ) 要素 11の複写後 p head 11 22 33 NULL head1 11 NULL p1 q ポインタ変数 qは生成された要素を指す ( 3 ) 要素 22の複写前 p head 11 22 33 NULL head1 11 NULL p1 q ( 4 ) 要素 22の複写後 p head 11 22 33 NULL head1 11 22 NULL p1 q - 7 -

プログラム ( ls221.c) 1 /* << ls221.c >> */ 2 /* リストの複写 */ 3 #include <stdio.h> 4 #include <stdlib.h> 5 struct NODE { 6 int info; 7 struct NODE *next; 8 }; 9 struct NODE *mlist(); 10 void slist(struct NODE *p); 11 12 int main() { 13 struct NODE *head, /* 複写元リストの先頭を指すポインタ変数 */ 14 *p, /* 複写元の対象要素を指すポインタ変数 */ 15 *q, /* データを指すポインタ変数 */ 16 *head1, /* 複写先リストの先頭を指すポインタ変数 */ 17 *t; /* 複写先リストの末尾を指すポインタ変数 */ 18 19 /* 複写元リストの作成と表示 */ 20 head = mlist(); 21 printf(" 複写元リスト : "); 22 slist(head); 23 24 /* 複写 */ 25 /* 複写先リストヘッドの作成 */ 26 head1 = (struct NODE *)malloc(sizeof(struct NODE)); 27 head1->next = NULL; 28 29 p = head->next; /* 複写元の対象要素を指す */ 30 t = head1; /* 複写先リストの末尾を指す */ 31 32 while( p!= NULL ) { 33 /* 複写先のデータを作成 */ 34 q = (struct NODE *)malloc(sizeof(struct NODE)); 35 q->info = p->info; 36 q->next = NULL; 37 38 /* 複写先のリストを作成 */ 39 t->next = q; 40 t = q; 41 p = p->next; 42 } 43 44 /* 複写リストの表示 */ 45 printf(" 複写先リスト : "); 46 slist(head1); 47 } - 8 -

実行結果 % cc ls221.c 0 複写元リスト : 複写先リスト : 11 0 複写元リスト : 11 複写先リスト : 11 11 22 0 複写元リスト : 11 22 複写先リスト : 11 22 11 22 33 44 55 0 複写元リスト : 11 22 33 44 55 複写先リスト : 11 22 33 44 55-9 -

2. 3 リストの連結 考え方 一方のリストの末尾と他方のリストの先頭をつなぐ ( 1 ) 連結前 head1 111 222 NULL head2 333 222 111 NULL ( 2 ) 連結後 head1 111 222 head2 333 222 111 NULL プログラム ( ls231.c) 1 /* << ls231.c >> */ 2 /* 2 つのリストの連結 3 リスト 1 の末尾とリスト 2 の先頭をつなげる */ 4 #include <stdio.h> 5 #include <stdlib.h> 6 struct NODE { 7 int info; 8 struct NODE *next; 9 }; 10 struct NODE *mlist(); 11 void slist(struct NODE *p); 12 13 int main() { 14 struct NODE *head1, /* リスト 1 の先頭を指すポインタ変数 */ 15 *head2, /* リスト 2 の先頭を指すポインタ変数 */ 16 *p, /* リスト 1 をたどる作業用ポインタ変数 */ 17 *q; /* リスト 1 の末尾を指すポインタ変数 */ 18 19 /* リスト 1 の作成と表示 */ 20 head1 = mlist(); 21 printf(" リスト 1 : "); 22 slist(head1); 23 24 /* リスト 2 の作成と表示 */ 25 head2 = mlist(); 26 printf(" リスト 2 : "); 27 slist(head2); 28-10 -

29 /* 2 つのリストの連結 */ 30 /* 初期設定 */ 31 p = head1->next; 32 q = head1; 33 34 /* リスト 1 をたどり 末尾の番地をポインタ変数 qに保存する */ 35 while( p!= NULL ) { 36 q = p; 37 p = p->next; 38 } 39 40 /* リスト 1 にリスト 2 を連結する */ 41 q->next = head2->next; 42 43 /* 連結リストの表示 */ 44 printf(" リスト 1 + リスト 2 : "); 45 slist(head1); 46 } 実行結果 % cc ls231.c 0 リスト 1 : 0 リスト 2 : リスト 1 + リスト 2 : 11 22 0 リスト 1 : 11 22 0 リスト 2 : リスト 1 + リスト 2 : 11 22 0 リスト 1 : 11 22 0 リスト 2 : 11 22 リスト 1 + リスト 2 : 11 22 11 22 33 0 リスト 1 : 11 22 33 44 55 66 77 0 リスト 2 : 44 55 66 77 リスト 1 + リスト 2 : 11 22 33 44 55 66 77-11 -

2. 4 問題 問題 1 リストから指定されたすべての要素を削除するプログラムを作成せよ プログラム ( ls241.c) 1 /* << ls241.c >> */ 2 /* リストからデータの削除 */ 3 #include <stdio.h> 4 #include <stdlib.h> 5 struct NODE { 6 int info; 7 struct NODE *next; 8 }; 9 struct NODE *mlist(); 10 void slist(struct NODE *p); 11 12 int main() { 13 int x; 14 struct NODE *head, /* リストの先頭を指すポインタ変数 */ 15 *p, /* 削除データを指すポインタ変数 */ 16 *q; /* 削除データの直前を指すポインタ変数 */ 17 18 /* リストの作成 */ 19 head = mlist(); 20 21 while( 1 ) { 22 /* リストの表示 */ 23 printf(" 現在のリスト : "); 24 slist(head); 25 26 /* 削除データ xの読込 */ 27 scanf("%d",&x); 28 if( x == 0 ) { break; } 29 printf(" 削除データ : %d \n",x); 30 31 /* 削除データを見つけながら削除する */ 32 p = head->next; 33 q = head; 34 while( p!= 1 ) { 35 if( p->info == x ) { 36 q->next = 2 ; 37 } else { 38 q = 3 ; 39 } 40 p = 4 ; 41 } 42 } 43 } - 12 -

実行結果 % cc ls241.c 11 22 33 11 22 11 0 現在のリスト : 11 22 33 11 22 11 33 削除データ : 33 現在のリスト : 11 22 11 22 11 22 削除データ : 22 現在のリスト : 11 11 11 11 削除データ : 11 現在のリスト : 0-13 -

問題 2 リストから指定された k 番目の要素を削除するプログラムを作成せよ ただし k は リストの先頭から k 番目を意味する また k が現在のリストの長さより大きい場合 何もしない 考え方 ( 1 ) 元のリスト ( 2 ) 2 番目の要素を見つけ削除する 11 22 33 NULL 11 22 33 NULL ( 3 ) 1 番目の要素を見つけ削除する 11 33 NULL 11 33 NULL 33 NULL ( 4 ) 3 番目の要素を見つけ削除する 33 NULL ( 5 ) 1 番目の要素を見つけ削除する 33 NULL NULL プログラム ( ls242.c) 1 /* << ls242.c >> */ 2 /* リストからデータの削除 */ 3 #include <stdio.h> 4 #include <stdlib.h> 5 struct NODE { 6 int info; 7 struct NODE *next; 8 }; 9 struct NODE *mlist(); 10 void slist(struct NODE *p); 11 12 int main() { 13 int count, /* リスト中の要素の個数 */ 14 k; - 14 -

15 struct NODE *head, /* リストの先頭を指すポインタ変数 */ 16 *p, /* 削除データを指すポインタ変数 */ 17 *q; /* 削除データの直前を指すポインタ変数 */ 18 19 /* リストの作成 */ 20 head = mlist(); 21 22 while( 1 ) { 23 /* リストの表示 */ 24 printf(" 現在のリスト : "); 25 slist(head); 26 27 /* 削除位置 kの読込 */ 28 scanf("%d",&k); 29 if( k <= 0 ) { break; } 30 printf(" 削除位置 : %d \n",k); 31 32 /* 削除 */ 33 34 /* 初期設定 */ 35 p = head->next; 36 q = head; 37 count = 0; 38 39 /* 削除位置を見つけ削除する */ 40 while( p!= 5 ) { 41 count++; 42 if( k == count ) { 43 q->next = 6 ; 44 break; 45 } 46 q = 7 ; 47 p = 8 ; 48 } 49 50 /* リストの表示 */ 51 printf(" リスト : "); 52 slist(head); 53 } 54 } - 15 -

実行結果 % cc ls242.c 11 22 33 44 55 0 現在のリスト : 11 22 33 44 55 3 削除位置 : 3 リスト : 11 22 44 55 現在のリスト : 11 22 44 55 1 削除位置 : 1 リスト : 22 44 55 現在のリスト : 22 44 55 5 削除位置 : 5 リスト : 22 44 55 現在のリスト : 22 44 55 3 削除位置 : 3 リスト : 22 44 現在のリスト : 22 44 0-16 -