プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌
前回までの復習 構造体 typedef 構造体のサイズ 構造体の応用 関数の引数に構造体を使う 関数の引数に構造体へのポインタを使う 構造体の配列
今日学ぶこと 共用体(union type) 列挙(enumerated type) 構造体、構造体のポインタ、typedefなどを用いた、リンクトリストの実装例
共用体 異なる型を持つ値を保持する ただし、同時に一つの値しか保持できない 共用体型の宣言 union 共用体型名 { }; 型名 識別子; 型名 識別子; … };
共用体の例 Sample11.cを打ち込んで、コンパイル・実行してみよう union YearにtypedefでYearという型名を与えている メンバーが異なる型の場合、unionのサイズ(sizeof 演算子の結果)はどうなるか? 試してみよう!
列挙型 識別子を値として格納できる型 構文 例 enum Week型の変数には、SUNからSATまでのいずれかを保持できる enum Week {SUN, MON, TUE, WED, THU, FRI, SAT}; enum Week型の変数には、SUNからSATまでのいずれかを保持できる Sample12.cを入力し、コンパイル・実行してみよう 列挙型を使うと、プログラムが分かりやすくなる
列挙型の数値を指定する 列挙型は、内部的には0から順に1づつ増える整数が割り当てられている 例 値を明示的に割り当てることも出来る typedef enum Week {SUN, MON, TUE, WED, THU, FRI, SAT} Week; この例だと、Week型は0から6までの整数値 値を明示的に割り当てることも出来る typedef enum Week {SUN, MON = 0, TUE = 5,…}; のように
列挙型とマクロを比較する マクロを使っても、同様にプログラムを読みやすくすることが出来る: 列挙型は自動的に値を割り振ってくれる #define SUN 0 などなど(教科書p. 381) 列挙型は自動的に値を割り振ってくれる デバッガでプログラムを追跡する際に、列挙子型の識別子名が表示される(かも) 列挙子型のスコープは定義されたブロックであること
リンクトリスト(Linked List) データが数珠つながりになったようなデータ構造(それぞれをノードnodeという) シーケンシャルアクセス(始めから順にしかアクセスできない) 途中にノードを挿入することが容易 次のノードには容易にアクセスできる 前のノードへのアクセスは困難 この点は、次にやるダブルリンクトリストを使うと解消できる
リンクトリストの実装 実装は、構造体を使う データそのものを表すメンバ 次の構造体を指すポインタ
構造体へのポインタをメンバに 次のような構造体を考えてみよう struct _Node { char *contents; struct _Node *next; }; 保持するデータは、contentsが指す文字列 nextは、次の構造体を指すポインタ
typedefで詳細を隠蔽 typedef struct _Node { char *contents; struct _Node *next; } *Node これで、Node型が定義された. 実際は、struct _Node 型のポインタだが、そのことは使う人には意識させない
メンバーへのアクセス Node型は、struct _Node型へのポインタなので、 Node n; n->contents = “abc”; のようになるが、マクロを使って、実装の詳細を隠蔽する #define NODE_GET_CONTENTS(n) (n)->contents #define NODE_GET_NEXT(n) (n)->next メンバへの代入も同様に、マクロで定義する
実装の詳細の隠蔽:メリット 実装の詳細を隠蔽(typedefなど) 使い方だけを公開(マクロによるアクセサ accesser) メリット? 後から内部の実装を変更できる コードの不要な部分を知らなくても使えるようにする
今日学んだこと 共用体(union type) 列挙(enumerated type) 構造体、構造体のポインタ、typedefなどを用いた、リンクトリストの実装例
レポート課題 (1)二つのリンクトリストsl1, sl2が与えられたとき、sl1の末尾にsl2を連結する関数、void sllist_append (SLList sl1, SLList sl2) を書け sl1の最後のノードまで読み飛ばし、sl1の最後のノードの次を、sl2のheadにすればよい (2)リンクトリストについて、文献などを調査したことを簡潔にまとめよ.
レポート課題 締め切り:2005年1月10日一杯(日本時間で) 提出:メールで木村(iwao@sci.toyama-u.ac.jp)まで. 感想などあると木村が喜びます