Scroll to navigation

insque(3) Library Functions Manual 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 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.

15 iunie 2024 Pagini de manual de Linux 6.9.1