リストから特定のオブジェクトを削除する場合には単に free() してはならない。
きちんとオブジェクトの連鎖から取り除いた後に free() しなければならない
からである(図 )。
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番目の要素
を指すように変更する必要がある点である。