Sunteți pe pagina 1din 8

Capitolul 3 STRUCTURI DE DATE

3.1.

Liste

Pentru a mbunti utilizarea memoriei sunt folosite structuri de date nlnuite. Acestea poart numele de liste, fiind compuse dintr-o mulime de noduri ntre care sunt definite anumite legturi. Se ntlnesc liste simplu nlnuite, liste dublu nlnuite, liste circulare, structuri de liste i liste speciale care sunt formate din atomi i din alte liste. n continuare se prezint listele simplu nlnuite i dublu nlnuite.

3.1.1. Liste simplu nlnuite


Lista simplu nlnuit este o structur liniar de date, n care fiecare nod este format dintr-o parte de informaie ce reine diverse valori caracteristice elementului respectiv i o parte de legtur ce reine adresa urmtorului element al listei. Exist valoarea NIL ce semnific adresa ctre nicieri folosit n marcarea legturii ultimului element al listei. Pentru a crea un nou nod, folosim o procedur predefinit new iar pentru a elibera spaiul de memorie n momentul n care nu mai este necesar reinerea unui anumit nod, exist procedura predefinit dispose. Declararea unei liste simplu nlnuite se realizeaz astfel:
lista=Anod; nod=record inf:integer; leg:lista; end; L:lista;

n pseudocod, crearea unei liste simplu nlnuite poate fi realizat astfel:


algoritm creare (L:lista); { L:=NIL; read (A); while (A<>0) do { new(Pl); P->inf:=A; P->leg:=L; L:=P; readln (A); } }

Procesul se ncheie la citirea numrului 0. Prezentam n continuare o


21

variant recursiv de creare a listei:


algoritm creare:lista; { read (A); if (A=O) then creare:=NIL; else { new(P); P->inf:=A; P->leg:=creare; creare:=P; } }

3.1.2. Parcurgerea unei liste simplu nlnuite


Dup ce a fost creat, se dorete n cele mai multe cazuri prelucrarea listei i afiarea rezultatelor. Deoarece exist numai legtura ctre urmtorul element al listei, toate prelucrrile vor fi fcute ncepnd cu primul element pn la ultimul, n ordinea dat de legturi. Cel mai simplu exemplu de prelucrare l constituie afiarea irului valorilor memorate n list. Parcurgem pas cu pas elementele listei i afim informaia elementului curent:
algoritm listare(L:lista); { P:=L; while (P<>NIL) do { write (P->inf, ); P:=P->leg; } )

3.1.3. Liste dublu nlnuite


ntr-o list dublu nlnuit fiecare nod are o parte de informaie i dou legturi: legtura succ ctre urmtorul element i legtura pred ctre elementul precedent. Putem memora poziia primului element L al listei. De cele mai multe ori se vor memora doua poziii n list: poziia P a primului element i poziia U a ultimului element. Declararea listei dublu nlnuite se realizeaz n felul urmtor:
lista=^nod; nod=record inf:integer; succ,pred:lista; end; L:lista;

Inserarea unui nou nod n interiorul unei liste dublu nlnuite se execut prin introducerea informaiei ataate i refacerea a patru legturi, astfel:

22

new (Q); Q^.inf:=A; Q^.succ:=P^.succ; Q^.pred:=P; Q^.succ^.pred:=Q; P^.succ:=Q;

Pentru eliminarea nodului desemnat de pointerul P, se vor executa instruciunile:


Q:=P; P^.succ^.pred:=Q^.pred; P^.pred^.succ:=Q^.succ; dispose (Q) ;

3.1.4. Parcurgerea unei liste dublu nlnuite


a) stnga. b) S se calculeze referina elementului aflat aproximativ la mijlocul acestei liste. Prezentam rezolvrile n pseudocod:
algoritm listare1(P,Q:lista); { AUX:=P; while (AUX<>NIL) do { write (AUX->inf, ); AUX:=AUX->succ; } } algoritm listare2(P,Q:lista); { AUX:=Q; while (AUX<>NIL) do { write (AUX->inf, ) ; AUX:=AUX->pred; } } algoritm cautare(P,Q:lista):lista; { AUXl:=P; AUX2:=Q; while (AUXl<>AUX2) do { AUXl:=AUXl->succ; if (AUXl=AUX2) then return (AUXl); AUX2:=AUX2->pred; if (AUXl=AUX2) then return (AUXl); } }

Fie o list dublu nlnuit, avnd referinele la capete P, respectiv Q. S se parcurg lista de la stnga la dreapta i de la dreapta la

23

3.2.

Arbori

3.2.1. Arbori liberi


Definiie. Fie o mulime V de noduri i o mulime E de muchii, fiecare muchie legnd dou noduri distincte. Se numete lan un ir X1, X2, , XL de noduri pentru care oricare dou noduri consecutive sunt legate printr-o muchie. Dac nodurile sunt distincte, lanul se numete elementar. Se numete ciclu elementar un lan X1, X2, , XL, X1 pentru care lanul X1, X2, , XL este lan elementar. Se numete arbore liber o pereche A = (V,E) cu proprietile: l. Oricare dou noduri distincte sunt legate printr-un lan. 2. Nu conine cicluri elementare. Propoziie. Un arbore liber cu |V| = n noduri are exact n l muchii. Se poate demonstra prin inducie dup numrul n de noduri. Propoziie. Urmtoarele afirmaii sunt echivalente: l. A = (V, E) este arbore liber. 2. A = (V,E) cu |V| = n are exact n 1 muchii i nu conine cicluri elementare. 3. A = (V,E) cu |V| = n are exact n 1 muchii i oricare dou noduri sunt legate printr-un lan.

