
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
        "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- MyFirstUnitAd -->
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:250px"
     data-ad-client="ca-pub-5778386704669218"
     data-ad-slot="1503492166"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <link rel="stylesheet" type="text/css" href="../../../style.css" title="style" />
    <link rel="stylesheet" type="text/css" href="../style.css" title="style" />
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />

    <title>insque(3) - Linux manual page</title>
</head>

<body>

<div class="page-top"><a id="top_of_page"></a></div>
<!--%%%TOP_BAR%%%-->
    <div class="nav-bar">
        <table class="nav-table">
            <tr>
                <td class="nav-cell">
                    <p class="nav-text">
                        <a href="http://man7.org/index.html">man7.org</a> &gt; Linux &gt; <a href="../index.html">man-pages</a>
                    </p>
                </td>
                <td class="training-cell">
                    <p class="training-text"><a class="training-link" href="http://man7.org/training/">Linux/UNIX system programming training</a></p>
                </td>
            </tr>
        </table>
    </div>

<hr class="nav-end" />

<!--%%%PAGE_START%%%-->


<table class="sec-table">
<tr>
    <td>
        <p class="section-dir">
<a href="remque.3.html#NAME">NAME</a> | <a href="remque.3.html#SYNOPSIS">SYNOPSIS</a> | <a href="remque.3.html#DESCRIPTION">DESCRIPTION</a> | <a href="remque.3.html#ATTRIBUTES">ATTRIBUTES</a> | <a href="remque.3.html#CONFORMING_TO">CONFORMING&nbsp;TO</a> | <a href="remque.3.html#NOTES">NOTES</a> | <a href="remque.3.html#BUGS">BUGS</a> | <a href="remque.3.html#EXAMPLE">EXAMPLE</a> | <a href="remque.3.html#SEE_ALSO">SEE&nbsp;ALSO</a> | <a href="remque.3.html#COLOPHON">COLOPHON</a>
        </p>
    </td>
    <td class="search-box">
        <div class="man-search-box">

            <form method="get" action="http://www.google.com/search">
                <fieldset class="man-search">
                    <input type="text" name="q" size="10" maxlength="255" value="" />
                    <input type="hidden" name="sitesearch" value="man7.org/linux/man-pages" />
                    <input type="submit" name="sa" value="Search online pages" />
                </fieldset>
            </form>

        </div>
    </td>
    <td> </td>
</tr>
</table>

<pre>
<span class="headline">INSQUE(3)                 Linux Programmer's Manual                INSQUE(3)</span>
</pre>
<h2><a id="NAME" href="remque.3.html#NAME"></a>NAME  &nbsp; &nbsp; &nbsp; &nbsp; <a href="remque.3.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       insque, remque - insert/remove an item from a queue
</pre>
<h2><a id="SYNOPSIS" href="remque.3.html#SYNOPSIS"></a>SYNOPSIS  &nbsp; &nbsp; &nbsp; &nbsp; <a href="remque.3.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       <b>#include &lt;search.h&gt;</b>

       <b>void insque(void *</b><i>elem</i><b>, void *</b><i>prev</i><b>);</b>

       <b>void remque(void *</b><i>elem</i><b>);</b>

   Feature Test Macro Requirements for glibc (see <a href="../man7/feature_test_macros.7.html">feature_test_macros(7)</a>):

       <b>insque</b>(), <b>remque</b>():
           _XOPEN_SOURCE &gt;= 500
               || /* Glibc since 2.19: */ _DEFAULT_SOURCE
               || /* Glibc versions &lt;= 2.19: */ _SVID_SOURCE
