線型リストを配列変数で実現する方法。
メリットは、「メモリ確保の時間がかからない」、「メモリ使用量が明確」である。
デメリットは、「データ数の上限を動的に変更できない」である。
ヘッダファイル cursorlist.h ソースファイル cursorlist.c
ノード
リスト
初期状態
格納部分と空き部分の様子
list0901.c の実行結果をプリントアウトし、動作の説明を書き込め。
list0902.c、および、list0903.c は、リストのデータをセーブしたりロードしたりする。セーブファイルはtmp1である。Makefile を完成させて、動作を確認せよ。
本プリントで説明したリスト構造では、ダミーノードを使用していない。そのため、remove の際、場合分けを要した。そこで、ダミーノードを使用するタイプのカーソル型リストのライブラリを作成せよ。そして、list0901.c、list0902.c、list0903.c は変更することなく動作することを確認せよ。
ヒント:cursorlist.h は次の部分が変更点である。
typedef struct { int max; // ノードの配列のサイズ Node *nodes; // ノードの配列の先頭、0番目はダミーノード Index free; // 追加可能個所のリストの先頭 } List;
2つのバージョンの cursorlist.h と cursorlist.c を使うことになる。同じディレクトリに同一の名前のファイルは2つ存在できないので、ファイル名を変更するしかない。しかし、list0901.c や Makefile のファイル名を変更するのは面倒である。
そこで、シンボリックリンクを使うと便利である。シンボリックリンクは、1つのファイルに対して複数のファイル名を与えるものである。Windowsでのショートカットと同じ働きをする。(詳しくは、man ln を実行してマニュアルを読もう。)
具体的には、まず、ダミーノードを使用しないプログラムのファイル名を cursorlist1.c、cursorlist1.h に変更し、ダミーノードを使用するプログラムのファイル名を cursorlist2.c、cursorlist2.h とする。
次に、ダミーノードを使用しないプログラムをコンパイルするときは、以下のようにする。
課題1の説明付き実行結果、および、課題2のコンパイルに使った Makefile を提出せよ。
課題3については、cursorlist2.c および cursorlist2.h をプリントアウトして、変更個所に下線を引く。そして、ダミーノードを使用するメリットを述べよ。
2005.6.15 by tokuhisa