¦b linux kernel ¤§¤¤°µdouble link list ®É¦³­ÓªF¦è¹ê¦b¬O¤S¦n¥Î¡A¤S±j¤j¡A³t«×¤S§Ö¡C ¨º´N¬O list head ¨ä¹ê³o­ÓªF¦è©M§Ú­Ì¦b¸ê®Æµ²ºc¤¤¾Çªº¨S¨â¼Ë¡C ¥u¬O³o­Óª±·N¹B¥Î¤F struct ªºµ²ºc©Ê¡A¤Î C »y¨¥¥»¨­ªº§C¶¥¯à¤O¡A¨Ï±o³t«×Åܱo«Ü§Ö¡C struct list_head { ¡@struct list_head *prev,*next; }; ¥Lªº¤º®e¥u¦³ list_head ªº ¨â­Ó pointer.¤]¥u¯à«ü list_head ¦b¹B¥Î®É¡A¦³­Ó macro ¥s list_entry ¥L¥i¥H¥H list_head ªº¦ì§}¡A¤Î³o­Ó list_head ¦bª«¥ó¤¤ªº¦ì§}¡Aºâ¥Xª«¥óªº¦ì§}¡C ¤]´N¬O»¡¡A°²³]¦³¤@­Óª«¥ó¥s ABC ¥H¤U¬O¤º®e¡G struct ABC { ¡@int index; ¡@char *name; ¡@int score; ¡@struct list_head lh; } ¦pªG§A¤µ¤Ñ®³¨ì¤@­Ó ABCª«¥ó¤¤ªº lh ªº¦ì§}(lhpt)ªº¸Ü¡A§A´N¥i¥H±q³oùØ®³¨ì¸Óª«¥óªº¦ì§}¡C e.q. struct ABC *abc = list_entry(lhpt, struct ABC,lh); ¦p¦¹¡Alist_head ´N·|¨Ì lh ¦b ABC ªº¬Û¹ï¦ì¸m¡A¤Î lhpt ªº¦ì§}ºâ¥X ³o­Ó ABC ªº¦ì§}¡C ·í¦³ list_head ªºª«¥ó³Q allocate ¥X¨Ó®É¡A­n°O±oªì©l¤Æ prev ©M next e.q. INIT_LIST_HEAD(&abc->lh); ¥[¤J¦ê¦C¤¤ªº¥Îªk¬O list_add(&abc->lh,head); or list_add_tail(&abc->lh,head); §R°£¬O list_del(&abc->lh); ¦ý¬O¡A¦³¤@ÂI¤@©w­n°O±o list_del ¤£·|²M±¼ abc->lh ªº¤º®e ¦ý¬O·|²M±¼ abc->lh->prev ªº next ©M abc->lh->next ªº prev ¦pªG­n²M±o°®²b¤@ÂI¡A´N­n¥Î list_del_init(&abc->lh); ¨º´N·| abc->lh->prev == abc->lh->next==&abc->lh -- ·|¤£·|¼g±o¤ÓÃøÀ´°Õ ~_~