• Tidak ada hasil yang ditemukan

(linked list) \「値」と「その次を指すもの」との組

N/A
N/A
Protected

Academic year: 2024

Membagikan "(linked list) \「値」と「その次を指すもの」との組"

Copied!
26
0
0

Teks penuh

(1)

リスト構造(linked list)

「値」と「その次を指すもの」との組

を基本単位としたデータ構造

節点(node):

その節点自身の内容

次の節点を指すポインタ

−→ 自身と同じ型へのポインタを

要素として持つ構造体として実装

(2)

int型の値を持つ節点の実装

節点を基本の型とする typedef struct node {

int val;

struct node *next;

} Node;

節点へのポインタを基本の型とする typedef struct node {

int val;

struct node *next;

} *Link;

(3)

リスト構造の基本操作

新規作成

走査

削除

挿入

(4)

リストからの節点の削除

target tmp

(1) 削除したい節点の手前の節点に、追跡用ポイ ンタを向ける

(2) 削除したい節点を憶えておく

(3) 削除したい節点の次の節点に、追跡用ポイン タの指す節点の次へのリンクを向ける (4) 削除したい節点の領域解放

(5)

リストへの節点の挿入

target tmp

(1) 挿入したい場所の手前の節点に、追跡用ポイ ンタを向ける

(2) 挿入したい場所の次の節点を憶えておく (3) 挿入する節点を領域確保し、追跡用ポインタ

の指す節点の次へのリンクを新節点に向ける (4) 憶えておいた節点に、新節点の次へのリンク

を向ける

(6)

課題3:(〆切 11/3()) リストを用いて、

次々と入力した整数値を

大きさの順に並べ替えて表示するプログラム list2.c を作成せよ。

入力した整数を値とする新節点を、リストの 適切な場所に挿入し、作成したリストの各節 点の値が大きさの順になるようにする

0 が入力されたら終了

先頭からリストを辿って全ての値を順に表示

(7)

リストで表せるデータ構造の中で、

それに対して限られた操作しか行なわない 特殊な構造がある。

スタック:

先頭での挿入・削除のみ

キュー:

末尾への追加・先頭からの削除のみ

(8)

プッシュダウンスタック(pushdown stack)

in out

新しい要素を先頭に挿入 (プッシュ(push))

先頭の要素を取り出して削除 (ポップ(pop))

Last-In First-Out (LIFO)

(9)

プッシュダウンスタック(pushdown stack)

型定義

typedef struct node *Link;

struct node { int val;

Link next;

};

プッシュ: void push( Link, int );

ポップ: int pop( Link );

空判定: int isstackempty( Link );

(10)

FIFOキュー(queue)

in out

新しい要素を末尾に挿入

先頭の要素を取り出して削除 First-In First-Out (FIFO)

(11)

演習 5

配列とリストとについて、

それぞれの長所・短所をまとめ、

どのような場合に

どちらを使うのが

どんな意味で

効率的か、例を挙げて考察せよ。

(12)

これでリストの基本は一段落。

今度はもっと豊富な構造として、

「次」が複数に枝分かれする

構造を考えよう。

−→

(tree) 構造

(13)

これでリストの基本は一段落。

今度はもっと豊富な構造として、

「次」が複数に枝分かれする

構造を考えよう。

−→

(tree) 構造

(14)

(tree)・二分木(binary tree) root

edge

leaf subtree

(15)

次回までの宿題 (考えてくること) (1) (二分木と限らず)

木構造を持つと見るべきデータの具体例を、

身の回りで探せ。

(2) 例えば、3+4*2 とか 3*4+2 とかのように、

二項演算子で書かれた式は、

内在的に二分木の構造を持っている。

それを図に表せ。

また、その式の値を計算するには どうしたらよいか。

(16)

二分木の型定義

typedef struct node { int val;

struct node *left;

struct node *right;

} *Link;

val

left right

(17)

課題4:(〆切 11/10()) 二分木を用いて、

次々と入力した整数値を

大きさの順に並べ替えて表示するプログラム tree.c を作成せよ。

(18)

課題4:(〆切 11/10())

木のどの節点についても次の条件が成り立つ ように、入力した整数を値とする新節点を、

木の適切な先端に追加する。

? その左にある部分木のどの要素の値も、

その節点の要素の値より小さい

? その右にある部分木のどの要素の値も、

その節点の要素の値より大きい

0 が入力されたら終了

先頭から木を辿って全ての値を順に表示

(19)

実習4.1

コーディングする前に、

適当なデータを例に、

「箱と矢印の図式」を自分で書いてみて、

木の「成長」の仕組みを理解せよ。

: 123,45,678,90,12,345,6789,0

(20)

木の先端への節点の追加

木の先端まで左右のどちらを辿るかを

適切に選択する他は、

