dwww Home | Manual pages | Find package

insque(3)                  Library Functions Manual                  insque(3)

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

BIBLIOTHÈQUE
       Bibliothèque C standard (libc, -lc)

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 (consulter
   feature_test_macros(7)) :

       insque(), remque() :
           _XOPEN_SOURCE >= 500
               || /* glibc >= 2.19 : */ _DEFAULT_SOURCE
               || /* glibc <= 2.19 : */ _SVID_SOURCE

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.

ATTRIBUTS
       Pour une explication des termes utilisés dans cette section,  consulter
       attributes(7).

       ┌─────────────────────────────────────┬──────────────────────┬─────────┐
       │InterfaceAttributValeur  │
       ├─────────────────────────────────────┼──────────────────────┼─────────┤
       │insque(), remque()                   │ Sécurité des threads │ MT-Safe │
       └─────────────────────────────────────┴──────────────────────┴─────────┘

STANDARDS
       POSIX.1-2001, POSIX.1-2008.

NOTES
       Sur d'anciens systèmes, les paramètres de ces fonctions étaient du type
       struct qelem *, défini 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'inclu-
       sion 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>.

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 li-
       né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.

EXEMPLES
       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 <search.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>

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

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

           e = malloc(sizeof(*e));
           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);
       }

VOIR AUSSI
       queue(7)

TRADUCTION
       La traduction française de cette page de manuel a été créée par  Chris-
       tophe  Blaess  <https://www.blaess.fr/christophe/>, Stéphan Rafin <ste-
       phan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, Fran-
       çois  Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Gué-
       rard <fevrier@tigreraye.org>, Jean-Luc  Coulon  (f5ibh)  <jean-luc.cou-
       lon@wanadoo.fr>,  Julien  Cristau <jcristau@debian.org>, Thomas Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François  <nicolas.francois@centra-
       liens.net>,  Florentin  Duneau <fduneau@gmail.com>, Simon Paillard <si-
       mon.paillard@resel.enst-bretagne.fr>,   Denis   Barbier    <barbier@de-
       bian.org>,  David  Prévot  <david@tilapin.org>,  Jean-Baptiste Holcroft
       <jean-baptiste@holcroft.fr>  et  Grégoire  Scano   <gregoire.scano@mal-
       loc.fr>

       Cette traduction est une documentation libre ; veuillez vous reporter à
       la       GNU       General       Public        License        version 3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  concernant  les conditions
       de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si vous découvrez un bogue dans la traduction de cette page de  manuel,
       veuillez envoyer un message à ⟨debian-l10n-french@lists.debian.org⟩.

Pages du manuel de Linux 6.03   5 février 2023                       insque(3)

Generated by dwww version 1.15 on Sat Jun 29 01:36:52 CEST 2024.