insque(3) Library Functions Manual insque(3) NUME insque, remque - insereaza/elimina un element dintr-o coada BIBLIOTECA Biblioteca C standard (libc, -lc) SINOPSIS #include void insque(void *elem, void *prev); void remque(void *elem); Cerine pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultai feature_test_macros(7)): insque(), remque(): _XOPEN_SOURCE >= 500 || /* glibc >= 2.19: */ _DEFAULT_SOURCE || /* glibc <= 2.19: */ _SVID_SOURCE DESCRIERE Funciile insque() i remque() manipuleaza liste dublu legate. Fiecare element din lista este o structura ale carei prime doua elemente sunt un indicator inainte i un indicator inapoi. Lista legata poate fi liniara (adica, indicator inainte NULL la sfaritul listei i indicator inapoi NULL la inceputul listei) sau circulara. Funcia insque() insereaza elementul indicat de elem imediat dupa elementul indicat de prev. Daca lista este liniara, atunci apelul insque(elem, NULL) poate fi utilizat pentru a introduce elementul iniial al listei, iar apelul stabilete indicatorii inainte i inapoi ai lui elem la NULL. Daca lista este circulara, apelantul trebuie sa se asigure ca indicatorii inainte i inapoi ai primului element sunt iniializai pentru a indica elementul respectiv, iar argumentul prev al apelului insque() trebuie sa indice i el elementul. Funcia remque() elimina elementul indicat de elem din lista dublu legata. ATRIBUTE Pentru o explicaie a termenilor folosii in aceasta seciune, a se vedea attributes(7). +--------------------------------------+---------------------+---------+ |Interfaa | Atribut | Valoare | +--------------------------------------+---------------------+---------+ |insque(), remque() | Sigurana firelor | MT-Safe | +--------------------------------------+---------------------+---------+ VERSIUNI In sistemele vechi, argumentele acestor funcii 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 vei obine daca _GNU_SOURCE este definit inainte de a include . Locaia prototipurilor pentru aceste funcii difera intre mai multe versiuni ale UNIX. Cea de mai sus este versiunea POSIX. Unele sisteme le plaseaza in . STANDARDE POSIX.1-2008. ISTORIC POSIX.1-2001. ERORI In glibc 2.4 i anterior, nu era posibil sa se specifice prev ca NULL. In consecina, pentru a construi o lista liniara, apelantul trebuia sa construiasca o lista utilizand un apel iniial care coninea primele doua elemente ale listei, cu indicatorii inainte i inapoi din fiecare element iniializai corespunzator. EXEMPLE Programul de mai jos demonstreaza utilizarea lui insque(). Iata un exemplu de execuie a programului: $ ./a.out -c a b c Parcurgerea listei completate: a b c Aceasta a fost o lista circulara Sursa programului #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; /* Opiunea de linie de comanda ,,-c" poate fi utilizata pentru a specifica faptul ca lista este circulara.. */ 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); } /* Creai primul element i plasai-l in lista legata. */ elem = new_element(); first = elem; elem->name = argv[optind]; if (circular) { elem->forward = elem; elem->backward = elem; insque(elem, elem); } else { insque(elem, NULL); } /* Adauga argumentele de linie de comanda ramase ca elemente de lista. */ while (++optind < argc) { prev = elem; elem = new_element(); elem->name = argv[optind]; insque(elem, prev); } /* Parcurge lista de la inceput, imprimand 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 lista circulara\n"); exit(EXIT_SUCCESS); } CONSULTAI I queue(7) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.15 17 mai 2025 insque(3)