- bookworm-backports 4.26.3.1-3~bpo12+1
- testing 4.26.3.1-3
- unstable 4.26.3.1-3
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);
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¶
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 |