ここでは,動的メモリ管理を用いて,単方向リストプログラムを実装する.可変長文字列対応のセル
課題②で作成したリストプログラムのセル構造体定義は,以下のようになっていた.
この構造体定義では,7文字までの文字列(ナル文字を含めて8バイト)しか格納することはできない.構造体定義の文字の配列サイズを増やせば,格納することができる文字列長は増加するが,短い文字列を格納した場合には無駄が多くなってしまう.
どのような長さの文字列であっても無駄なく記憶領域を使用できるように,構造体定義を以下のように変更する.
固定的に8バイトの文字配列を割り当ててあった string を,文字列へのポインタに変更する.文字列は動的に確保した領域に保存し,string 変数にはそのアドレスを格納する.
"dog" という文字列を格納したそれぞれのセルを図示すると,以下のようになる.
可変長文字列版リストの,空の状態および要素が2つ追加された状態を以下に示す.
可変長文字列版リストのメモリ確保操作
固定長文字列版でのメモリ確保
固定長文字列版リストの挿入操作(ListInsert 関数) では,CELL型構造体を確保した後に,引数として与えられた文字列をコピーするといた手順でセルを作成していた.
固定長文字列版リストの ListInsert 関数でのセル作成の部分を以下に図示する.(挿入処理の全体は 単方向リストの実装・ListInsert 関数 を参照)
1)初期状態
2) CELL構造体の確保
3) 文字列のコピー
可変長文字列版でのメモリ確保
可変長文字列版リストでは,上記の操作に加え,与えられた文字列の長さにあわせたメモリ領域を確保する操作が必要となる.
可変長文字列版でのメモリ確保操作を以下に図示する.
1)初期状態は固定長版と同じ.
2)CELL構造体の確保
2)文字列のための領域を確保
3)文字列のコピー
1) 課題②で作成したプログラムを,可変長文字列版に変更する.
変更する箇所は以下の4つの部分である.
- CELL型構造体定義
- ListInsert 関数
- ListDelete 関数
- ListDestroy 関数
2) main 関数をテスト用メイン関数と差し替え,課題1のときと同様に正しく動作するか,メモリリークが発生していないかを確認する.
3) main 関数を初期状態に戻し,追加する文字列の長さを変更しながら動作確認をする.特に,8〜20文字程度の文字列を入力したときの固定長文字列版との動作の違いがあるかに注意する.