.\" Copyright (c) 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#) queue. 3 8.2 (Berkeley) 1/24/94 .\" %FreeBSD: src/share/man/man3/queue. 3, v 1.15. 2.7 2001/12/18 10:09:02 ru Exp % .\" $FreeBSD: doc/ja_JP.eucJP/man/man3/queue. 3, v 1.5 2002/05/18 07:12:56 horikawa Exp $ .\" .Dd January 24, 1994 .Dt QUEUE 3 .Os .Sh ¸íĪ .Nm SLIST_EMPTY , .Nm SLIST_ENTRY , .Nm SLIST_FIRST , .Nm SLIST_FOREACH , .Nm SLIST_HEAD , .Nm SLIST_HEAD_INITIALIZER , .Nm SLIST_INIT , .Nm SLIST_INSERT_AFTER , .Nm SLIST_INSERT_HEAD , .Nm SLIST_NEXT , .Nm SLIST_REMOVE_HEAD , .Nm SLIST_REMOVE , .Nm STAILQ_EMPTY , .Nm STAILQ_ENTRY , .Nm STAILQ_FIRST , .Nm STAILQ_FOREACH , .Nm STAILQ_HEAD , .Nm STAILQ_HEAD_INITIALIZER , .Nm STAILQ_INIT , .Nm STAILQ_INSERT_AFTER , .Nm STAILQ_INSERT_HEAD , .Nm STAILQ_INSERT_TAIL , .Nm STAILQ_LAST , .Nm STAILQ_NEXT , .Nm STAILQ_REMOVE_HEAD , .Nm STAILQ_REMOVE , .Nm LIST_EMPTY , .Nm LIST_ENTRY , .Nm LIST_FIRST , .Nm LIST_FOREACH , .Nm LIST_HEAD , .Nm LIST_HEAD_INITIALIZER , .Nm LIST_INIT , .Nm LIST_INSERT_AFTER , .Nm LIST_INSERT_BEFORE , .Nm LIST_INSERT_HEAD , .Nm LIST_NEXT , .Nm LIST_REMOVE , .Nm TAILQ_EMPTY , .Nm TAILQ_ENTRY , .Nm TAILQ_FIRST , .Nm TAILQ_FOREACH , .Nm TAILQ_FOREACH_REVERSE , .Nm TAILQ_HEAD , .Nm TAILQ_HEAD_INITIALIZER , .Nm TAILQ_INIT , .Nm TAILQ_INSERT_AFTER , .Nm TAILQ_INSERT_BEFORE , .Nm TAILQ_INSERT_HEAD , .Nm TAILQ_INSERT_TAIL , .Nm TAILQ_LAST , .Nm TAILQ_NEXT , .Nm TAILQ_PREV , .Nm TAILQ_REMOVE , .Nm CIRCLEQ_EMPTY , .Nm CIRCLEQ_ENTRY , .Nm CIRCLEQ_FIRST , .Nm CIRCLEQ_FOREACH , .Nm CIRCLEQ_FOREACH_REVERSE , .Nm CIRCLEQ_HEAD , .Nm CIRCLEQ_HEAD_INITIALIZER , .Nm CIRCLEQ_INIT , .Nm CIRCLEQ_INSERT_AFTER , .Nm CIRCLEQ_INSERT_BEFORE , .Nm CIRCLEQ_INSERT_HEAD , .Nm CIRCLEQ_INSERT_TAIL , .Nm CIRCLE_LAST , .Nm CIRCLE_NEXT , .Nm CIRCLE_PREV , .Nm CIRCLEQ_REMOVE .Nd ´ÜÀÏ ¸µÅ© ¸®½ºÆ®, ´ÜÀÏ ¸µÅ© Å×ÀÏ Å¥, ¸®½ºÆ®, Å×ÀÏ Å¥, ¼øÈ¯ Å¥ÀÇ ½ÇÀå .Sh ¼­½Ä .In sys/queue.h .\" .Fn SLIST_EMPTY "SLIST_HEAD *head" .Fn SLIST_ENTRY "TYPE" .Fn SLIST_FIRST "SLIST_HEAD *head" .Fn SLIST_FOREACH "TYPE *var" "SLIST_HEAD *head" "SLIST_ENTRY NAME" .Fn SLIST_HEAD "HEADNAME" "TYPE" .Fn SLIST_HEAD_INITIALIZER "SLIST_HEAD head" .Fn SLIST_INIT "SLIST_HEAD *head" .Fn SLIST_INSERT_AFTER "TYPE *listelm" "TYPE *elm" "SLIST_ENTRY NAME" .Fn SLIST_INSERT_HEAD "SLIST_HEAD *head" "TYPE *elm" "SLIST_ENTRY NAME" .Fn SLIST_NEXT "TYPE *elm" "SLIST_ENTRY NAME" .Fn SLIST_REMOVE_HEAD "SLIST_HEAD *head" "SLIST_ENTRY NAME" .Fn SLIST_REMOVE "SLIST_HEAD *head" "TYPE *elm" "TYPE" "SLIST_ENTRY NAME" .\" .Fn STAILQ_EMPTY "STAILQ_HEAD *head" .Fn STAILQ_ENTRY "TYPE" .Fn STAILQ_FIRST "STAILQ_HEAD *head" .Fn STAILQ_FOREACH "TYPE *var" "STAILQ_HEAD *head" "STAILQ_ENTRY NAME" .Fn STAILQ_HEAD "HEADNAME" "TYPE" .Fn STAILQ_HEAD_INITIALIZER "STAILQ_HEAD head" .Fn STAILQ_INIT "STAILQ_HEAD *head" .Fn STAILQ_INSERT_AFTER "STAILQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "STAILQ_ENTRY NAME" .Fn STAILQ_INSERT_HEAD "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAME" .Fn STAILQ_INSERT_TAIL "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAME" .Fn STAILQ_LAST "STAILQ_HEAD *head" "TYPE" "STAILQ_ENTRY NAME" .Fn STAILQ_NEXT "TYPE *elm" "STAILQ_ENTRY NAME" .Fn STAILQ_REMOVE_HEAD "STAILQ_HEAD *head" "STAILQ_ENTRY NAME" .Fn STAILQ_REMOVE "STAILQ_HEAD *head" "TYPE *elm" "TYPE" "STAILQ_ENTRY NAME" .\" .Fn LIST_EMPTY "LIST_HEAD *head" .Fn LIST_ENTRY "TYPE" .Fn LIST_FIRST "LIST_HEAD *head" .Fn LIST_FOREACH "TYPE *var" "LIST_HEAD *head" "LIST_ENTRY NAME" .Fn LIST_HEAD "HEADNAME" "TYPE" .Fn LIST_HEAD_INITIALIZER "LIST_HEAD head" .Fn LIST_INIT "LIST_HEAD *head" .Fn LIST_INSERT_AFTER "TYPE *listelm" "TYPE *elm" "LIST_ENTRY NAME" .Fn LIST_INSERT_BEFORE "TYPE *listelm" "TYPE *elm" "LIST_ENTRY NAME" .Fn LIST_INSERT_HEAD "LIST_HEAD *head" "TYPE *elm" "LIST_ENTRY NAME" .Fn LIST_NEXT "TYPE *elm" "LIST_ENTRY NAME" .Fn LIST_REMOVE "TYPE *elm" "LIST_ENTRY NAME" .\" .Fn TAILQ_EMPTY "TAILQ_HEAD *head" .Fn TAILQ_ENTRY "TYPE" .Fn TAILQ_FIRST "TAILQ_HEAD *head" .Fn TAILQ_FOREACH "TYPE *var" "TAILQ_HEAD *head" "TAILQ_ENTRY NAME" .Fn TAILQ_FOREACH_REVERSE "TYPE *var" "TAILQ_HEAD *head" "HEADNAME" "TAILQ_ENTRY NAME" .Fn TAILQ_HEAD "HEADNAME" "TYPE" .Fn TAILQ_HEAD_INITIALIZER "TAILQ_HEAD head" .Fn TAILQ_INIT "TAILQ_HEAD *head" .Fn TAILQ_INSERT_AFTER "TAILQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "TAILQ_ENTRY NAME" .Fn TAILQ_INSERT_BEFORE "TYPE *listelm" "TYPE *elm" "TAILQ_ENTRY NAME" .Fn TAILQ_INSERT_HEAD "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME" .Fn TAILQ_INSERT_TAIL "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME" .Fn TAILQ_LAST "TAILQ_HEAD *head" "HEADNAME" .Fn TAILQ_NEXT "TYPE *elm" "TAILQ_ENTRY NAME" .Fn TAILQ_PREV "TYPE *elm" "HEADNAME" "TAILQ_ENTRY NAME" .Fn TAILQ_REMOVE "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME" .\" .Fn CIRCLEQ_EMPTY "CIRCLEQ_HEAD *head" .Fn CIRCLEQ_ENTRY "TYPE" .Fn CIRCLEQ_FIRST "CIRCLEQ_HEAD *head" .Fn CIRCLEQ_FOREACH "TYPE *var" "CIRCLEQ_HEAD *head" "CIRCLEQ_ENTRY NAME" .Fn CIRCLEQ_FOREACH_REVERSE "TYPE *var" "CIRCLEQ_HEAD *head" "CIRCLEQ_ENTRY NAME" .Fn CIRCLEQ_HEAD "HEADNAME" "TYPE" .Fn CIRCLEQ_HEAD_INITIALIZER "CIRCLEQ_HEAD head" .Fn CIRCLEQ_INIT "CIRCLEQ_HEAD *head" .Fn CIRCLEQ_INSERT_AFTER "CIRCLEQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "CIRCLEQ_ENTRY NAME" .Fn CIRCLEQ_INSERT_BEFORE "CIRCLEQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "CIRCLEQ_ENTRY NAME" .Fn CIRCLEQ_INSERT_HEAD "CIRCLEQ_HEAD *head" "TYPE *elm" "CIRCLEQ_ENTRY NAME" .Fn CIRCLEQ_INSERT_TAIL "CIRCLEQ_HEAD *head" "TYPE *elm" "CIRCLEQ_ENTRY NAME" .Fn CIRCLEQ_LAST "CIRCLEQ_HEAD *head" .Fn CIRCLEQ_NEXT "TYPE *elm" "CIRCLEQ_ENTRY NAME" .Fn CIRCLE_PREV "TYPE *elm" "CIRCLEQ_ENTRY NAME" .Fn CIRCLEQ_REMOVE "CIRCLEQ_HEAD *head" "TYPE *elm" "CIRCLEQ_ENTRY NAME" .Sh ÇØ¼³ ÀÌ ¸ÅÅ©·Î´Â, ´ÜÀÏ ¸µÅ© ¸®½ºÆ®, ´ÜÀÏ ¸µÅ© Å×ÀÏ Å¥, ¸®½ºÆ®, Å×ÀÏ Å¥, ¼øÈ¯ Å¥¶ó°í ÇÏ´Â, 5 Á¾·ùÀÇ µ¥ÀÌÅÍ ±¸Á¶¸¦ Á¤ÀÇÇØ °Å±â¼­ µ¿ÀÛÇÕ´Ï´Ù. 5 °³ÀÇ µ¥ÀÌÅÍ ±¸Á¶´Â ¸ðµÎ, ÀÌÇÏÀÇ ±â´ÉÀ» ¼­Æ÷Æ®ÇÕ´Ï´Ù. .Bl -enum -compact -offset indent .It ¸®½ºÆ®ÀÇ ¼±µÎ¿¡ »õ·Î¿î ¿£Æ®¸®¸¦ »ðÀÔÇÑ´Ù. .It ¸®½ºÆ®¿¡ Á¸ÀçÇÏ´Â ÀÓÀÇÀÇ ¿ä¼ÒÀÇ µÚ·Î »õ·Î¿î ¿£Æ®¸®¸¦ »ðÀÔÇÑ´Ù. .It ¸®½ºÆ®ÀÇ ¼±µÎ·ÎºÎÅÍ ¿£Æ®¸®¸¦ O(1) »èÁ¦ÇÑ´Ù. .It ¸®½ºÆ®ÀÇ ÀÓÀÇÀÇ ¿£Æ®¸®¸¦ O(n) »èÁ¦ÇÑ´Ù. .It ¸®½ºÆ®¸¦ ÀüºÎÅÍ ÁÖ»ç ÇÑ´Ù. .El .Pp ´ÜÀÏ ¸µÅ© ¸®½ºÆ®´Â, 5 °³ÀÇ µ¥ÀÌÅÍ ±¸Á¶ Áß(¾È)¿¡¼­ °¡Àå ´Ü¼øÇØ, À§ÀÇ 5°³ÀÇ ±â´ÉÇØ Àΰ¡ ¼­Æ÷Æ®ÇÏÁö ¾Ê½À´Ï´Ù. ´ÜÀÏ ¸µÅ© ¸®½ºÆ®´Â, µ¥ÀÌÅÍ ¼¼Æ®°¡ Å©°í, »èÁ¦°¡ °ÅÀÇ ¾ø´Â, ȤÀº, ÀüÇô ¾ø´Â ¾îÇø®ÄÉÀ̼Ç, ¶Ç´Â LIFO Å¥ÀÇ ½ÇÀå¿¡ ÀÌ»óÀûÀÔ´Ï´Ù. .Pp ´ÜÀÏ ¸µÅ© Å×ÀÏ Å¥¿¡´Â ÀÌÇÏÀÇ ±â´Éµµ ÀÖ½À´Ï´Ù. .Bl -enum -compact -offset indent .It ¸®½ºÆ®ÀÇ ¸»¹Ì¿¡ ¿£Æ®¸®¸¦ Ãß°¡ÇÑ´Ù. .El ±×·¯³ª ÀÌÇÏ¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä. .Bl -enum -compact -offset indent .It ¸®½ºÆ®ÀÇ »ðÀÔ¿¡¼­´Â, ¸®½ºÆ®ÀÇ Çìµå¸¦ ¹Ýµå½Ã ÁöÁ¤ÇÒ Çʿ䰡 ÀÖ´Ù. .It °¢ Çìµå ¿£Æ®¸®¿¡¼­´Â, 1 °³(»ì)Àº ¾Æ´Ï°í 2 °³ÀÇ Æ÷ÀÎÅͰ¡ ÇÊ¿äÇÏ´Ù. .It ´ÜÀÏ ¸µÅ© ¸®½ºÆ®º¸´Ù, ÄÚµå »çÀÌÁî´Â ¾à 15% Å©°í, µ¿ÀÛÀº ¾à 20% ´Ê´Ù. .El .Pp ´ÜÀÏ ¸µÅ© Å×ÀÏ Å¥´Â, µ¥ÀÌÅÍ ¼¼Æ®°¡ Å©°í, »èÁ¦°¡ °ÅÀÇ ¾ø´Â, ȤÀº, ÀüÇô ¾ø´Â ¾îÇø®ÄÉÀ̼Ç, ¶Ç´Â FIFO Å¥ÀÇ ½ÇÀå¿¡ ÀÌ»óÀûÀÔ´Ï´Ù. .Pp ÀÌÁß ¸µÅ© ŸÀÔÀÇ ¸ðµç µ¥ÀÌÅÍ ±¸Á¶ (¸®½ºÆ®, Å×ÀÏ Å¥, ¼øÈ¯ Å¥)¿¡´Â ÀÌÇÏÀÇ ±â´Éµµ ÀÖ½À´Ï´Ù. .Bl -enum -compact -offset indent .It ¸®½ºÆ®¿¡ Á¸ÀçÇÏ´Â ÀÓÀÇÀÇ ¿ä¼ÒÀÇ Àü¿¡ »õ·Î¿î ¿£Æ®¸®¸¦ »ðÀÔÇÑ´Ù. .It ¸®½ºÆ®ÀÇ ÀÓÀÇÀÇ ¿£Æ®¸®¸¦ O(1) »èÁ¦ÇÑ´Ù. .El ±×·¯³ª ÀÌÇÏ¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä. .Bl -enum -compact -offset indent .It °¢ ¿ä¼Ò¿¡´Â, 1 °³(»ì)Àº ¾Æ´Ï°í 2 °³ÀÇ Æ÷ÀÎÅͰ¡ ÇÊ¿äÇÏ´Ù. .It ´ÜÀÏ ¸µÅ© µ¥ÀÌÅÍ ±¸Á¶º¸´Ù, ÄÚµå »çÀÌÁî¿Í ½ÇÇà ½Ã°£ (»èÁ¦´Â Á¦¿ÜÇÏ´Ù)ÀÌ ¾à 2 ¹è¿¡ µÈ´Ù. .El .Pp ¸µÅ© ¸®½ºÆ®´Â, ÀÌÁß ¸µÅ© µ¥ÀÌÅÍ ±¸Á¶ Áß(¾È)¿¡¼­ °¡Àå ´Ü¼øÇØ, ´ÜÀÏ ¸µÅ© ¸®½ºÆ®ÀÇ ±â´É¿¡ °¡¼¼ÇØ À§ÀÇ ±â´É ¹Û¿¡ ¼­Æ÷Æ®ÇÏÁö ¾Ê½À´Ï´Ù. .Pp Å×ÀÏ Å¥¿¡´Â ÀÌÇÏÀÇ ±â´Éµµ ÀÖ½À´Ï´Ù. .Bl -enum -compact -offset indent .It ¸®½ºÆ®ÀÇ ¸»¹Ì¿¡ ¿£Æ®¸®¸¦ Ãß°¡ÇÑ´Ù. .It ¸»¹Ì·ÎºÎÅÍ ¼±µÎ·Î ¹Ý´ë·Î ÁÖ»ç ÇÑ´Ù. .El ±×·¯³ª ÀÌÇÏ¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä. .Bl -enum -compact -offset indent .It ¸®½ºÆ®ÀÇ »ðÀÔ°ú »èÁ¦¿¡¼­´Â, ¸®½ºÆ®ÀÇ Çìµå¸¦ ¹Ýµå½Ã ÁöÁ¤ÇÒ Çʿ䰡 ÀÖ´Ù. .It °¢ Çìµå ¿£Æ®¸®¿¡¼­´Â, 1 °³(»ì)Àº ¾Æ´Ï°í 2 °³ÀÇ Æ÷ÀÎÅͰ¡ ÇÊ¿äÇÏ´Ù. .It ´ÜÀÏ ¸µÅ© ¸®½ºÆ®º¸´Ù, ÄÚµå »çÀÌÁî´Â ¾à 15% Å©°í, ó¸® ½Ã°£Àº ¾à 20% ±æ´Ù. .El .Pp ¼øÈ¯ Å¥¿¡´Â ÀÌÇÏÀÇ ±â´Éµµ ÀÖ½À´Ï´Ù. .Bl -enum -compact -offset indent .It ¸®½ºÆ®ÀÇ ¸»¹Ì¿¡ ¿£Æ®¸®¸¦ Ãß°¡ÇÑ´Ù. .It ¸»¹Ì·ÎºÎÅÍ ¼±µÎ·Î ¹Ý´ë·Î ÁÖ»ç ÇÑ´Ù. .El ±×·¯³ª ÀÌÇÏ¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä. .Bl -enum -compact -offset indent .It ¸®½ºÆ®ÀÇ »ðÀÔ°ú »èÁ¦¿¡¼­´Â, ¸®½ºÆ®ÀÇ Çìµå¸¦ ¹Ýµå½Ã ÁöÁ¤ÇÒ Çʿ䰡 ÀÖ´Ù. .It °¢ Çìµå ¿£Æ®¸®¿¡¼­´Â, 1 °³(»ì)Àº ¾Æ´Ï°í 2 °³ÀÇ Æ÷ÀÎÅͰ¡ ÇÊ¿äÇÏ´Ù. .It ÁÖ»çÀÇ Á¾·á Á¶°ÇÀÌ º¸´Ù º¹ÀâÇÏ´Ù. .It ¸®½ºÆ®º¸´Ù, ÄÚµå »çÀÌÁî´Â ¾à 40% Å©°í, ó¸® ½Ã°£Àº ¾à 45% ±æ´Ù. .El .Pp ¸ÅÅ©·Î Á¤ÀÇ¿¡¼­´Â, .Fa TYPE (Àº)´Â À¯Àú°¡ Á¤ÀÇÇÑ ±¸Á¶Ã¼ÀÇ À̸§ÀÔ´Ï´Ù. ÀÌ ±¸Á¶Ã¼¿¡´Â, .Fa NAME (ÀÌ)¶ó´Â À̸§ÀÌ ºÙÀº, .Li SLIST_ENTRY , .Li STAILQ_ENTRY , .Li LIST_ENTRY , .Li TAILQ_ENTRY , .Li CIRCLEQ_ENTRY ±×·¸´Ù°í ÇÏ´Â ÇüÅÂÀÇ Çʵ带 Æ÷ÇÔÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. Àμö .Fa HEADNAME ÇÏ ¸ÅÅ©·Î .Li SLIST_HEAD , .Li STAILQ_HEAD , .Li LIST_HEAD , .Li TAILQ_HEAD , .Li CIRCLEQ_HEAD ±×¸®°í ¼±¾ðÇÒ Çʿ䰡 ÀÖ´Â, À¯Àú°¡ Á¤ÀÇÇÑ ±¸Á¶Ã¼ÀÇ À̸§ÀÔ´Ï´Ù. ÀÌ ¸ÅÅ©·ÎÀÇ »ç¿ë¹ýÀÇ »ó¼¼ÇÑ °Í¿¡ ´ëÇÏ¿©´Â, ÀÌÇÏÀÇ »ç¿ë¿¹¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä. .Sh ´ÜÀÏ ¸µÅ© ¸®½ºÆ® ´ÜÀÏ ¸µÅ© ¸®½ºÆ®ÀÇ ÃÖÃʷδÂ, .Nm SLIST_HEAD ¸ÅÅ©·Î·Î Á¤ÀǵǴ ±¸Á¶Ã¼°¡ ºÙ½À´Ï´Ù. ÀÌ ±¸Á¶Ã¼¿¡´Â, ¸®½ºÆ®ÀÇ ¼±µÎÀÇ ¿ä¼Ò¸¦ °¡¸®Å°´Â Æ÷ÀÎÅͰ¡ 1 °³ Æ÷ÇԵ˴ϴÙ. ¿ä¼Ò´Â, ÀÓÀÇÀÇ ¿ä¼ÒÀÇ O(n) »èÁ¦¸¦ Èñ»ýÇØ, ½ºÆäÀ̽º¿Í Æ÷ÀÎÅÍ Á¶ÀÛÀÇ ¿À¹öÇìµå°¡ ÃÖ¼Ò°¡ µÇµµ·Ï(µíÀÌ) ´ÜÀÏ ¸µÅ© µË´Ï´Ù. »õ·Î¿î ¿ä¼Ò´Â, ±âÁ¸ÀÇ ¿ä¼ÒÀÇ µÚ, ¸®½ºÆ®ÀÇ ¼±µÎ¿¡¼­ ¸®½ºÆ®¿¡ Ãß°¡ÇÒ ¼ö ÀÖ½À´Ï´Ù. .Fa SLIST_HEAD ±¸Á¶Ã¼´Â ÀÌÇÏ¿Í °°ÀÌ ¼±¾ðµË´Ï´Ù. .Bd -literal -offset indent SLIST_HEAD(HEADNAME, TYPE) head; .Ed .Pp ¿©±â¼­ .Fa HEADNAME (Àº)´Â Á¤ÀÇÇÏ´Â ±¸Á¶Ã¼ÀÇ À̸§À¸·Î, .Fa TYPE (Àº)´Â ¸®½ºÆ®¿¡ ¸µÅ© ÇÏ´Â ¿ä¼ÒÀÇ ÇüÅÂÀÔ´Ï´Ù. ¸®½ºÆ®ÀÇ ÇìµåÀÇ Æ÷ÀÎÅÍ´Â, ´ÙÀ½¿¡ ÀÌÇÏ¿Í °°ÀÌ ¼±¾ðÇÒ ¼ö ÀÖ½À´Ï´Ù. .Bd -literal -offset indent struct HEADNAME *headp; .Ed .Pp (À̸§ .Li head (¿Í)°ú .Li headp (Àº)´Â, À¯Àú°¡ ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù. ) .Pp ¸ÅÅ©·Î .Nm SLIST_HEAD_INITIALIZER (Àº)´Â ¸®½ºÆ®ÀÇ .Fa head (À»)¸¦ ÃʱâÈ­ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm SLIST_EMPTY (Àº)´Â ¸®½ºÆ®¿¡ ¿ä¼Ò°¡ ¾ø´Â °æ¿ì¿¡ ½Ç·Î µË´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm SLIST_ENTRY (Àº)´Â ¸®½ºÆ®ÀÇ ¿ä¼Ò¸¦ Á¢¼ÓÇÏ´Â ±¸Á¶Ã¼¸¦ ¼±¾ðÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm SLIST_FIRST (Àº)´Â ¸®½ºÆ®ÀÇ ¼±µÎÀÇ ¿ä¼Ò¸¦, ¸®½ºÆ®°¡ ÇÏ´ÃÀ̶ó¸é NULL ¸¦ µ¹·ÁÁÝ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm SLIST_FOREACH ÇÏ .Fa head ±×¸®°í ÂüÁ¶µÇ´Â ¸®½ºÆ®¸¦, °¢ ¿ä¼Ò¸¦ ¼ø¼­¿¡ .Fa var ¿¡ ÇÒ´çÇØ ¼ø¼­ ¹æÇâÀ¸·Î ÁÖ»ç ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm SLIST_INIT ÇÏ .Fa head ÇÏÁö¸¸ ÂüÁ¶ÇÏ´Â ¸®½ºÆ®¸¦ ÃʱâÈ­ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm SLIST_INSERT_HEAD (Àº)´Â »õ·Î¿î ¿ä¼Ò .Fa elm (À»)¸¦ ¸®½ºÆ®ÀÇ ¼±µÎ¿¡ »ðÀÔÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm SLIST_INSERT_AFTER (Àº)´Â ¿ä¼Ò .Fa listelm ÀÇ µÚ·Î »õ·Î¿î ¿ä¼Ò .Fa elm (À»)¸¦ »ðÀÔÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm SLIST_NEXT (Àº)´Â ¸®½ºÆ®ÀÇ ´ÙÀ½ÀÇ ¿ä¼Ò¸¦ µ¹·ÁÁÝ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm SLIST_REMOVE_HEAD (Àº)´Â ¸®½ºÆ®ÀÇ ¼±µÎ·ÎºÎÅÍ ¿ä¼Ò .Fa elm (À»)¸¦ »èÁ¦ÇÕ´Ï´Ù. ÃÖÀûÀÎ È¿À²À» ¾ò±â À§Çؼ­(¶§¹®¿¡), ¸®½ºÆ®ÀÇ ¼±µÎ·ÎºÎÅÍ ¿ä¼Ò¸¦ »èÁ¦ÇÏ´Â °æ¿ì¿¡´Â ÀϹÝÀûÀÎ .Fa SLIST_REMOVE ¸ÅÅ©·Î ´ë½Å¿¡ ÀÌ ¸ÅÅ©·Î¸¦ ¸í½ÃÀûÀ¸·Î »ç¿ëÇØ¾ß ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm SLIST_REMOVE (Àº)´Â ¸®½ºÆ®·ÎºÎÅÍ ¿ä¼Ò .Fa elm (À»)¸¦ »èÁ¦ÇÕ´Ï´Ù. .Sh ´ÜÀÏ ¸µÅ© ¸®½ºÆ®ÀÇ »ç¿ë¿¹ .Bd -literal SLIST_HEAD(slisthead, entry) head = SLIST_HEAD_INITIALIZER(head); struct slisthead *headp; /* ´ÜÀÏ ¸µÅ© ¸®½ºÆ® Çìµå */ struct entry { ... SLIST_ENTRY(entry) entries; /* ´ÜÀÏ ¸µÅ© ¸®½ºÆ® */ ... } *n1, *n2, *n3, *np; SLIST_INIT(&head); /* ¸®½ºÆ®¸¦ ÃʱâÈ­ */ n1 = malloc(sizeof(struct entry)); /* ¼±µÎ¿¡ »ðÀÔ */ SLIST_INSERT_HEAD(&head, n1, entries); n2 = malloc(sizeof(struct entry)); /* µÚ·Î »ðÀÔ */ SLIST_INSERT_AFTER(n1, n2, entries); SLIST_REMOVE(&head, n2, entry, entries);/* »èÁ¦ */ free(n2); n3 = SLIST_FIRST(&head); SLIST_REMOVE_HEAD(&head, entries); /* ¼±µÎ·ÎºÎÅÍ »èÁ¦ */ free(n3); /* ¼ø¼­ ÁÖ»ç */ SLIST_FOREACH(np, &head, entries) np-> ... while (! SLIST_EMPTY(&head)) { /* ¸®½ºÆ®ÀÇ »èÁ¦ */ n1 = SLIST_FIRST(&head); SLIST_REMOVE_HEAD(&head, entries); free(n1); } .Ed .Sh ´ÜÀÏ ¸µÅ© Å×ÀÏ Å¥ ´ÜÀÏ ¸µÅ© Å×ÀÏ Å¥ÀÇ ÃÖÃʷδÂ, .Nm STAILQ_HEAD ¸ÅÅ©·Î·Î Á¤ÀǵǴ ±¸Á¶Ã¼°¡ ´ÙÇÕ´Ï´Ù. ÀÌ ±¸Á¶Ã¼¿¡´Â Å×ÀÏ Å¥ÀÇ ¼±µÎÀÇ ¿ä¼Ò¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ¿Í Å×ÀÏ Å¥ÀÇ ¸»¹ÌÀÇ ¿ä¼Ò¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍÀÇ 2 °³°¡ Æ÷ÇԵ˴ϴÙ. ¿ä¼Ò´Â, ÀÓÀÇÀÇ ¿ä¼ÒÀÇ O(n) »èÁ¦¸¦ Èñ»ýÇØ, ½ºÆäÀ̽º¿Í Æ÷ÀÎÅÍ Á¶ÀÛÀÇ ¿À¹öÇìµå°¡ ÃÖ¼Ò°¡ µÇµµ·Ï(µíÀÌ) ´ÜÀÏ ¸µÅ© µË´Ï´Ù. »õ·Î¿î ¿ä¼Ò´Â, ±âÁ¸ÀÇ ¿ä¼ÒÀÇ µÚ, Å×ÀÏ Å¥ÀÇ ¼±µÎ, Å×ÀÏ Å¥ÀÇ ¸»¹Ì·Î Å×ÀÏ Å¥¿¡ Ãß°¡ÇÒ ¼ö ÀÖ½À´Ï´Ù. .Fa STAILQ_HEAD ±¸Á¶Ã¼´Â ÀÌÇÏ¿Í °°ÀÌ ¼±¾ðµË´Ï´Ù. .Bd -literal -offset indent STAILQ_HEAD(HEADNAME, TYPE) head; .Ed .Pp ¿©±â¼­ .Li HEADNAME (Àº)´Â Á¤ÀÇÇÏ´Â ±¸Á¶Ã¼ÀÇ À̸§À¸·Î, .Li TYPE (Àº)´Â Å×ÀÏ Å¥¿¡ ¸µÅ© ÇÏ´Â ¿ä¼ÒÀÇ ÇüÅÂÀÔ´Ï´Ù. Å×ÀÏ Å¥ÀÇ ÇìµåÀÇ Æ÷ÀÎÅÍ´Â, ´ÙÀ½¿¡ ÀÌÇÏ¿Í °°ÀÌ ¼±¾ðÇÒ ¼ö ÀÖ½À´Ï´Ù. .Bd -literal -offset indent struct HEADNAME *headp; .Ed .Pp (À̸§ .Li head (¿Í)°ú .Li headp (Àº)´Â, À¯Àú°¡ ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù. ) .Pp ¸ÅÅ©·Î .Nm STAILQ_HEAD_INITIALIZER (Àº)´Â Å×ÀÏ Å¥ÀÇ .Fa head (À»)¸¦ ÃʱâÈ­ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm STAILQ_EMPTY (Àº)´Â Å×ÀÏ Å¥¿¡ ¿ä¼Ò°¡ ¾ø´Â °æ¿ì¿¡ ½Ç·Î µË´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm STAILQ_ENTRY (Àº)´Â Å×ÀÏ Å¥ÀÇ ¿ä¼Ò¸¦ Á¢¼ÓÇÏ´Â ±¸Á¶Ã¼¸¦ ¼±¾ðÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm STAILQ_FIRST (Àº)´Â Å×ÀÏ Å¥ÀÇ ¼±µÎÀÇ ¿ä¼Ò¸¦, Å×ÀÏ Å¥°¡ ÇÏ´ÃÀ̶ó¸é NULL ¸¦ µ¹·ÁÁÝ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm STAILQ_FOREACH ÇÏ .Fa head ±×¸®°í ÂüÁ¶µÇ´Â Å×ÀÏ Å¥¸¦, °¢ ¿ä¼Ò¸¦ ¼ø¼­¿¡ .Fa var ¿¡ ÇÒ´çÇØ ¼ø¼­ ¹æÇâÀ¸·Î ÁÖ»ç ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm STAILQ_INIT ÇÏ .Fa head ÇÏÁö¸¸ ÂüÁ¶ÇÏ´Â Å×ÀÏ Å¥¸¦ ÃʱâÈ­ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm STAILQ_INSERT_HEAD (Àº)´Â »õ·Î¿î ¿ä¼Ò .Fa elm (À»)¸¦ Å×ÀÏ Å¥ÀÇ ¼±µÎ¿¡ »ðÀÔÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm STAILQ_INSERT_TAIL (Àº)´Â »õ·Î¿î ¿ä¼Ò .Fa elm (À»)¸¦ Å×ÀÏ Å¥ÀÇ ¸»¹Ì¿¡ »ðÀÔÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm STAILQ_INSERT_AFTER (Àº)´Â »õ·Î¿î ¿ä¼Ò .Fa elm (À»)¸¦ ¿ä¼Ò .Fa listelm ÀÇ µÚ·Î »ðÀÔÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm STAILQ_LAST (Àº)´Â Å×ÀÏ Å¥ÀÇ ¸»¹ÌÀÇ ¿ä¼Ò¸¦ µ¹·ÁÁÝ´Ï´Ù. Å×ÀÏ Å¥°¡ ÇÏ´ÃÀ̶ó¸é, ¹Ýȯ°ªÀº ¹ÌÁ¤µµ¸®ÀÔ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm STAILQ_NEXT (Àº)´Â Å×ÀÏ Å¥ÀÇ ´ÙÀ½ÀÇ ¿ä¼Ò¸¦, ÀÌ ¿ä¼Ò°¡ ¸»¹Ì¶ó¸é NULL ¸¦ µ¹·ÁÁÝ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm STAILQ_REMOVE_HEAD (Àº)´Â Å×ÀÏ Å¥ÀÇ ¼±µÎ·ÎºÎÅÍ ¿ä¼Ò (À»)¸¦ »èÁ¦ÇÕ´Ï´Ù. ÃÖÀûÀÎ È¿À²À» ¾ò±â À§Çؼ­(¶§¹®¿¡), Å×ÀÏ Å¥ÀÇ ¼±µÎ·ÎºÎÅÍ ¿ä¼Ò¸¦ »èÁ¦ÇÏ´Â °æ¿ì¿¡´Â ÀϹÝÀûÀÎ .Fa STAILQ_REMOVE ¸ÅÅ©·Îº¸´Ù ÀÌ ¸ÅÅ©·Î¸¦ ¸í½ÃÀûÀ¸·Î »ç¿ëÇØ¾ß ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm STAILQ_REMOVE (Àº)´Â Å×ÀÏ Å¥·ÎºÎÅÍ ¿ä¼Ò .Fa elm (À»)¸¦ »èÁ¦ÇÕ´Ï´Ù. .Sh ´ÜÀÏ ¸µÅ© Å×ÀÏ Å¥ÀÇ »ç¿ë¿¹ .Bd -literal STAILQ_HEAD(stailhead, entry) head = STAILQ_HEAD_INITIALIZER(head); struct stailhead *headp; /* ´ÜÀÏ ¸µÅ© Å×ÀÏ Å¥ Çìµå */ struct entry { ... STAILQ_ENTRY(entry) entries; /* Å×ÀÏ Å¥ */ ... } *n1, *n2, *n3, *np; STAILQ_INIT(&head); /* Å¥¸¦ ÃʱâÈ­ */ n1 = malloc(sizeof(struct entry)); /* ¼±µÎ¿¡ »ðÀÔ */ STAILQ_INSERT_HEAD(&head, n1, entries); n1 = malloc(sizeof(struct entry)); /* ¸»¹Ì¿¡ »ðÀÔ */ STAILQ_INSERT_TAIL(&head, n1, entries); n2 = malloc(sizeof(struct entry)); /* µÚ·Î »ðÀÔ */ STAILQ_INSERT_AFTER(&head, n1, n2, entries); /* »èÁ¦ */ STAILQ_REMOVE(&head, n2, entry, entries); free(n2); /* ¼±µÎ·ÎºÎÅÍ »èÁ¦ */ n3 = STAILQ_FIRST(&head); STAILQ_REMOVE_HEAD(&head, entries); free(n3); /* ¼ø¼­ ÁÖ»ç */ STAILQ_FOREACH(np, &head, entries) np-> ... /* Å×ÀÏ Å¥ÀÇ »èÁ¦ */ while (! STAILQ_EMPTY(&head)) { n1 = STAILQ_FIRST(&head); STAILQ_REMOVE_HEAD(&head, entries); free(n1); } /* Å×ÀÏ Å¥ÀÇ °í¼ÓÀÇ »èÁ¦ */ n1 = STAILQ_FIRST(&head); while (n1 ! = NULL) { n2 = STAILQ_NEXT(n1, entries); free(n1); n1 = n2; } STAILQ_INIT(&head); .Ed .Sh ¸®½ºÆ® ¸®½ºÆ®ÀÇ ÃÖÃʷδÂ, .Nm LIST_HEAD ¸ÅÅ©·Î·Î Á¤ÀǵǴ ±¸Á¶Ã¼°¡ ºÙ½À´Ï´Ù. ÀÌ ±¸Á¶Ã¼¿¡´Â, ¸®½ºÆ®ÀÇ ¼±µÎÀÇ ¿ä¼Ò¸¦ °¡¸®Å°´Â Æ÷ÀÎÅͰ¡ 1 °³ Æ÷ÇԵ˴ϴÙ. ¿ä¼Ò´Â ÀÌÁßÀ¸·Î ¸µÅ© µÇ°í ÀÖÀ¸¹Ç·Î, ¸®½ºÆ®¸¦ ÁÖ»ç ÇÏÁö ¾Ê°í ÀÓÀÇÀÇ ¿ä¼Ò¸¦ »èÁ¦ÇÒ ¼ö ÀÖ½À´Ï´Ù. »õ·Î¿î ¿ä¼Ò´Â, ±âÁ¸ÀÇ ¿ä¼ÒÀÇ Àü, ±âÁ¸ÀÇ ¿ä¼ÒÀÇ µÚ, ¸®½ºÆ®ÀÇ ¼±µÎ¿¡¼­ ¸®½ºÆ®¿¡ Ãß°¡ÇÒ ¼ö ÀÖ½À´Ï´Ù. .Fa LIST_HEAD ±¸Á¶Ã¼´Â, ÀÌÇÏ¿Í °°ÀÌ ¼±¾ðµË´Ï´Ù. .Bd -literal -offset indent LIST_HEAD(HEADNAME, TYPE) head; .Ed .Pp ¿©±â¼­ .Fa HEADNAME (Àº)´Â Á¤ÀÇÇÏ´Â ±¸Á¶Ã¼ÀÇ À̸§À¸·Î, .Fa TYPE (Àº)´Â ¸®½ºÆ®¿¡ ¸µÅ© ÇÏ´Â ¿ä¼ÒÀÇ ÇüÅÂÀÔ´Ï´Ù. ¸®½ºÆ®ÀÇ ÇìµåÀÇ Æ÷ÀÎÅÍ´Â, ´ÙÀ½¿¡ ÀÌÇÏ¿Í °°ÀÌ ¼±¾ðÇÒ ¼ö ÀÖ½À´Ï´Ù. .Bd -literal -offset indent struct HEADNAME *headp; .Ed .Pp (À̸§ .Li head (¿Í)°ú .Li headp (Àº)´Â, À¯Àú°¡ ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù. ) .Pp ¸ÅÅ©·Î .Nm LIST_HEAD_INITIALIZER (Àº)´Â ¸®½ºÆ®ÀÇ .Fa head (À»)¸¦ ÃʱâÈ­ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm LIST_EMPTY (Àº)´Â ¸®½ºÆ®¿¡ ¿ä¼Ò°¡ ¾ø´Â °æ¿ì¿¡ ½Ç·Î µË´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm LIST_ENTRY (Àº)´Â ¸®½ºÆ®ÀÇ ¿ä¼Ò¸¦ Á¢¼ÓÇÏ´Â ±¸Á¶Ã¼¸¦ ¼±¾ðÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm LIST_FIRST (Àº)´Â ¸®½ºÆ®ÀÇ ÃÖÃÊÀÇ ¿ä¼Ò¸¦, ¸®½ºÆ®°¡ ÇÏ´ÃÀ̶ó¸é NULL ¸¦ µ¹·ÁÁÝ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm LIST_FOREACH ÇÏ .Fa head ±×¸®°í ÂüÁ¶µÇ´Â ¸®½ºÆ®¸¦, °¢ ¿ä¼Ò¸¦ ¼ø¼­¿¡ .Fa var ¿¡ ÇÒ´çÇØ ¼ø¼­ ¹æÇâÀ¸·Î ÁÖ»ç ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm LIST_INIT ÇÏ .Fa head ÇÏÁö¸¸ ÂüÁ¶ÇÏ´Â ¸®½ºÆ®¸¦ ÃʱâÈ­ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm LIST_INSERT_HEAD (Àº)´Â »õ·Î¿î ¿ä¼Ò .Fa elm (À»)¸¦ ¸®½ºÆ®ÀÇ ¼±µÎ¿¡ »ðÀÔÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm LIST_INSERT_AFTER (Àº)´Â »õ·Î¿î ¿ä¼Ò .Fa elm (À»)¸¦ ¿ä¼Ò .Fa listelm ÀÇ µÚ·Î »ðÀÔÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm LIST_INSERT_BEFORE (Àº)´Â »õ·Î¿î ¿ä¼Ò .Fa elm (À»)¸¦ ¿ä¼Ò .Fa listelm ÀÇ Àü¿¡ »ðÀÔÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm LIST_NEXT (Àº)´Â ¸®½ºÆ®ÀÇ ´ÙÀ½ÀÇ ¿ä¼Ò¸¦, ÀÌ ¿ä¼Ò°¡ ¸»¹Ì¶ó¸é NULL ¸¦ µ¹·ÁÁÝ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm LIST_REMOVE (Àº)´Â ¿ä¼Ò .Fa elm (À»)¸¦ ¸®½ºÆ®·ÎºÎÅÍ »èÁ¦ÇÕ´Ï´Ù. .Sh ¸®½ºÆ®ÀÇ »ç¿ë¿¹ .Bd -literal LIST_HEAD(listhead, entry) head = LIST_HEAD_INITIALIZER(head); struct listhead *headp; /* ¸®½ºÆ® Çìµå */ struct entry { ... LIST_ENTRY(entry) entries; /* ¸®½ºÆ® */ ... } *n1, *n2, *n3, *np; LIST_INIT(&head); /* ¸®½ºÆ®¸¦ ÃʱâÈ­ */ n1 = malloc(sizeof(struct entry)); /* ¼±µÎ¿¡ »ðÀÔ */ LIST_INSERT_HEAD(&head, n1, entries); n2 = malloc(sizeof(struct entry)); /* µÚ·Î »ðÀÔ */ LIST_INSERT_AFTER(n1, n2, entries); n3 = malloc(sizeof(struct entry)); /* Àü¿¡ »ðÀÔ */ LIST_INSERT_BEFORE(n2, n3, entries); LIST_REMOVE(n2, entries); /* »èÁ¦ */ free(n2); /* ¼ø¼­ ÁÖ»ç */ LIST_FOREACH(np, &head, entries) np-> ... while (! LIST_EMPTY(&head)) { /* ¸®½ºÆ®ÀÇ »èÁ¦ */ n1 = LIST_FIRST(&head); LIST_REMOVE(n1, entries); free(n1); } n1 = LIST_FIRST(&head); /* ¸®½ºÆ®ÀÇ °í¼ÓÀÇ »èÁ¦ */ while (n1 ! = NULL) { n2 = LIST_NEXT(n1, entries); free(n1); n1 = n2; } LIST_INIT(&head); .Ed .Sh Å×ÀÏ Å¥ Å×ÀÏ Å¥ÀÇ ÃÖÃʷδÂ, .Nm TAILQ_HEAD ¸ÅÅ©·Î·Î Á¤ÀǵǴ ±¸Á¶Ã¼°¡ ºÙ½À´Ï´Ù. ÀÌ ±¸Á¶Ã¼¿¡´Â, Å×ÀÏ Å¥ÀÇ ÃÖÃÊÀÇ ¿ä¼Ò¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ¿Í Å×ÀÏ Å¥ÀÇ ¼±µÎÀÇ ¿ä¼Ò¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍÀÇ 2 °³°¡ Æ÷ÇԵ˴ϴÙ. ¿ä¼Ò´Â ÀÌÁßÀ¸·Î ¸µÅ© µÇ°í ÀÖÀ¸¹Ç·Î, Å×ÀÏ Å¥¸¦ ÁÖ»ç ÇÏÁö ¾Ê°í ÀÓÀÇÀÇ ¿ä¼Ò¸¦ »èÁ¦ÇÒ ¼ö ÀÖ½À´Ï´Ù. »õ·Î¿î ¿ä¼Ò´Â, ±âÁ¸ÀÇ ¿ä¼ÒÀÇ Àü, ±âÁ¸ÀÇ ¿ä¼ÒÀÇ µÚ, Å×ÀÏ Å¥ÀÇ ¼±µÎ, Å×ÀÏ Å¥ÀÇ ¸»¹Ì·Î Å×ÀÏ Å¥¿¡ Ãß°¡ÇÒ ¼ö ÀÖ½À´Ï´Ù. .Fa TAILQ_HEAD ±¸Á¶Ã¼´Â, ÀÌÇÏ¿Í °°ÀÌ ¼±¾ðµÇ°í ÀÖ½À´Ï´Ù. .Bd -literal -offset indent TAILQ_HEAD(HEADNAME, TYPE) head; .Ed .Pp ¿©±â¼­ .Li HEADNAME (Àº)´Â Á¤ÀÇÇÏ´Â ±¸Á¶Ã¼ÀÇ À̸§À¸·Î, .Li TYPE (Àº)´Â Å×ÀÏ Å¥¿¡ ¸µÅ© ÇÏ´Â ¿ä¼ÒÀÇ ÇüÅÂÀÔ´Ï´Ù. Å×ÀÏ Å¥ÀÇ ÇìµåÀÇ Æ÷ÀÎÅÍ´Â, ´ÙÀ½¿¡ ÀÌÇÏ¿Í °°ÀÌ ¼±¾ðµË´Ï´Ù. .Bd -literal -offset indent struct HEADNAME *headp; .Ed .Pp (À̸§ .Li head (¿Í)°ú .Li headp (Àº)´Â, À¯Àú°¡ ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù. ) .Pp ¸ÅÅ©·Î .Nm TAILQ_HEAD_INITIALIZER (Àº)´Â Å×ÀÏ Å¥ÀÇ .Fa head (À»)¸¦ ÃʱâÈ­ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm TAILQ_EMPTY (Àº)´Â Å×ÀÏ Å¥¿¡ ¿ä¼Ò°¡ ¾ø´Â °æ¿ì¿¡ ½Ç·Î µË´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm TAILQ_ENTRY (Àº)´Â Å×ÀÏ Å¥ÀÇ ¿ä¼Ò¸¦ Á¢¼ÓÇÏ´Â ±¸Á¶Ã¼¸¦ ¼±¾ðÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm TAILQ_FIRST (Àº)´Â Å×ÀÏ Å¥ÀÇ ÃÖÃÊÀÇ ¿ä¼Ò¸¦, Å×ÀÏ Å¥°¡ ÇÏ´ÃÀ̶ó¸é NULL ¸¦ µ¹·ÁÁÝ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm TAILQ_FOREACH ÇÏ .Fa head ±×¸®°í ÂüÁ¶µÇ´Â Å×ÀÏ Å¥¸¦, °¢ ¿ä¼Ò¸¦ ¼ø¼­¿¡ .Fa var ¿¡ ÇÒ´çÇØ ¼ø¼­ ¹æÇâÀ¸·Î ÁÖ»ç ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm TAILQ_FOREACH_REVERSE ÇÏ .Fa head ±×¸®°í ÂüÁ¶µÇ´Â Å×ÀÏ Å¥¸¦, °¢ ¿ä¼Ò¸¦ ¼ø¼­¿¡ .Fa var ¿¡ ÇÒ´çÇØ ¿ª¹æÇâÀ¸·Î ÁÖ»ç ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm TAILQ_INIT ÇÏ .Fa head ÇÏÁö¸¸ ÂüÁ¶ÇÏ´Â Å×ÀÏ Å¥¸¦ ÃʱâÈ­ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm TAILQ_INSERT_HEAD (Àº)´Â »õ·Î¿î ¿ä¼Ò .Fa elm (À»)¸¦ Å×ÀÏ Å¥ÀÇ ¼±µÎ¿¡ »ðÀÔÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm TAILQ_INSERT_TAIL (Àº)´Â »õ·Î¿î ¿ä¼Ò .Fa elm (À»)¸¦ Å×ÀÏ Å¥ÀÇ ¸»¹Ì¿¡ »ðÀÔÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm TAILQ_INSERT_AFTER (Àº)´Â »õ·Î¿î ¿ä¼Ò .Fa elm (À»)¸¦ ¿ä¼Ò .Fa listelm ÀÇ µÚ·Î »ðÀÔÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm TAILQ_INSERT_BEFORE (Àº)´Â »õ·Î¿î ¿ä¼Ò .Fa elm (À»)¸¦ ¿ä¼Ò .Fa listelm ÀÇ Àü¿¡ »ðÀÔÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm TAILQ_LAST (Àº)´Â Å×ÀÏ Å¥ÀÇ ¸»¹ÌÀÇ ¿ä¼Ò¸¦ µ¹·ÁÁÝ´Ï´Ù. Å×ÀÏ Å¥°¡ ÇÏ´ÃÀÇ °æ¿ì, ¹Ýȯ°ªÀº ¹ÌÁ¤µµ¸®ÀÔ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm TAILQ_NEXT (Àº)´Â Å×ÀÏ Å¥ÀÇ ´ÙÀ½ÀÇ ¿ä¼Ò¸¦, ±× ¿ä¼Ò°¡ ¸»¹ÌÀÇ °æ¿ì´Â NULL ¸¦ µ¹·ÁÁÝ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm TAILQ_PREV (Àº)´Â Å×ÀÏ Å¥ÀÇ ÀüÀÇ ¿ä¼Ò¸¦, ±× ¿ä¼Ò°¡ ¼±µÎÀÇ °æ¿ì´Â NULL ¸¦ µ¹·ÁÁÝ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm TAILQ_REMOVE (Àº)´Â ¿ä¼Ò .Fa elm (À»)¸¦ Å×ÀÏ Å¥·ÎºÎÅÍ »èÁ¦ÇÕ´Ï´Ù. .Sh Å×ÀÏ Å¥ÀÇ »ç¿ë¿¹ .Bd -literal TAILQ_HEAD(tailhead, entry) head = TAILQ_HEAD_INITIALIZER(head); struct tailhead *headp; /* Å×ÀÏ Å¥ Çìµå */ struct entry { ... TAILQ_ENTRY(entry) entries; /* Å×ÀÏ Å¥ */ ... } *n1, *n2, *n3, *np; TAILQ_INIT(&head); /* Å¥¸¦ ÃʱâÈ­ */ n1 = malloc(sizeof(struct entry)); /* ¼±µÎ¿¡ »ðÀÔ */ TAILQ_INSERT_HEAD(&head, n1, entries); n1 = malloc(sizeof(struct entry)); /* ¸»¹Ì¿¡ »ðÀÔ */ TAILQ_INSERT_TAIL(&head, n1, entries); n2 = malloc(sizeof(struct entry)); /* µÚ·Î »ðÀÔ */ TAILQ_INSERT_AFTER(&head, n1, n2, entries); n3 = malloc(sizeof(struct entry)); /* Àü¿¡ »ðÀÔ */ TAILQ_INSERT_BEFORE(n2, n3, entries); TAILQ_REMOVE(&head, n2, entries); /* »èÁ¦ */ free(n2); /* ¼ø¼­ ÁÖ»ç */ TAILQ_FOREACH(np, &head, entries) np-> ... /* ¿ªÁÖ»ç */ TAILQ_FOREACH_REVERSE(np, &head, tailhead, entries) np-> ... /* Å×ÀÏ Å¥ÀÇ »èÁ¦ */ while (! TAILQ_EMPTY(&head)) { n1 = TAILQ_FIRST(&head); TAILQ_REMOVE(&head, n1, entries); free(n1); } /* Å×ÀÏ Å¥ÀÇ °í¼ÓÀÇ »èÁ¦ */ n1 = TAILQ_FIRST(&head); while (n1 ! = NULL) { n2 = TAILQ_NEXT(n1, entries); free(n1); n1 = n2; } TAILQ_INIT(&head); .Ed .Sh ¼øÈ¯ Å¥ ¼øÈ¯ Å¥ÀÇ ÃÖÃʷδÂ, .Nm CIRCLEQ_HEAD ¸ÅÅ©·Î·Î Á¤ÀǵǴ ±¸Á¶Ã¼°¡ ºÙ½À´Ï´Ù. ÀÌ ±¸Á¶Ã¼¿¡´Â, ¼øÈ¯ Å¥ÀÇ ¼±µÎÀÇ ¿ä¼Ò¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ¿Í ¼øÈ¯ Å¥ÀÇ ¸»¹ÌÀÇ ¿ä¼Ò¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍÀÇ 2 °³°¡ Æ÷ÇԵ˴ϴÙ. ¿ä¼Ò´Â ÀÌÁßÀ¸·Î ¸µÅ© µÇ°í ÀÖÀ¸¹Ç·Î, Å¥¸¦ ÁÖ»ç ÇÏÁö ¾Ê°í ÀÓÀÇÀÇ ¿ä¼Ò¸¦ »èÁ¦ÇÒ ¼ö ÀÖ½À´Ï´Ù. »õ·Î¿î ¿ä¼Ò´Â, ±âÁ¸ÀÇ ¿ä¼ÒÀÇ Àü, ±âÁ¸ÀÇ ¿ä¼ÒÀÇ µÚ, ¼øÈ¯ Å¥ÀÇ ¼±µÎ, ¼øÈ¯ Å¥ÀÇ ¸»¹Ì·Î ¼øÈ¯ Å¥¿¡ Ãß°¡ÇÒ ¼ö ÀÖ½À´Ï´Ù. .Fa CIRCLEQ_HEAD ±¸Á¶Ã¼´Â ÀÌÇÏ¿Í °°ÀÌ ¼±¾ðµË´Ï´Ù. .Bd -literal -offset indent CIRCLEQ_HEAD(HEADNAME, TYPE) head; .Ed .Pp ¿©±â¼­ .Li HEADNAME (Àº)´Â Á¤ÀÇÇÏ´Â ±¸Á¶Ã¼ÀÇ À̸§À¸·Î, .Li TYPE (Àº)´Â ¼øÈ¯ Å¥¿¡ ¸µÅ© ÇÏ´Â ¿ä¼ÒÀÇ ÇüÅÂÀÔ´Ï´Ù. ¼øÈ¯ Å¥ÀÇ ÇìµåÀÇ Æ÷ÀÎÅÍ´Â, ´ÙÀ½¿¡ ÀÌÇÏ¿Í °°ÀÌ ¼±¾ðÇÒ ¼ö ÀÖ½À´Ï´Ù. .Bd -literal -offset indent struct HEADNAME *headp; .Ed .Pp (À̸§ .Li head (¿Í)°ú .Li headp (Àº)´Â, À¯Àú°¡ ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù. ) .Pp ¸ÅÅ©·Î .Nm CIRCLEQ_HEAD_INITIALIZER (Àº)´Â ¼øÈ¯ Å¥ÀÇ .Fa head (À»)¸¦ ÃʱâÈ­ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm CIRCLEQ_EMPTY (Àº)´Â ¼øÈ¯ Å¥¿¡ ¿ä¼Ò°¡ ¾ø´Â °æ¿ì¿¡ ½Ç·Î µË´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm CIRCLEQ_ENTRY (Àº)´Â ¼øÈ¯ Å¥ÀÇ ¿ä¼Ò¸¦ Á¢¼ÓÇÏ´Â ±¸Á¶Ã¼¸¦ ¼±¾ðÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm CIRCLEQ_FIRST (Àº)´Â ¼øÈ¯ Å¥ÀÇ ¼±µÎÀÇ ¿ä¼Ò¸¦ µ¹·ÁÁÝ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm CICRLEQ_FOREACH ÇÏ .Fa head ±×¸®°í ÂüÁ¶µÇ´Â ¼øÈ¯ Å¥¸¦, °¢ ¿ä¼Ò¸¦ ¼ø¼­¿¡ .Fa var ¿¡ ÇÒ´çÇØ ¼ø¼­ ¹æÇâÀ¸·Î ÁÖ»ç ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm CICRLEQ_FOREACH_REVERSE ÇÏ .Fa head ±×¸®°í ÂüÁ¶µÇ´Â ¼øÈ¯ Å¥¸¦, °¢ ¿ä¼Ò¸¦ ¼ø¼­¿¡ .Fa var ¿¡ ÇÒ´çÇØ ¿ª¹æÇâÀ¸·Î ÁÖ»ç ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm CIRCLEQ_INIT ÇÏ .Fa head ÇÏÁö¸¸ ÂüÁ¶ÇÏ´Â ¼øÈ¯ Å¥¸¦ ÃʱâÈ­ÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm CIRCLEQ_INSERT_HEAD (Àº)´Â »õ·Î¿î ¿ä¼Ò .Fa elm (À»)¸¦ ¼øÈ¯ Å¥ÀÇ ¼±µÎ¿¡ »ðÀÔÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm CIRCLEQ_INSERT_TAIL (Àº)´Â »õ·Î¿î ¿ä¼Ò .Fa elm (À»)¸¦ ¼øÈ¯ Å¥ÀÇ ¸»¹Ì¿¡ »ðÀÔÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm CIRCLEQ_INSERT_AFTER (Àº)´Â »õ·Î¿î ¿ä¼Ò .Fa elm (À»)¸¦ ¿ä¼Ò .Fa listelm ÀÇ µÚ·Î »ðÀÔÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm CIRCLEQ_INSERT_BEFORE (Àº)´Â »õ·Î¿î ¿ä¼Ò .Fa elm (À»)¸¦ ¿ä¼Ò .Fa listelm ÀÇ Àü¿¡ »ðÀÔÇÕ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm CIRCLEQ_LAST (Àº)´Â ¼øÈ¯ Å¥ÀÇ ¸»¹ÌÀÇ ¿ä¼Ò¸¦ µ¹·ÁÁÝ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm CIRCLEQ_NEXT (Àº)´Â ¼øÈ¯ Å¥ÀÇ ´ÙÀ½ÀÇ ¿ä¼Ò¸¦ µ¹·ÁÁÝ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm CIRCLEQ_PREV (Àº)´Â ¼øÈ¯ Å¥ÀÇ ÀüÀÇ ¿ä¼Ò¸¦ µ¹·ÁÁÝ´Ï´Ù. .Pp ¸ÅÅ©·Î .Nm CIRCLEQ_REMOVE (Àº)´Â ¿ä¼Ò .Fa elm (À»)¸¦ ¼øÈ¯ Å¥·ÎºÎÅÍ »èÁ¦ÇÕ´Ï´Ù. .Sh ¼øÈ¯ Å¥ÀÇ »ç¿ë¿¹ .Bd -literal CIRCLEQ_HEAD(circlehead, entry) head = CIRCLEQ_HEAD_INITIALIZER(head); struct circleq *headp; /* ¼øÈ¯ Å¥ Çìµå */ struct entry { ... CIRCLEQ_ENTRY(entry) entries; /* ¼øÈ¯ Å¥ */ ... } *n1, *n2, *np; CIRCLEQ_INIT(&head); /* ¼øÈ¯ Å¥¸¦ ÃʱâÈ­ */ n1 = malloc(sizeof(struct entry)); /* ¼±µÎ¿¡ »ðÀÔ */ CIRCLEQ_INSERT_HEAD(&head, n1, entries); n1 = malloc(sizeof(struct entry)); /* ¸»¹Ì¿¡ »ðÀÔ */ CIRCLEQ_INSERT_TAIL(&head, n1, entries); n2 = malloc(sizeof(struct entry)); /* µÚ·Î »ðÀÔ */ CIRCLEQ_INSERT_AFTER(&head, n1, n2, entries); n2 = malloc(sizeof(struct entry)); /* Àü¿¡ »ðÀÔ */ CIRCLEQ_INSERT_BEFORE(&head, n1, n2, entries); CIRCLEQ_REMOVE(&head, n1, entries); /* »èÁ¦ */ free(n1); /* ¼ø¼­ ÁÖ»ç */ CIRCLEQ_FOREACH(np, &head, entries) np-> ... /* ¿ªÁÖ»ç */ CIRCLEQ_FOREACH_REVERSE(np, &head, entries) np-> ... /* ¼øÈ¯ Å¥ÀÇ »èÁ¦ */ while (CIRCLEQ_FIRST(&head) ! = (void *) &head) { n1 = CIRCLEQ_HEAD(&head); CIRCLEQ_REMOVE(&head, n1, entries); free(n1); } /* ¼øÈ¯ Å¥ÀÇ °í¼ÓÀÇ »èÁ¦ */ n1 = CIRCLEQ_FIRST(&head); while (n1 ! = (void *) &head) { n2 = CIRCLEQ_NEXT(n1, entries); free(n1); n1 = n2; } CIRCLEQ_INIT(&head); .Ed .Sh ¿ª»ç .Nm queue ÇÔ¼ö´Â .Bx 4.4 ±×¸®°í óÀ½ µîÀåÇß½À´Ï´Ù.