*参照元 [#m62d0c0b]
#backlinks

*説明 [#x17af451]
-パス: [[linux-2.6.33/include/linux/list.h]]

-指定された要素に挟まれた要素全てを、リストから削除する。
--指定された要素は残り、間にある要素が全て削除される。
 元のリストが、
 ,-------------------------,
 |-> a <-> b <-> c <-> d <-|
 であれば、
 __list_del(b, d) を実行後は、
 ,-------------------,
 |-> a <-> b <-> d <-|
 となる。
--リストの要素が 1つでも動作する。
---b を削除したければ、__list_del(a, a) で削除可能である。
a は b の prev であり、next でもあるから。
--間に何も要素がなくても動作する。
空のリストに対しても動作する。
---特に何も起こらない。


**引数 [#vf05a208]
-struct list_head * prev
--削除したい要素の前にある要素を指定する。
--[[linux-2.6.33/list_head]]
-struct list_head * next
--削除したい要素の後ろにある要素を指定する。


**返り値 [#x61ee993]
-なし


**参考 [#v4d1ffd3]


*実装 [#jfd0f73e]

 /*
  * Delete a list entry by making the prev/next entries
  * point to each other.
  *
  * This is only for internal list manipulation where we know
  * the prev/next entries already!
  */
 static inline void __list_del(struct list_head * prev, struct list_head * next)
 {
         next->prev = prev;
         prev->next = next;
-削除対象の全要素を挟む要素間で、ポインタを接続する。
 仮に prev と next の間にある全要素
 (=リストから削除しようとしている要素全て)
 の名前を self とすると、
 | prev | -(prev.next)-> | self | -(self.next)-> |      |
 |      | <-(self.prev)- |      | <-(next.prev)- | next |
 を
 | prev | -------------(prev.next)-------------> |      |
 |      | <-------------(next.prev)------------- | next |
      ^                                            ^
      |                  | self | ---(self.next)---|
      `---(self.prev)--- |      |
 のように変更して、prev や next から self を参照できないようにする。
 これは self が複数となっても動作する。

 }


*コメント [#qbe14560]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS