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が順番に出力されてので,目標達成!!