本当にゆとりはどうしようもないな。

初心者は絶対的な知識量が足りてないから、やってることは結果的に「老害」と一致する。
C言語なんて20年ほぼ変更無し=ここ20年の進歩を「文法的には」取り込めてないのだから、
文法から入るお前らみたいな奴は必ず「老害」からのスタートになってしまうし、実際そうなってるだろ。

この点、やはり初心者は新しい言語からやるべきなのさ。
そうすれば、少なくともお前らのような「古くて非効率な手法しか使えない馬鹿=『老害』」にはならずに、
「新しくて効率的な方法しか使えない新人」になるが、こっちの方がずいぶんマシだ。
とはいえ、新しすぎて評価が固まってない言語も危険ではあるが。(具体的にはGoがゴミ)

「継承」に粘着している馬鹿は継承の実装を考えてみるといい。
C++は当初はトランスパイラ=C++文法をC言語に変換してCコンパイラを通すもの、だったと聞く。
同様に、C++でのOOPをC言語で実装する際、どう変換するか考えてみるといい。
正解は、他言語のOOPの実装をググれば得られるだろう。

継承については色々議論があるが、今回のようにコンテナの場合は、
ListBaseクラスを継承しテンプレートでデータ構造に幅を持たせるのがとりあえずの正解だよ。
おそらくstd::list<T>もそうなってると思うぜ。(ただし速度重視で全テンプレート展開もあり得るが)
そしてC言語においても同等のオブジェクトコードが得られるソースコードを記述しろ、という話であってさ。
(それ以前にコンテナが欲しければ素直にC++使った方がいいと思うが)

というか、C++は改良版Cなんだから、C++を食わず嫌いするのも典型的な老害なんだよ。
当然だがC言語が抱えていた問題点は修正されてる。
コンテナ等も完全に整備されてる。
スマポ()とかやってるC++erは馬鹿だから無視でいいが、
Cの問題点に直面してるのにC++を試してない奴は定義通りの老害だよ。
Cが出現した頃とはずいぶん状況が変わっているわけでさ。
https://cpplover.blogspot.com/2016/05/mitsicp.html