c言語での単一連結リスト ②挿入編

はじめに

c言語での単一連結リストをステップバイステップで書いてみて,構造を学ぶ.
以下の手順で作っていく♪
①「表示編」リストの情報を表示する機能を実装
②「挿入編」リストに情報を追加する機能を実装
③「削除編」リストの情報を削除する機能を実装

目標

[5| NULL] まず,上のリストの先頭にノードを挿入して以下のリストを作る.
[2| 次のノードのアドレス]→[5| NULL]
次に,上のリストの最後尾にノードを挿入して以下のリストを作る.
[2| 次のノードのアドレス]→[5| 次のノードのアドレス]→ [10|NULL]
最後に,上のリストのノード間にノードを挿入して以下のリストを作る.
[2| 次のノードのアドレス]→[5| 次のノードのアドレス]→[7| 次のノードのアドレス]→ [10|NULL]

Step2.1: リスト先頭への挿入

以下のようにmain.cを作成。

コンパイルして、実行してみる.

$ gcc main.c func.c
$ ./a.out 
before
5
after
5

2のデータを持つノードが挿入されていない.main関数の中のhead変数は書き換わっていないからだと思われる. ってことで二重ポインタを使って書き直す.

コンパイルして、実行してみる.

$ gcc main.c func.c
$ ./a.out 
before
5
after
2
5

2のデータを持つノードが先頭に追加されているようなので完了!

Step2.2: リスト最後尾への挿入

以下のようにmain.cを修正.

コンパイルからの実行.

$ gcc main.c func.c
$ ./a.out 
before
 5
after
 2
 5
10

10のデータを持つノードが末尾に追加されているからOK.

Step2.3: ノード中間への挿入

以下のようにmain.cを修正.

コンパイルからの実行.

$ gcc main.c func.c
$ ./a.out 
before
 5
after
 2
 5
 7
10

7のデータを持つノードが3番目のノードとして挿入されたからOK.

Step2.4: 関数を一つにまとめる

挿入に関する3つの関数を作ったが,共通する内容が多いので一つにまとめてみる. 以下のようにmain.cを修正.

さっきと同じようにコンパイルして,同じ結果が得られたのでOK.

Step2.5: ファイル分割する

main.cが長いくなるのは嫌なので,関数は違うファイルにまとめる.すべてのプログラムはこんな感じ.(define.hは変更していない)

コンパイルからの実行.

$ gcc main.c func.c
$ ./a.out
before
 5
after
 2
 5
 7
10

2,5,7,10が順番に出力されてので,目標達成!!