Cで汎用リストコンテナの実装

Cで汎用のリストコンテナを実装することを考えてみた。とりあえず構造体は次のようなものでいいであろう。

struct List_tag {
    void *obj;                  /* 値 */
    List *next;                 /* 次のノードを指すポインタ */
};

void *objが要素の実体を指し、それがリストでつなげていく。Javaでいうプリミティブ型を格納できないがそれはJavaでも同じことだからよしとしよう。そもそもintひとつのようなデータをリストにすることはCらしくないと思うし。


ところで汎用のコンテナにするからには構造体の実装詳細は公開したくない。そうなるとリストを消すときにvoid *objの後始末に困ってしまう。これはガベコレが無いと面倒だ。初めに思いついたのは、objの解放
関数を引数で渡してしまう方法。

/*******************************************
	リストを解放する 
    引数	pList:リストを指すポインタ
    		objFree: objを解放する関数
 ********************************************/
void ListDispose(List *pList, void (*objFree)(void *pObj))
{
    List *pFree, *pTmp;

    pTmp = pList;
    while (pTmp != NULL) {
        pFree = pTmp;
        pTmp = pTmp->next;
        objFree(pFree->obj);
        free(pFree);
    }
}

これはこれで満足だけど、unlinkだけしてそのオブジェクトを返し、呼び出し側で始末をつけるやり方もあることに気づいた。もっともイテレータのように処理する必要があるのでかえって面倒くさいか。