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.目標達成!!