22.1.2 リストの削除

リストから特定のオブジェクトを削除する場合には単に free() してはならない。 きちんとオブジェクトの連鎖から取り除いた後に free() しなければならない からである(図 [*])。

\begin{figure}\begin{center}
\epsfile{file=list3}
\end{center}\end{figure}

    struct LIST * delList( struct LIST ** pstart, struct LIST * target){
        struct LIST *p=*pstart;
        struct LIST *new;
        if(p==target){                  /* 先頭の要素を削除するとき */
            *pstart = p = target->next; /* 2番目の要素が先頭になる */
        }else{
            while(p->next!=target){     /* 削除対象のひとつ手前まで移動 */
               p = p->next;
            }
            p->next = target->next;     /* target を飛ばした連鎖を作る */
        }
        free(target);
        return p;
}

上のプログラムでは、引数にリストの先頭のアドレスと削除対象のオブジェクトへの ポインタ(target)を与え、target を指している一つ前のオブジェクトの next を一つ飛ばしのオブジェクトへと入れ換えてから、target の オブジェクトをメモリから削除している。

このプログラムで注意するところは、リストの先頭を削除したいときには少し 特別な処理が必要で、先頭の位置を指している*pstartを2番目の要素 を指すように変更する必要がある点である。



最初のページ 戻る 次へ 最後のページ 目次
Hiroyasu Asami