Documente Academic
Documente Profesional
Documente Cultură
L12 Liste2
L12 Liste2
2
CND FOLOSIM O LIST SIMPLU NLNUIT ORDONAT?....................................................................................................2
ADUGAREA NTR-O LIST SIMPLU NLNUIT ORDONAT.................................................................................................3
TERGEREA DINTR-O LIST SIMPLU NLNUIT ORDONAT.................................................................................................4
EXEMPLU CU LIST SIMPLU NLNUIT ORDONAT.............................................................................................................5
LISTE SIMPLU NLNUITE CIRCULARE.....................................................................................................................9
PROBLEME PROPUSE........................................................................................................................................................10
PROBLEMA 1: RULAREA EXEMPLULUI..................................................................................................................................10
PROBLEMA 2: IMPLEMETAREA UNEI COZI CU LIST SIMPLU NLNUIT CIRCULAR.........................................................10
PROBLEMA 3: FUNCII RECURSIVE PENTRU LISTE................................................................................................................10
PROBLEME EXTRA:................................................................................................................................................................10
Liste simplu nlnuite ordonate.
Vom lua cazul unui dicionar implementat cu list simplu nlnuit. Structura unui nod va fi:
typedef struct elem{
char *cuvant;
char *explicatie;
struct elem *urm;
}nod;
void main(){
nod *radacina; /* radacina listei = adresa de inceput a listei = adr primului
element, daca exista */
radacina=NULL; // radacina o initializam cu NULL obligatoriu!!!!!
}
Crearea unui nou nod o vom face cel mai probabil ntr-o funcie separat, urmnd ca apoi s
introducem nodul creat la locul su n list. Sunt exemplificate n imagine operaiile efectuate; urmrii
codul i n paralel reprezentarea grafic corespunztore (bucata de cod are aceeai culoare cu
reprezentarea grafic a efectului produs)
(4) nou->urm=NULL;
}
Adugarea ntr-o list simplu nlnuit ordonat
Dac dorim ca nodurile listei s fie parcurse dup un anumit criteriu (de exemplu cresctor dup
cmpul cuvant), trebuie ca introducerea unui nou nod n list s se fac astfel nct s nu se strice
ordinea listei (altfel spus, l vom introduce la locul lui); pentru exemplul considerat, vom introduce
noul nod naintea primului nod cu cmpul cuvant mai mare dect cmpul su cuvant.
Dac nodul nou are cmpul cuvant mai mic dect cmpul cuvant al primului nod
Observaie: cele 2 funcii, adaug_sfs i adaug_mijl difer doar la legtura 1, care am vzut c se
poate scrie la fel (urmrii comentariile din adaug_sfs). Rezult c putem scrie o singur funcie
pentru adugarea la sfrit i n interiorul listei; mai exact, funcia pentru adugare dup nodul p din
interiorul listei acoper i cazul cnd nodul p este ultimul.
Dac nu avem un pointer care s ne rein adresa ultimului nod, parcurgem lista i ne oprim naintea
ultimului nod
Parcurgem lista i ne oprim naintea nodului pe care vrem s l tergem, adic la nodul p
Observaie: cele 2 funcii, sterg_sfs i sterg_mijl difer doar la legtura 2, care am vzut c se
poate scrie la fel (urmrii comentariile din sterg_sfs). Rezult c putem scrie o singur funcie
pentru tergerea la sfrit i n interiorul listei; mai exact, funcia pentru tergere a nodului de dup
nodul p din interioru listei acoper i cazul cnd acesta este ultimul.
}
Liste simplu nlnuite circulare
O list simplu nlanuit va fi circular dac ultimul ei nod (cmpul su urm mai exact) va pointa spre
primul su nod. Putem s ne reprezentm astfel acest tip particular de list:
Lista fiind circular, nu mai are un prim nod i un ultim nod (de regul, dar nu neaprat, noi hotrm
cum implementm); vom avea un nod curent (l vom boteza crt). Acest nod poate s aib diverse
semnificaii, n funcie de problema.
Coada (FIFO)
Coada este o list simplu nlnuit (poate s fie i circular) n care tergerea se face la nceput i
adugare se face doar la sfrit (se zice c este de tip FIFO = First In Firs Out).
Pentru implementarea cu list simplu nlnuit vom folosi 2 pointeri, unul pentru primul nod (de
aici vom terge) i unul pentru ultimul nod (aici vom face adugarea).
Dac implemetm coada circular, n pointerul crt vom stoca adresa ultimului element introdus;
astfel, adugarea unui nod nou se va face dup nodul (*crt) (crt pointnd apoi spre nodul nou
introdus). De ters vom terge nodul de dup crt, deoarece acesta este nodul introdus cel mai
devreme.