• 検索結果がありません。

ヒントスライドPPT プログラミング演習2 #prog2bkc net

N/A
N/A
Protected

Academic year: 2018

シェア "ヒントスライドPPT プログラミング演習2 #prog2bkc net"

Copied!
11
0
0

読み込み中.... (全文を見る)

全文

(1)

第12週 木構造と探索(1)

(2)

2

分割コンパイル

 複数のファイルをそれぞれコンパイルし、生成され

たオブジェクトファイルをまとめる(リンク)する

こと

利点

 ・コンパイル時間の短縮

 ・オブジェクトファイルを利用・提供可能

gcc -c filename.c filename.o

オブジェクトファイルの生成方法

オプション“ -c” を指定する

オブジェクトファイル

(3)

分割コンパイルの例

prog.c と func.c にプログラムが分かれている場合。

 gcc -c prog.c を実行すると prog.o が作成される。

 gcc -c func.c を実行すると func.o が作成される。

 この2つのオブジェクトに対して

 gcc prog.o func.o -o prog とすると実行ファイル prog

を作成することができる。

今回は、 print_tree.c と自分で作成したファイル名 .c の分割コンパイルを行 う

print_tree.c はプロ演2公式サイトから ダウンロードできます

まとめたいオブジェクト の数だけ並べる

(4)

4

2 分探索木

 定義(広い意味での定義)

• 根付き 2 分木の各点に要素を1つずつ対称順に配置したもの

対称順とは

– 例えば下記のような順序関係を指す

例: 18 は、左側最大( 15 )より大きく、右側最小( 21 )より小さい 点 v の左側の

要素の最大値

点 v の要素

点 v の右側の 要素の最小値

18

9 22

4 12 21 31

25

7 15

(5)

正則 2 分木

定義

– 各点が左子、右子の両方の子を持つか、

または全く子を持たない根付き 2 分木

– (左子、右子の一方のみが存在する場合は正則 2 分木

ではない)

• すべての 2 分探索木は正則 2 分木として考えられる?

– 方法: 左子、右子の一方しか存在しない場合は外点

を追加して正則 2 分木に変形

– 外点: 要素が何も配置されていない点

(演習では要素0の点)

内点 18 外点

9 22

4 12 21 31

25

7 0

0 0 15 0 0

0

0 0 0 0 0

18

9 22

4 12 21 31

25

7 15

0

(6)

6

必須課題 12-1 : print_tree の出力の見方

      0 31

0

25 0

22

0 21

0 18

0

15 0

12

0 9

0

7 0

4

0

90 度回転

     031

025

022021018

015

01209

07

040

ルートノード

外点:ノードの値が0 print_tree の出力

(7)

必須課題 12- 1: new_node

struct node *new_node(int key)

確保した node 型の 要素の値 ポインタ

・機能 :

1. 構造体 node 型の領域を動的メモリ確保

2.  要素の値( key )を代入

3. 親・子を指すポインタはすべて NULL で初期

・引数 key: 要素の値 ( キー )

・戻り値 : 作成した構造体 node 型の要素へのポイン

struct node { int key;

struct node *parent, *left, *right; };

(8)

インデックスと点の対応

 2分木を構造体 node のポインタ配列 を使って表現

• struct node *n[10];

 配列のインデックスは key の値が小さい順に割り当て

8

22 18

9

25

21 31

15 12

4

7

n[5]n[5]

n[2]n[2]

n[0]n[0] n[3]n[3] n[6]n[6]

n[7]n[7]

n[9]n[9]

n[8]n[8] n[4]n[4]

n[1]n[1]

(9)

9

main() {

struct node *root, *n[10]; n[0] = new_node(4);

/* この間に適切なコードを書く */ n[5] = new_node(18);

/* この間に適切なコードを書く */ root = n[5];

n[0]->left = new_node(0); n[0]->right = n[1];

n[0]->parent = n[2];

/* この間に適切なコードを書く */ n[5]->left = n[2];

n[5]->right = n[7]; n[5]->parent = NULL;

/* この間に適切なコードを書く */ print_tree(root);

free_tree(root); }

値0は 外点

スケルトンコードの説明

ノードの値が小さい順に new_nodeを利用し

ノードを作成し、配列nに保存 ノードを繋ぎ

レジュメ p30 の実行例と同じ 2 分探索木を作成する

全てのノードのメモリを解放する プログラムは次ページを参照

18

9 22

4 12 21 31

25

7 0

0 0 15 0 0

0

0 0 0 0 0

(10)

10

free_tree: すべての node のメモリを解放する関数

void free_tree(struct node *node) { if(node != NULL){

free_tree(node->left); free_tree(node->right); free(node);

} }

(11)

著者リスト

1. 安積 卓也(情報システム学科)

2. 泉 朋子 (情報コミュニケーション学科)

参照

関連したドキュメント

Lane and Bands Table と同様に、Volume Table と Lane Statistics Table も Excel 形式や CSV

このように、このWの姿を捉えることを通して、「子どもが生き、自ら願いを形成し実現しよう

子どもが、例えば、あるものを作りたい、という願いを形成し実現しようとする。子どもは、そ

ダウンロードしたファイルを 解凍して自動作成ツール (StartPro2018.exe) を起動します。.

現行の HDTV デジタル放送では 4:2:0 が採用されていること、また、 Main 10 プロファイルおよ び Main プロファイルは Y′C′ B C′ R 4:2:0 のみをサポートしていることから、 Y′C′ B

次亜塩素酸ナトリウムは蓋を しないと揮発されて濃度が変 化することや、周囲への曝露 問題が生じます。作成濃度も

Google マップ上で誰もがその情報を閲覧することが可能となる。Google マイマップは、Google マップの情報を基に作成されるため、Google

QRされた .ino ファイルを Arduino に‚き1む ことで、 GUI |}した ƒ+どおりに Arduino を/‡((スタンドアローン})させるこ とができます。. 1)