insque(3)

NUME
insque, remque - inserează/elimină un element dintr-o coadă

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <search.h>

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

    Cerințe pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultați feature_test_macros(7)):

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

DESCRIERE
Funcțiile insque() și remque() manipulează liste dublu legate. Fiecare element din listă este o structură ale cărei prime două elemente sunt un indicator înainte și un indicator înapoi. Lista legată poate fi liniară (adică, indicator înainte NULL la sfârșitul listei și indicator înapoi NULL la începutul listei) sau circulară.

Funcția insque() inserează elementul indicat de elem imediat după elementul indicat de prev.

Dacă lista este liniară, atunci apelul insque(elem, NULL) poate fi utilizat pentru a introduce elementul inițial al listei, iar apelul stabilește indicatorii înainte și înapoi ai lui elem la NULL.

Dacă lista este circulară, apelantul trebuie să se asigure că indicatorii înainte și înapoi ai primului element sunt inițializați pentru a indica elementul respectiv, iar argumentul prev al apelului insque() trebuie să indice și el elementul.

Funcția remque() elimină elementul indicat de elem din lista dublu legată.

ATRIBUTE
Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).
Interfață | Atribut | Valoare
insque(), remque() | Siguranța firelor | MT-Safe

VERSIUNI
În sistemele vechi, argumentele acestor funcții erau de tipul struct qelem *, definite astfel:

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

Aceasta este ceea ce veți obține dacă _GNU_SOURCE este definit înainte de a include <search.h>.

Locația prototipurilor pentru aceste funcții diferă între mai multe versiuni ale UNIX. Cea de mai sus este versiunea POSIX. Unele sisteme le plasează în <string.h>.

STANDARDE
POSIX.1-2008.

ISTORIC
POSIX.1-2001.

ERORI
În glibc 2.4 și anterior, nu era posibil să se specifice prev ca NULL. În consecință, pentru a construi o listă liniară, apelantul trebuia să construiască o listă utilizând un apel inițial care conținea primele două elemente ale listei, cu indicatorii înainte și înapoi din fiecare element inițializați corespunzător.

EXEMPLE
Programul de mai jos demonstrează utilizarea lui insque(). Iată un exemplu de execuție a programului:

    $ ./a.out -c a b c
    Parcurgerea listei completate:
        a
        b
        c
    Aceasta a fost o listă circulară

  Sursa programului
    #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;

        /* Opțiunea de linie de comandă „-c” poate fi utilizată
           pentru a specifica faptul că lista este 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,  "Utilizare: %s [-c] șir...\n", argv[0]);
            exit(EXIT_FAILURE);
        }

        /* Creați primul element și plasați-l în lista legată. */

        elem = new_element();
        first = elem;

        elem->name = argv[optind];

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

        /* Adaugă argumentele de linie de comandă rămase ca elemente de listă. */

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

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

        /* Parcurge lista de la început, imprimând numele elementelor. */

        printf("Parcurgerea listei completate::\n");
        elem = first;
        do {
            printf("    %s\n", elem->name);
            elem = elem->forward;
        } while (elem != NULL && elem != first);

        if (elem == first)
            printf("Aceasta a fost o listă circulară\n");

        exit(EXIT_SUCCESS);
    }

CONSULTAȚI ȘI
queue(7)

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.