insque(3) Library Functions Manual insque(3) NOM insque, remque - Ajouter ou supprimer un element d'une file BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include void insque(void *elem, void *prev); void remque(void *elem); Exigences de macros de test de fonctionnalites 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 chainee. Chaque element de cette liste est une structure dont les deux premiers elements sont des pointeurs avant et arriere. La liste peut etre lineaire (c'est-a-dire que l'element en fin de liste a un pointeur avant a NULL, et l'element en debut de liste a un pointeur arriere a NULL) ou circulaire. insque() insere l'element pointe par elem immediatement apres l'element pointe par prev. Si la liste est lineaire, alors l'appel insque(elem, NULL) peut etre utilise pour inserer l'element initial de la liste et l'appel definit les pointeurs avant et arriere a NULL. Si la liste est circulaire, l'appelant doit s'assurer que les pointeurs avant et arriere du premier element sont initialises pour pointer vers cet element, et que l'argument prev de insque() doit aussi pointer vers cet element. remque() supprime l'element pointe par elem de la liste doublement chainee. ATTRIBUTS Pour une explication des termes utilises dans cette section, consulter attributes(7). +---------------------------------+--------------------------+---------+ |Interface | Attribut | Valeur | +---------------------------------+--------------------------+---------+ |insque(), remque() | Securite des threads | MT-Safe | +---------------------------------+--------------------------+---------+ VERSIONS Sur d'anciens systemes, les parametres de ces fonctions etaient du type struct qelem *, defini 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 definie avant l'inclusion de . L'emplacement des prototypes de ces fonctions varie suivant les differentes versions d'UNIX. Celui precise ci-dessus correspond a la version POSIX. Certains systemes les placent dans . STANDARDS POSIX.1-2008. HISTORIQUE POSIX.1-2001. BOGUES Dans la glibc 2.4 et les versions precedentes, il n'etait pas possible de specifier prev a NULL. En consequence, pour construire une liste lineaire, l'appelant devait construire une liste avec un appel initial contenant les deux premiers elements de la liste, avec les pointeurs avant et arriere correctement definis pour chaque element. EXEMPLES Le programme suivant montre une utilisation de insque(). Ci-dessous la sortie de l'execution du programme : $ ./a.out -c a b c Traversing completed list: a b c That was a circular list Source du programme #include #include #include #include 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 francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Jean-Baptiste Holcroft et Gregoire Scano Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 insque(3)