</pre>
<h2><a id="DESCRIPTION" href="remque.3.html#DESCRIPTION"></a>DESCRIPTION  &nbsp; &nbsp; &nbsp; &nbsp; <a href="remque.3.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       The <b>insque</b>() and <b>remque</b>() functions manipulate doubly-linked lists.
       Each element in the list is a structure of which the first two
       elements are a forward and a backward pointer.  The linked list may
       be linear (i.e., NULL forward pointer at the end of the list and NULL
       backward pointer at the start of the list) or circular.

       The <b>insque</b>() function inserts the element pointed to by <i>elem</i>
       immediately after the element pointed to by <i>prev</i>.

       If the list is linear, then the call <i>insque(elem, NULL)</i> can be used
       to insert the initial list element, and the call sets the forward and
       backward pointers of <i>elem</i> to NULL.

       If the list is circular, the caller should ensure that the forward
       and backward pointers of the first element are initialized to point
       to that element, and the <i>prev</i> argument of the <b>insque</b>() call should
       also point to the element.

       The <b>remque</b>() function removes the element pointed to by <i>elem</i> from the
       doubly-linked list.
</pre>
<h2><a id="ATTRIBUTES" href="remque.3.html#ATTRIBUTES"></a>ATTRIBUTES  &nbsp; &nbsp; &nbsp; &nbsp; <a href="remque.3.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       For an explanation of the terms used in this section, see
       <a href="../man7/attributes.7.html">attributes(7)</a>.

       ┌───────────────────┬───────────────┬─────────┐
       │<b>Interface          </b>│ <b>Attribute     </b>│ <b>Value   </b>│
       ├───────────────────┼───────────────┼─────────┤
       │<b>insque</b>(), <b>remque</b>() │ Thread safety │ MT-Safe │
       └───────────────────┴───────────────┴─────────┘
</pre>
<h2><a id="CONFORMING_TO" href="remque.3.html#CONFORMING_TO"></a>CONFORMING TO  &nbsp; &nbsp; &nbsp; &nbsp; <a href="remque.3.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       POSIX.1-2001, POSIX.1-2008.
</pre>
<h2><a id="NOTES" href="remque.3.html#NOTES"></a>NOTES  &nbsp; &nbsp; &nbsp; &nbsp; <a href="remque.3.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       On ancient systems, the arguments of these functions were of type
       <i>struct qelem *</i>, defined as:

           struct qelem {
               struct qelem *q_forw;
               struct qelem *q_back;
               char          q_data[1];
           };

       This is still what you will get if <b>_GNU_SOURCE </b>is defined before
       including <i>&lt;search.h&gt;</i>.

       The location of the prototypes for these functions differs among sev‐
       eral versions of UNIX.  The above is the POSIX version.  Some systems
       place them in <i>&lt;string.h&gt;</i>.
</pre>
<h2><a id="BUGS" href="remque.3.html#BUGS"></a>BUGS  &nbsp; &nbsp; &nbsp; &nbsp; <a href="remque.3.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       In glibc 2.4 and earlier, it was not possible to specify <i>prev</i> as
       NULL.  Consequently, to build a linear list, the caller had to build
       a list using an initial call that contained the first two elements of
       the list, with the forward and backward pointers in each element
       suitably initialized.