3.2.2. Arbori cu rdcin


Definiie. Se numete arbore cu rdcin o mulime de noduri i muchii n care: exist un nod special numit rdcin, iar celelalte noduri sunt repartizate n k mulimi disjuncte A1, A2, , Ak care sunt la rndul lor arbori cu rdcin. Observaie. 1. Prin alegerea unui nod drept rdcin, un arbore liber se poate transforma n arbore cu rdcin. Totodat, fiecrui nod al arborelui i va fi asociat un nivel. Nivelul rdcinii se consider a fi nivelul 1, iar un nod de pe nivelul i are descendenii direci pe nivelul i + 1. 2. Pentru fiecare nod, se consider o ordine a mulimilor A1, A2, , Ak. Spunem atunci c arborele cu rdcin este ordonat. Definiie. Numim adncimea unui arbore cu rdcin nivelul maxim pe care l are un nod al acestui arbore. Modaliti statice de memorare 1. Putem memora arborele ca o expresie cu paranteze, n care prima poziie este eticheta rdcinii, urmat, ntre paranteze, de lista subarborilor respectivi. 2. Putem memora un vector de tai. Vectorul are lungimea egal cu numrul de noduri al arborelui, fiecare poziie i memornd ascendentul direct al nodului i, iar ascendentul rdcinii (care nu exist) se consider a fi 0.
24

3.2.3. Arbori binari


Definiie. Un arbore binar este un arbore cu rdcin, n care orice nod are cel mult doi descendeni direci i se face distincia ntre descendentul stng i descendentul drept. Definiie. Un arbore binar se numete arbore binar strict dac fiecare nod care are descendeni direci are exact doi astfel de descendeni. Definiie. Un arbore binar se numete arbore binar plin dac are un numr de n nivele i pentru toate nodurile de pe nivele 1, 2, ... , n l exist doi descendeni direci. Un arbore plin cu n nivele are

1 + 2 + ... + 2n 1 = 2n 1 noduri.
Definiie. Un arbore binar se numete arbore binar complet dac pe primele n 1 niveluri are toate nodurile posibile, iar pe ultimul nivel n are o parte din noduri, considerate pe orizontal n ordinea de la stnga la dreapta. Modaliti statice de memorare 1. Putem memora un arbore binar prin memorarea etichetei nodului rdcin i folosind doi vectori ST i DR ce memoreaz etichetele descendenilor direci stng respectiv drept. Dac nu exist descendent direct, pe poziia respectiva se va memora valoarea 0. 2. Dac arborele este arbore binar complet, sau apropiat de un arbore binar complet putem folosi eficient un singur vector, n care legturile stnga i dreapta sunt implicite.

3.2.4. Parcurgerea arborilor binari


Preordine Parcurgerea n preordine const n vizitarea rdcinii urmat de vizitarea subarborelui stng i apoi a subarborelui drept, acest lucru fiind valabil recursiv, pentru orice subarbore al arborelui considerat. Algoritmul recursiv este urmtorul:
algoritm preordine(A:arbore); { if (A<>NIL) then { write (A->INF) ; preordine(A->ST); preordine(A->DR); } }

Inordine Parcurgerea n inordine viziteaz, pentru fiecare subarbore, mai nti subarborele stng, apoi rdcina, apoi subarborele drept. Dac arborele binar respectiv este i arbore de cutare, atunci parcurgerea n inordine viziteaz

25

vrfurile n ordinea cresctoare a cheilor. Prezentm algoritmul recursiv:


algoritm inordine(A:arbore); { if (A<>NIL) then { inordine(A->ST); write(A->INF); inordine(A->DR); } }

Postordine Parcurgerea n postordine viziteaz, pentru fiecare subarbore, mai nti subarborele su stng, apoi subarborele su drept, apoi vrful rdcin. Parcurgerea n postordine se poate realiza recursiv astfel:
algoritm postordine(A:arbore); { if (A<>NIL) then { postordine(A->ST); postordine(A->DR); write(A->INF); } }

Toi algoritmii recursivi prezentai au i variante iterative, eliminarea recursivitii realizndu-se prin folosirea explicit a unor stive. Prezentm n continuare algoritmul iterativ de parcurgere n preordine:
algoritm RSD_iterativ { stiva<-vida; I :=RAD; OK:=true; while OK=true do { while (I<>NIL) do { write( I ); stiva<-I; I:=ST[I); } if (stiva<>vida) then { I<-stiva; I:=DR[I); } else OK:=false; } }

Parcurgerea pe nivele Dndu-se un arbore binar, s se viziteze vrfurile acestuia n ordinea cresctoare a nivelelor. Acest lucru se realizeaz folosind o coad auxiliar de noduri vizitate dar neprelucrate. Algoritmul se ncheie cnd coada devine vid, i este o particularizare a parcurgerii n lime a unui graf.

26

Procedura este iterativ i poate fi prezentat astfel:


algoritm nivele{A:arbore); ST:stiva; P,U:intregi; { P:=O;U:=O; U:=U+1;ST[U):=A;write {A->INF); while (P<U) do { P:=P+1; NOD:=ST[P]; if {NOD->ST<>NIL) then { U:=U+1; ST[U):=NOD->ST; write{NOD->ST->INF);} if {NOD->DR<>NIL) then { U:=U+1; ST[U]:=NOD->DR; write{NOD->DR->INF);} } }

27

28

S-ar putea să vă placă și