Provided by: manpages-fr-dev_3.65d1p1-1_all bug

NOM

       insque, remque - Ajouter ou supprimer un élément d'une file

SYNOPSIS

       #include <search.h>

       void insque(void *elem, void *prev);

       void remque(void *elem);

   Exigences de macros de test de fonctionnalités pour la glibc (consultez feature_test_macros(7)) :

       insque(), remque() :
           _SVID_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED

DESCRIPTION

       Les fonctions insque() et remque() manipulent une liste doublement chaînée. Chaque élément de cette liste
       est une structure dont les deux premiers éléments sont des pointeurs avant et arrière. La liste peut être
       linéaire (c'est-à-dire que l'élément en fin de liste a un pointeur avant à NULL, et l'élément en début de
       liste a un pointeur arrière à NULL) ou circulaire.

       insque() insère l'élément pointé par elem immédiatement après l'élément pointé par prev.

       Si  la  liste  est  linéaire,  alors  l'appel insque(elem, NULL) peut être utilisé pour insérer l'élément
       initial de la liste et l'appel définit les pointeurs avant et arrière à NULL.

       Si la liste est circulaire, l'appelant doit s'assurer que les  pointeurs  avant  et  arrière  du  premier
       élément  sont  initialisés  pour  pointer vers cet élément, et que l'argument prev de insque() doit aussi
       pointer vers cet élément.

       remque() supprime l'élément pointé par elem de la liste doublement chaînée.

CONFORMITÉ

       POSIX.1-2001.

NOTES

       Traditionnellement (par exemple, SunOS, Linux libc 4 et libc 5), les paramètres de ces fonctions sont  du
       type struct qelem *, définie comme ceci :

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

       C'est ce que vous obtiendrez si _GNU_SOURCE est définie avant l'inclusion de <search.h>.

       L'emplacement  des  prototypes  de  ces  fonctions  varie  suivant les différentes versions d'UNIX. Celui
       précisé ci-dessus correspond à la version POSIX. Certains systèmes  les  placent  dans  <string.h>.  Sous
       Linux, libc4 et libc5 ils sont renseignés dans <stdlib.h>.

BOGUES

       Dans  la  glibc 2.4  et  les  versions  précédentes, il n'était pas possible de spécifier prev à NULL. En
       conséquence, pour construire une liste linéaire, l'appelant devait construire une  liste  avec  un  appel
       initial  contenant  les  deux  premiers  éléments  de  la  liste,  avec  les  pointeurs  avant et arrière
       correctement définis pour chaque élément.

EXEMPLE

       Le programme suivant montre  une  utilisation  de  insque().  Ci-dessous  la  sortie  de  l'exécution  du
       programme :

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

   Source du programme

       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>
       #include <search.h>

       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 >= 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->name = argv[optind];

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

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

           while (++optind < argc) {
               prev = elem;

               elem = new_element();
               elem->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->name);
               elem = elem->forward;
           } while (elem != NULL && elem != first);

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

           exit(EXIT_SUCCESS);
       }

COLOPHON

       Cette page fait partie de la publication 3.65 du projet man-pages Linux. Une description du projet et des
       instructions     pour     signaler     des     anomalies    peuvent    être    trouvées    à    l'adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par
       l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

       Christophe      Blaess      <http://www.blaess.fr/christophe/>      (1996-2003),       Alain       Portal
       <http://manpagesfr.free.fr/>  (2003-2006).  Florentin  Duneau  et  l'équipe  francophone de traduction de
       Debian (2006-2009).

       Veuillez signaler toute erreur de traduction en écrivant à <debian-l10n-french@lists.debian.org>  ou  par
       un rapport de bogue sur le paquet manpages-fr.

       Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C
       <section> <page_de_man> ».

                                                9 septembre 2010                                       INSQUE(3)