先端まで辿る要領はリストと同様

次を行なう関数 new Node() を作成せよ (1) 動的に領域確保

(2) 要素の値を設定

(3) 左右のリンクをNULLに初期化 (4) 節点へのポインタを返す

(21)

木の走査・表示

リストと異なり枝分かれがあるので、

全ての節点を走査して表示することが 既に自明な問題ではない !!

−→ 状況に応じて色々な辿り方がある !!

(22)

木の走査・表示

多くの場合、次を適切な順番で行なえば良い

左の部分木を表示

右の部分木を表示

自分自身の要素を表示 今の問題では、

どうすれば大きさ順の表示になるか ?

(23)

木の走査・表示

多くの場合、次を適切な順番で行なえば良い

左の部分木を表示

右の部分木を表示

自分自身の要素を表示 今の問題では、

どうすれば大きさ順の表示になるか ?

(24)

木の走査・表示

(1) 左の部分木を表示 (2) 自分自身の要素を表示 (3) 右の部分木を表示

「部分木の表示」には

自分(木を表示する関数)自身を呼び出す

−→ 関数の再帰呼出

(recursive function call)

(25)

木の走査・表示

(1) 左の部分木を表示 (2) 自分自身の要素を表示 (3) 右の部分木を表示

「部分木の表示」には

自分(木を表示する関数)自身を呼び出す

−→ 関数の再帰呼出

(recursive function call)

(26)

木の走査・表示

(1) 左の部分木を表示 (2) 自分自身の要素を表示 (3) 右の部分木を表示

「部分木の表示」には

自分(木を表示する関数)自身を呼び出す

−→ 関数の再帰呼出

(recursive function call)

Referensi

Dokumen terkait

はじめに 私たちの作品は、4人の監督がそれぞれの監修 のもとで作った4本のショートムービーを集めた 短編集である。 卒業制作に取り掛かる際、まず各々の作りたい 映像作品の構想を提示し合い、それらに共通した ものは何かということを話し合った。その結果、 全作品に一貫したテーマは「現実」と「非現実」 に決定した。この2つを比較したり、融合したり、

みんなで考えて調べる小学理科ワークシート5年 10 もののとけ方 実験2-A 5年 組 名前( ) 【はてな?】 問題 【調べよう】実験2-A 水の量 50mLと100mLの水で,食塩やミョウバンのとける量を調べよう。 【予想を書こう】食塩やミョウバンをたくさんとかすにはどうすればよいか予想しましょう。 食塩やミョウバンをたくさんとかすには, とよい。

みんなで考えて調べる小学理科ワークシート5年 9もののとけ方 実験5-A 5年 組 名前( ) 【はてな?】 問題 【実験5-A】温度を下げる ミョウバンの水よう液を冷やさないときと冷やすときで,つぶの出方を調べよう。 【予想を書こう】 水よう液にとけているミョウバンを取り出す方法について予想しましょう。 を下げると出てくると思う。

本学級は,算数が「好き」「楽しい」と感じる児童が大半ではあるものの,それは主に計算練習の場面で 感じているようである。そのため,同じ計算の分野でも自分の考え方をノートにまとめることは難しいと 感じている児童が多い。また,友だちとペアで自分の考えを伝え合うことは概ねできているが,みんなの

13 8 43 ○整数の筆算の仕方をもとに小数 ÷1位数の筆算の仕方を考え,筆 算で計算することができる。 ・小数÷1位数の筆算 態度整数のわり算の筆算をもとに して,小数÷1 位数の筆算の仕 方を考えようとしている。《発言・ ノート》 知技小数÷1 位数の筆算の仕方 を理解し,筆算で計算することが できる。《ノート》 9 44

KSKQ第二4馳郵使物iigIjl<サロン。あくの>通巻5896120841H5lll711 り、新たな自立観について次のように続けて いる。「自分のできることはしなければいけ ませんが、自分の力量を超えるような問題で すよね、階段という障害物があった場合は、 それから逃げないで、その時には、むしろ見 ず知らずの他人に対して、援助を求めると

Fermatの小定理p を素数とするとき、a∈Z に対しap ≡a mod p となる。 これを二通りで証明しよう。 1 乗法的 a6 |p ならばap−1 ≡1 mod p であることを示すことにより証明せよ。 2 加法的二項係数の性質から a+bp ≡ap+bp mod pを導き、a に関する帰納 法を用いて証明せよ。Fermat

Fermatの小定理p を素数とするとき、a∈Z に対しap ≡a mod p となる。 これを二通りで証明しよう。 1 乗法的p と互いに素な整数 a に対し、ap−1 ≡1 mod p であることを示すこと により証明せよ。 2 加法的二項係数の性質から a+bp ≡ap+bp mod pを導き、a に関する帰納 法を用いて証明せよ。Fermat