</pre>
<h2><a id="EXAMPLE" href="remque.3.html#EXAMPLE"></a>EXAMPLE  &nbsp; &nbsp; &nbsp; &nbsp; <a href="remque.3.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       The program below demonstrates the use of <b>insque</b>().  Here is an
       example run of the program:

           $ <b>./a.out -c a b c</b>
           Traversing completed list:
               a
               b
               c
           That was a circular list

   <b>Program source</b>

       #include &lt;stdio.h&gt;
       #include &lt;stdlib.h&gt;
       #include &lt;unistd.h&gt;
       #include &lt;search.h&gt;

       struct element {
           struct element *forward;
           struct element *backward;
           char *name;
       };

       static struct element *
       new_element(void)
       {
           struct element *e;

           e = malloc(sizeof(struct element));
           if (e == NULL) {
               fprintf(stderr, "malloc() failed\n");
               exit(EXIT_FAILURE);
           }

           return e;
       }

       int
       main(int argc, char *argv[])
       {
           struct element *first, *elem, *prev;
           int circular, opt, errfnd;

           /* The "-c" command-line option can be used to specify that the
              list is circular */

           errfnd = 0;
           circular = 0;
           while ((opt = getopt(argc, argv, "c")) != -1) {
               switch (opt) {
               case 'c':
                   circular = 1;
                   break;
               default:
                   errfnd = 1;
                   break;
               }
           }

           if (errfnd || optind &gt;= argc) {
               fprintf(stderr,  "Usage: %s [-c] string...\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           /* Create first element and place it in the linked list */

           elem = new_element();
           first = elem;

           elem-&gt;name = argv[optind];

           if (circular) {
               elem-&gt;forward = elem;
               elem-&gt;backward = elem;
               insque(elem, elem);
           } else {
               insque(elem, NULL);
           }

           /* Add remaining command-line arguments as list elements */

           while (++optind &lt; argc) {
               prev = elem;

               elem = new_element();
               elem-&gt;name = argv[optind];
               insque(elem, prev);
           }

           /* Traverse the list from the start, printing element names */

           printf("Traversing completed list:\n");
           elem = first;
           do {
               printf("    %s\n", elem-&gt;name);
               elem = elem-&gt;forward;
           } while (elem != NULL &amp;&amp; elem != first);

           if (elem == first)
               printf("That was a circular list\n");

           exit(EXIT_SUCCESS);
       }
</pre>
<h2><a id="SEE_ALSO" href="remque.3.html#SEE_ALSO"></a>SEE ALSO  &nbsp; &nbsp; &nbsp; &nbsp; <a href="remque.3.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       <a href="queue.3.html">queue(3)</a>
</pre>
<h2><a id="COLOPHON" href="remque.3.html#COLOPHON"></a>COLOPHON  &nbsp; &nbsp; &nbsp; &nbsp; <a href="remque.3.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       This page is part of release 4.15 of the Linux <i>man-pages</i> project.  A
       description of the project, information about reporting bugs, and the
       latest version of this page, can be found at
       <a href="https://www.kernel.org/doc/man-pages/">https://www.kernel.org/doc/man-pages/</a>.

<span class="footline">                                 2017-09-15                        INSQUE(3)</span>
</pre>

<hr class="end-man-text" />

<p class="page-copyright"><a href="insque.3.license.html">Copyright and license for this manual page</a></p> 
<hr class="start-footer" />

<div class="footer"> 

<table class="colophon-table">
    <tr>
    <td class="pub-info">
        <p>
            HTML rendering created 2018-02-02
            by <a href="http://man7.org/mtk/index.html">Michael Kerrisk</a>, 
            author of 
            <a href="http://man7.org/tlpi/"><em>The Linux Programming Interface</em></a>, 
            maintainer of the 
            <a href="https://www.kernel.org/doc/man-pages/">Linux <em>man-pages</em> project</a>.
        </p>
        <p>
            For details of in-depth
            <strong>Linux/UNIX system programming training courses</strong>
            that I teach, look <a href="http://man7.org/training/">here</a>.
        </p>
        <p>
            Hosting by <a href="http://www.jambit.com/index_en.html">jambit GmbH</a>.
        </p>
        <p>
            <a href="http://validator.w3.org/check?uri=referer">
            <img src="http://www.w3.org/Icons/valid-xhtml11"
                alt="Valid XHTML 1.1" height="31" width="88" />
            </a>
        </p>
    </td>
    <td class="colophon-divider">
    </td>
    <td class="tlpi-cover">
        <a href="http://man7.org/tlpi/"><img src="../../../tlpi/cover/TLPI-front-cover-vsmall.png" alt="Cover of TLPI" /></a>
    </td>
    </tr>
</table>

</div>

<hr class="end-footer" />



<!--BEGIN-SITETRACKING-->
<!-- SITETRACKING.man7.org_linux_man-pages -->

<!-- Start of StatCounter Code (xhtml) -->

<script type="text/javascript">
//<![CDATA[
var sc_project=7422636; 
var sc_invisible=1; 
var sc_security="9b6714ff"; 
//]]>
</script>
<script type="text/javascript"
src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="website
statistics" href="http://statcounter.com/"
class="statcounter"><img class="statcounter"
src="http://c.statcounter.com/7422636/0/9b6714ff/1/"
alt="website statistics" /></a></div></noscript>

<!-- End of StatCounter Code -->


<!-- Start of Google Analytics Code -->

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-9830363-8']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

<!-- End of Google Analytics Code -->

<!--END-SITETRACKING-->

</body>
</html>
