insert_position (linked list)
連結リストでの要素の途中挿入
ミニレポート第 5 回課題
第6回授業図5.11の
プログラムに教科書 P.58 List5.1 (1)
と同じ機能をもつ関数 insert_position を追加する.
insert_position の仕様
前提:以下の通りとする.(教科書と同じ)
-
リスト要素の構造体
struct CELL が定義されており,struct CELL 型の
グローバル変数 header が宣言されている.
-
header.next は連結リストの最初の要素を指す
ポインタであり,連結リストが空のときは NULL が格納されている.
-
各要素の next メンバが次の要素を指している.最後の要素の
next メンバには NULL が格納されている.
引数:struct CELL 型へのポインタと整数型の値が渡される.
戻り値:なし
関数定義の書き出し例: void insert_position(struct CELL *x, int v)
機能:渡されたパラメータがそれぞれ x と v だとすると
(上の関数定義の例)
x で指されたセルの
直後
に value の値が v である新しいセルを挿入する.
例えば,リストに要素が 4 個あり,内容が (2 5 12 -4)
であったとき insert_position(header.next, 6) を
実行すればリストは (2 6 5 12 -4) となり,このリストにさらに
insert_position(header.next->next, 8) を行うと
(2 6 8 5 12 -4) になる
引数として NULL など不正な値が渡されたときの
エラー処理はなくてもよい.意味のあるデータが渡されると
仮定してよい.
ヒント
-
まず第6回授業図5.11の
プログラムがベースになるのでこれをreport05.cとして保存する.
-
作成する insert_position の書き出しを指示の通りに作る.
内容が空の関数
void insert_position(struct CELL *x, int v)
{
}
を作る.場所はmain関数の前ならどこでも良いが insert_head の
定義が終了した直後に置けばいい.
-
教科書 p.58 の List5.1 の (1) を実装する.
今作った関数 insert_head の仮引数 x に
教科書と同じ挿入される新しいセルの直前のセルの
ポインタが入力され,仮引数 v に新しいセルの
value メンバ に入力されるべき値がセットされた状態で
この関数は動作する.List5.1(1) の 1-3 行目は同じことをすれば
いいのでそのまま書くが,4 行目の fatal_error が実験環境には無いので
4 行目は
に変える.
-
教科書 p.58 の List5.1 の (1)5 行目の
セルに値をセットする
は,ポインタ p で新しいセルが示されていて,その value
メンバに代入すべき値が仮引数 v にセットされているので
p->value = v;
と書く.
-
残りの 6,7 行は List 5.1 (1) と同じ.
-
main にテストとして 作った insert_position を使って
途中に要素を挿入する行を書き,確認するためにその行の
前後で print_all() を書いて要素を表示させる.
いろいろなテストを行なって insert_position が
正しく動作しているかどうかを確認する.例えば
課題ページに記載されている例で insert_position を実行して
変化を print_all で確認する main ルーチンは
int main(void)
{
new_list();
insert_head(-4);
insert_head(12);
insert_head(5);
insert_head(2);
print_all();
insert_position(header.next, 6);
print_all();
insert_position(header.next->next, 8);
print_all();
}
のようなものである.
プログラム全体についての注意
-
プログラムファイルの設置場所は演習サーバ
sirius.yamamotolab.jt.u-tokai.ac.jp 上の自分のホームディレクトリ
直下の c ディレクトリとし,
ファイル名は report05.c とする
-
プログラム全体としては
第6回授業図5.11
をベースにしてそれに insert_position を追加したものを作成せよ.
もともとあった構造体の定義,insert_head, new_list, print_all を
変更してはいけない.main 関数の前に
関数 insert_position(や必要であれば自作関数)を挿入せよ.
-
main 関数を書き換えて十分にテストを行い,
insert_position
が正しく動作していることを確認せよ.
レポート提出時には main 関数だけをこちらで用意したもので
置き換えてテストを行うので提出時の
report05.c の main 関数内はどんなものでもよい.
注意事項
-
締切は
2023年11月12日
とする.
-
メールでプログラムを提出する必要はない
-
締切後はレポート受理,非受理の結果がわかるまで上書き
しないように注意せよ
受理した学生のリストを
1 クラス提出者
2 クラス提出者
3 クラス提出者
に掲載する.
締切までに提出したにもかかわらず締切後一週間を過ぎても掲載されていない
場合は山本 <hiroshi@tokai.ac.jp>まで連絡せよ.
未提出の学生はすみやかに再提出せよ.
再提出後一週間経っても掲載されない場合も
山本まで連絡せよ.
Updated in November 4, 2019,
index.html,
Yamamoto Hiroshi Web