俺が単方向リストを自分で実装したのは中学生の頃だったが双方向はなかなかバグが取れなかった
今思うとダラダラ長ったらしくコーディングして分割が不十分だったし単体テストをしてなかったからだな
ややこしいことをややこしいまま実装するのは誰でも大変
上手な人はパフォーマンスより読みやすさを優先しつつ確実に動く小さな部品を作ってそれを組み立ててるよ
当時は「どんなプログラムでも必ずバグがある」と言われてたしセグフォでアプリが落ちるのなんて普通すぎて誰も気にしなかった
オブジェクト志向と単体テストが普通になってから世の中変わったわ
唐突に見えるのは長文が読めないからだな
たとえばリスト中の一つのノードの後に新しいノードを挿入する関数insert_after(Node* node, Node* new_node)を作る場合
その関数の中に全てのロジックを書きたくなるけどそれをあえて次のように分割する
get_after //引数で指定されたノードの後のノードを取得
combine_after //一つのノードの後に別のノードを繋ぐ
combine_before //一つのノードの前に別のノードを繋ぐ
そうしたらinsert_afterはこうなる
bool insert_after(Node* node, Node* new_node) {
Node* after=get_after(node);
if (node==new_node||new_node==after) return false;
combine_after(node, new_node);
combine_before(new_node, node);
combine_after(new_node, after);
combine_before(after, new_node);
return true;
}