Microsoft Word - no206.docx

Similar documents
Microsoft Word - no205.docx

Microsoft Word - no12.doc

Microsoft PowerPoint - kougi10.ppt

PowerPoint プレゼンテーション

Microsoft Word - no15.docx

PowerPoint プレゼンテーション

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

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

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

Microsoft PowerPoint - 05.pptx

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

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

memo

Microsoft Word - no11.docx

Microsoft Word - no202.docx

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

プログラミングI第10回

二分木の実装

Microsoft PowerPoint - kougi11.ppt

PowerPoint プレゼンテーション

Microsoft Word - no13.docx

Microsoft Word - 13

memo

Microsoft PowerPoint - lec10.ppt

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

PowerPoint Template

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

LIFO(last in first out, ) 1 FIFO(first in first out, ) 2 2 PUSH POP : 1

Microsoft Word - no204.docx

第3回 配列とリスト

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

プログラミング基礎

Microsoft PowerPoint - kougi9.ppt

第2回

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

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

memo

main

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

Microsoft Word - no103.docx

untitled

プログラミング基礎

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

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

Microsoft PowerPoint - 06.pptx

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

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

r07.dvi

ohp07.dvi

Prog1_15th

DA13

Microsoft PowerPoint - 14Chap17.ppt

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

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

PowerPoint Presentation

プログラミング基礎

PowerPoint プレゼンテーション

PowerPoint Presentation

memo

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

Microsoft PowerPoint - 6.pptx

Microsoft Word - 12

memo

演習課題No12

演算増幅器

memo

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

C言語7

Microsoft PowerPoint - 説明2_演算と型(C_guide2)【2015新教材対応確認済み】.pptx

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

Prog1_6th

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

Microsoft Word - no15.docx

木構造の実装

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

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

memo

C 言語第 3 回 2 a と b? 関係演算子 a と b の関係 関係演算子 等しい a==b 等しくない a!=b より大きい a>b 以上 a>=b より小さい a<b 以下 a<=b 状態 真偽 値 条件が満たされた場合 TRUE( 真 ) 1(0 以外 ) 条件が満たされなかった場合 F

Microsoft Word - no14.docx

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

Microsoft Word - NonGenTree.doc

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

Microsoft PowerPoint - 11.pptx

‚æ4›ñ

プログラミング実習I

講習No.9

r08.dvi

Microsoft PowerPoint - 7.pptx

Microsoft Word - no02.doc

