c言語での単一連結リスト ③削除編
はじめに
c言語での単一連結リストをステップバイステップで書いてみて,構造を学ぶ.
以下の手順で作っていく♪
①「表示編」リストの情報を表示する機能を実装
②「挿入編」リストに情報を追加する機能を実装
③「削除編」リストの情報を削除する機能を実装
目標
[2| 次のノードのアドレス]→[4| 次のノードのアドレス]→[5| 次のノードのアドレス]→[7| 次のノードのアドレス]→ [10|NULL]
まず,上のリストの先頭のノードを削除して以下のリストを作る.
[4| 次のノードのアドレス]→[5| 次のノードのアドレス]→[7| 次のノードのアドレス]→ [10|NULL]
次に,上のリストの最後尾のノードを削除して以下のリストを作る.
[4| 次のノードのアドレス]→[5| 次のノードのアドレス]→[7| NULL]
最後に,上のリストのノード間にノードを挿入して以下のリストを作る.
[4| 次のノードのアドレス]→[7| NULL]
Step3.1: リスト先頭の削除
以下のようにmain.cを作成。
コンパイルして、実行してみる.
$ gcc main.c func.c
$ ./a.out
before
2
4
5
7
10
after
4
5
7
10
先頭の2のデータを持つノードが削除されているので完了!
Step3.2: リスト最後尾の削除
まず最後尾のノードを探す.
次に最後尾の直前のノードの指すアドレスをNULLにする.
そして最後尾のノードを解放する.
この手順でmain.cを修正.
コンパイルからの実行.
$ gcc main.c func.c
$ ./a.out
before
2
4
5
7
10
after
4
5
7
10のデータを持つ末尾のノードが削除されているからOK.
Step3.3: 中間のノードを削除
n番目のノードを削除するとき,n番目のノードを探す.
n-1番目のノードの指すアドレスをn+1番目のノードのアドレスにする.
n番目のノードを解放する.
この手順でmain.cを修正.
コンパイルからの実行.
$ gcc main.c func.c
$ ./a.out
before
2
4
5
7
10
after
4
7
5のデータを持つノードが削除されたからOK.
Step3.4: 一つの関数にまとめる
関数を一つにする.ついでに存在しないノードを削除の対象にしてしまったときのエラー処理も追加する. main.cを修正.
コンパイルからの実行.
$ gcc main.c func.c
$ ./a.out
before
2
4
5
7
10
after
4
7
さっきと同じ結果なのでOK.
Step3.5: ファイルを分割
いつも通り,ファイルを整理!
コンパイルからの実行.
$ gcc main.c func.c
$ ./a.out
before
2
4
5
7
10
after
4
7
さっきと同じ結果なのでOK.目標達成!!