Documente Academic
Documente Profesional
Documente Cultură
Laborator III
1 Scopul laboratorului
Laboratorul III al materiei Structuri de Date şi Algoritmi are ca scop introdu-
cerea structurii de date listă dublu înlănţuită, sau mai scurt, listă dublă.
În acest laborator se parcurg următoarele puncte:
• structura de date a unei liste dublu înlănţuită
• modul de funcţionare a unei liste dublu înlănţuită
2 Desfăşurarea lucrării
Comparând lista dublu înlănţuită cu lista simplu înlănţuită, prima diferă doar
prin faptul că ţine minte, pe lângă adresa următorului element, şi adresa ele-
mentului precedent. Acest lucru oferă mai multe avantaje, dintre care putem
evidenţia o flexibilitate sporită în parcurgere (putând fi făcută în ambele sensuri)
şi uşurinţă în operaţii.
1
Transpus în plan vizual, codul de mai sus arată în felul următor:
info
2
12
13 return 0;
14 }
*head *end
3
31 // i n f o r m a t i a u t i l a e s t e temp−>i n f o
32 temp = temp−>p r e v ; // tr ece m l a e l e m e n t u l a n t e r i o r
33 }
34
35 return 0;
36 }
4
2.3 Adăugarea unui element în lista dublu înlănţuită
Iniţial plecăm de la o listă goală, adică ambii pointeri *head şi *end sunt
NULL (figura 4).
NULL
*head *end
5
8. actualizarea pointerului *head (dacă s-a modificat primul element)
9. actualizarea pointerului *end (dacă acesta există şi are nevoie de modifi-
care)
În continuare sunt exemplificate prin figuri cazurile de adăugare când sunt dis-
ponibili ambii pointeri: *head şi *end.
*head *end
NULL NULL
info1 info2
*head *end
6
1 PNODE addLast (PNODE head , i n t info_new )
2 {
3 PNODE temp = NULL;
4 temp = (PNODE) m a l l o c ( s i z e o f (NODE) ∗ 1 ) ;
5 i f ( temp == NULL)
6 {
7 p r i n t f ( " E r o a r e l a a l o c a r e ! \ n" ) ;
8 exit (0) ; // nu a r e s e n s s a c o n t i n u i
9 }
10 temp−>i n f o = info_new ;
11 temp−>n e x t = NULL;
12 temp−>p r e v = NULL;
13
14 i f ( head == NULL) // daca l i s t a e r a g o a l a
15 r e t u r n temp ; // va f i p r i m u l e l e m e n t
16
17 // parcurgem pana l a u l t i m u l e l e m e n t a l listei
18 PNODE i = head ;
19 w h i l e ( i −>n e x t != NULL)
20 i = i −>n e x t ;
21
22 i −>n e x t = temp ;
23 temp−>p r e v = i ;
24 r e t u r n head ;
25 }
26
27 PNODE a d d A f t e r (PNODE head , i n t i n f o _ s e a r c h , i n t info_new )
28 {
29 PNODE temp = NULL;
30 temp = (PNODE) m a l l o c ( s i z e o f (NODE) ∗ 1 ) ;
31 i f ( temp == NULL)
32 {
33 p r i n t f ( " E r o a r e l a a l o c a r e ! \ n" ) ;
34 exit (0) ; // nu a r e s e n s s a c o n t i n u i
35 }
36 temp−>i n f o = info_new ;
37 temp−>n e x t = NULL;
38 temp−>p r e v = NULL;
39
40 i f ( head == NULL) // daca l i s t a e r a g o a l a
41 r e t u r n temp ; // va f i p r i m u l e l e m e n t
42
43 // parcurgem pana gasim e l e m e n t u l c a u t a t
44 // daca nu e x i s t a , parcurgem pana l a u l i m u l e l e m e n t a l listei
45 // s i adaugam e l e m e n t u l nou a c o l o
46
47 PNODE i = head ;
48 w h i l e ( ( i −>n e x t != NULL) && ( i −>i n f o != i n f o _ s e a r c h ) )
49 i = i −>n e x t ;
50
51 i −>next−>p r e v = temp ; // e l e m e n t u l p r e c e d e n t e l e m e n t u l u i urmator
52 temp−>n e x t = i −>n e x t ; // adaugam e l e m e n t u l temp i n t r e
53 // elem i s i elem i −>n e x t
54 temp−>p r e v = i ; // e l e m e n t u l p r e c e d e n t e l e m e n t u l u i nou
55 i −>n e x t = temp ;
56 r e t u r n head ;
57 }
7
58
59 i n t main ( )
60 {
61 PNODE head = NULL;
62
63 head = addLast ( head , 1 ) ;
64 addLast ( head , 2 ) ;
65 addLast ( head , 3 ) ;
66 addLast ( head , 4 ) ;
67 addLast ( head , 5 ) ;
68
69 // i n momentul a c e s t a l i s t a a r a t a a s a
70 //NULL<−1<−>2<−>3<−>4<−>5−>NULL
71
72 head = a d d A f t e r ( head , 1 , 1 0 ) ;
73 a d d A f t e r ( head , 2 , 2 0 ) ;
74 a d d A f t e r ( head , 3 , 3 0 ) ;
75
76 // i n momentul a c e s t a l i s t a a r a t a a s a
77 //NULL<−1<−>10<−>2<−>2<−>3<−>30<−>4<−>5−>NULL
78
79 return 0;
80 }
*head *end
8
NULL info1 info3 NULL
9
46
47 return 0;
48 }
3 Probleme
1. Creaţi o funcţie care construieşte o listă dublu înlănţuită dintr-un vector
dat.
2. Pornind de la o listă dublă în care nu ştim decât adresa unui element
oarecare, să se găsească primul şi ultimul element.
3. Creaţi o funcţie de adăugare în lista dublă care să primească pe lângă
parametrii standard încă un parametru care să specifice dacă elementul
nou adăugat se va adăuga mai aproape de începutul sau de sfârşitul listei.
Implementaţi adăugarea în mod eficient să dureze, în medie, mai puţin
decât dacă nu ar exista acest parametru.
4. Implementaţi funcţiile de adăugare şi ştergere din lista dublă pe baza
pointerului *end.
5. Implementaţi o listă simplu înlănţuită ciclică. Adaptaţi apoi codul pen-
tru a funcţiona folosind o listă dublu înlănţuită.
10