void hash1_init(int *array) int i; for (i = 0; i < HASHSIZE; i++) array[i] = EMPTY; /* i EMPTY */ void hash1_insert(int *array, int n) if (n < 0 n >=

P06.ppt

P05.ppt

untitled

program7app.ppt

O(N) ( ) log 2 N

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

1 return main() { main main C 1 戻り値の型 関数名 引数 関数ブロックをあらわす中括弧 main() 関数の定義 int main(void){ printf("hello World!!\n"); return 0; 戻り値 1: main() 2.2 C main

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

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

Transcription:

3.2 双方向リスト 今までのリストは 前から順にたどることしかできませんでした 今度は逆にもたどることができる 双方向リストを扱います この場合は 構造体には次を表すポインタの他に前を表すポインタを持つ ことになります 今回は最初と最後をポインタを使うと取り扱いが面倒になるので 最初 (start) と最後 (end) を どちらとも構造体 ( 値は意味を持たない ) を使うことにします こうすることによって start を end を渡すときにポインタのポインタを利用しなくても良いことになります しかし データ自身 は 次のノードから入っていますので その点を注意しなければなりません ex31.c /* 双方向リスト */ #include <stdio.h> #include <stdlib.h> typedef struct node { int value; struct node *prev, *next; node; void insert_list(node *s, node *e, int x); void print_list(node *s, node *e); void print_list_rverse(node *s, node *e); int main(void) { node start, end; int i, x; start.next = &end; end.prev = &start; for(i = 0; i < 5; i++) { printf(" 値を入力してください : "); scanf("%d", &x); insert_list(&start, &end, x); print_list(&start, &end); print_list_rverse(&start, &end); return(0); /* データの挿入 */ void insert_list(node *s, node *e, int x) { node *new, *z; new = (node *)malloc(sizeof(node)); new->value = x; for(z = s ; z->next!= e && z->next->value < x; z = z->next); new->next = z->next; new->prev = z; z->next->prev = new; z->next = new; 41

/* データの表示 */ void print_list(node *s, node *e) { for(s = s->next ; s!= e; s = s->next) { printf("%d ", s->value); printf("null n"); /* データの表示 ( 逆順 ) */ void print_list_rverse(node *s, node *e) { for(e = e->prev ; e!= s; e = e->prev) { printf("%d ", e->value); printf("null n"); 練習問題 3.3 指定された値があるときにはそのノードのポインタを なければ指定された値より小さいもののう ち最大のノードのポインタを それも存在しないときには NULL を返す関数 find_node を作成せよ ex92.c /* 双方向リスト */ #include <stdio.h> #include <stdlib.h> typedef struct node { int value; struct node *prev, *next; node; void insert_list(node *s, node *e, int x); void print_list(node *s, node *e); node *find_node(node *s, node *e, int x); int main(void) { node start, end, *find; int i, x; start.next = &end; end.prev = &start; for(i = 0; i < 5; i++) { printf(" 値を入力してください : "); scanf("%d", &x); insert_list(&start, &end, x); print_list(&start, &end); printf(" 検索する整数 : "); scanf("%d", &x); find = find_node(&start, &end, x); if(find == NULL) { printf(" 見つかりませんでした n"); else { printf(" 見つかりました : %d(%p) n", find->value, find); return(0); 42

/* データの挿入 */ void insert_list(node *s, node *e, int x) { node *new, *z; new = (node *)malloc(sizeof(node)); new->value = x; for(z = s ; z->next!= e && z->next->value < x; z = z->next); new->next = z->next; new->prev = z; z->next->prev = new; z->next = new; /* データの表示 */ void print_list(node *s, node *e) { for(s = s->next ; s!= e; s = s->next) { printf("%d ", s->value); printf("null n"); /* データの探索 */ node *find_node(node *s, node *e, int x) { node *p; 43

3.3 二分木 リストの一種ですが 二つの子を持つ形で作ります ここでは簡単な例として 右の子は大きい 値 ( 等しい場合を含む ) を持ち 左の子は小さい値を持つリスト を作成してみます そのために 構造体には left と right という二つのポインタを用意します ex33.c #include <stdio.h> #include <stdlib.h> typedef struct node { int value; struct node *left; /* 左の子 */ struct node *right; /* 右の子 */ node; void add_binary(node **root, int x); void print_binary(node *x); int main(void) { int i, x; node *root = NULL; for(i = 0; i < 6; i++) { printf(" 値を入力してください : "); scanf("%d", &x); add_binary(&root, x); print_binary(root); printf(" n"); return(0); void add_binary(node **root, int data) { node *new, *x, *p; new = (node *)malloc(sizeof(node)); new->value = data; new->left = NULL; new->right = NULL; if(*root == NULL) { *root = new; else { x = *root; while(x!= NULL) { p = x; if(data <= x->value) { x = x->left; else { x = x->right; if(data <= p->value) { p->left = new; else { p->right = new; 44

void print_binary(node *x) { if(x!= NULL) { print_binary(x->left); printf("%4d", x->value); print_binary(x->right); 5, 4, 1, 3, 2, 6 と入力されたときに どのような 2 分木ができているか考えてみましょう 1, 4, 5, 3, 2, 6 と入力されたときに どのような 2 分木ができているか考えてみましょう と入力されたときに どのような 2 分木ができているか考えてみましょう 45

逆に 次のような二分木ができるのはどのような入力が行われたか考えてみよう どちらも 一通り ではありません 4 3 3 6 2 5 1 5 1 4 6 2 ここでの表示順は 通りがけ順 といわれるものです こうすると ちょうどソートと同じ結果にな ります print_binary 関数を変更すれば他の順序で表示することも可能です 実際に 実行して 違いを確かめておいてください 行きがけ順 void print_binary(node *x) { if(x!= NULL) { printf("%4d", x->value); print_binary(x->left); print_binary(x->right); 帰りがけ順 void print_binary(node *x) { if(x!= NULL) { print_binary(x->left); print_binary(x->right); printf("%4d", x->value; 46

問題 3.4 最小値を削除し 最小値のノードへのポインタを返す関数 delete_min を作成せよ ex34.c #include <stdio.h> #include <stdlib.h> typedef struct node { int value; struct node *left; /* 左の子 */ struct node *right; /* 右の子 */ node; void add_binary(node **root, int x); void print_binary(node *x); node *delete_min(node **r); int main(void) { int i, x; node *root = NULL, *min; for(i = 0; i < 6; i++) { printf(" 値を入力してください : "); scanf("%d", &x); add_binary(&root, x); print_binary(root); printf(" n"); min = delete_min(&root); printf(" 最小値 %d を削除しました n", min->value); print_binary(root); printf(" n"); return(0); void add_binary(node **root, int data) { node *new, *x, *p; new = (node *)malloc(sizeof(node)); new->value = data; new->left = NULL; new->right = NULL; if(*root == NULL) { *root = new; else { x = *root; while(x!= NULL) { p = x; if(data <= x->value) { x = x->left; else { x = x->right; if(data <= p->value) { p->left = new; else { p->right = new; 47

void print_binary(node *x) { if(x!= NULL) { print_binary(x->left); printf("%4d", x->value); print_binary(x->right); node *delete_min(node **r) { 48