Documente Academic
Documente Profesional
Documente Cultură
Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu
PROIECTAREA
ALGORITMILOR
Lect. univ. dr. Adrian Runceanu
1
Curs 4
Coninutul cursului
4. Structuri implementate dinamic:
4.1. Stiva
4.2. Coada
4.3. Lista simplu nlnuit
4.4. Lista dublu nlnuit
4.2. Coada
4.2. Coada
4.2. Coada
Astfel, o reprezentare grafic a structurii de tip
coad poate arta n felul urmtor:
<- Extragere elemente
prim
ultim
4.2. Coada
Pentru implementarea dinamic a cozii, sunt
necesare urmtoarele declaraii:
typedef struct tnod
{
tip inf;
//
informatia propriu-zisa
struct tnod *leg; //
informatia de legatura
} TNOD;
TNOD *prim,*ultim; /* adresa primului, respectiv a ultimului
element din coada */
4.2. Coada
Avnd aceste date, operaiile cu coada
folosind alocarea dinamic a memoriei, n limbajul
C++ se pot implementa astfel:
1) Iniializarea cozii:
void Creare_vida (TNOD *prim, TNOD *ultim)
{
prim=ultim=NULL;
}
Proiectarea Algoritmilor - curs
4.2. Coada
2) Adugarea unui element x n coad:
Avnd n vedere definiia structurii de coad,
se poate face observaia c adugarea unui
element se efectueaz numai la sfritul cozii,
dup ultimul element.
Dac coada este vid, atunci la inserarea unei
valori se creeaz de fapt primul element al cozii.
n acest caz, prim i ultim indic acelai
element (au aceeai valoare).
Proiectarea Algoritmilor - curs
4.2. Coada
Astfel etapele acestei operaii sunt:
Alocarea unei zone de memorie pentru noul element -(a)
Se introduce informaia util pentru acest element - (b)
Informaia de legatur a elementului creat se
completeaz cu NULL - (c)
Se reiniializeaz informaia de legatur a elementului
indicat de ultim cu adresa noului element - (d)
Se modific valoarea pointerului ultim dndu-i ca
valoare adresa noului element introdus - (e)
Proiectarea Algoritmilor - curs
10
11
4.2. Coada
Adugarea unui element ntr-o coad nevid
se poate reprezenta grafic astfel:
NULL
prim
NULL
ultim
12
4.2. Coada
Dac coada era iniial vid, dup adugarea
unui element arat astfel:
NULL
prim
ultim
13
4.2. Coada
3) Extragerea unui element din coad (a
primului element)
Operaia de extragere se poate face doar asupra
primului element din coad.
Bineneles, putem extrage un element numai
dintr-o coad care nu este vid.
Se observ c primul element din coad fiind
eliminat, va fi nlocuit de cel care iniial era al
doilea.
Proiectarea Algoritmilor - curs
14
4.2. Coada
Deci, se pot deduce urmtoarele etape ale extragerii
din coad:
Se reine ntr-o variabil (*q) informaia util din primul
element al cozii - (a)
Se reine ntr-un pointer de lucru adresa acestui element
(s numim pointerul de lucru p) - (b)
Se actualizeaz valoarea pointerului prim cu adresa
urmtorului element din coad - (c)
Se elibereaz zona de memorie ce fusese alocat iniial
primului element din coad (acum indicat de pointerul p) (d)
Proiectarea Algoritmilor - curs
15
4
void extrag(TNOD *prim, tip *q)
{
TNOD *p;
// pointer de lucru
*q=prim->inf;
// (a)
p=prim;
// (b)
prim=prim->leg; // (c)
delete p;
// (d)
}
Operaia de tergere, se poate
reprezenta grafic astfel:
NULL
ultim
prim
16
4
4) Verificarea dac coada este vid
int cvida (TNOD *prim)
{
return (prim==NULL);
}
5) Numrarea elementelor din coad
int cardinal (TNOD *prim)
{
int m=0;
// contorizeaz elementele cozii
TNOD *p;
// pointer de lucru
p=prim;
while(p != NULL)
{
m++;
p=p->leg;
}
return m;
}
Proiectarea Algoritmilor - curs
17
Coninutul cursului
4. Structuri implementate dinamic:
4.1. Stiva
4.2. Coada
4.3. Lista simplu nlnuit
4.4. Lista dublu nlnuit
18
19
20
inf
leg
21
22
Inf1
Inf2
Inf3
Infn
NULL
ultim
prim
Proiectarea Algoritmilor - curs
23
Avantaje
24
25
26
27
nou
Inf1
Inf2
Inf3
prim
Infn
NULL
ultim
28
4
Etapele adugarii unui element la nceputul listei:
alocarea zonei de memorie necesare noului element (Se
folosete un pointer de lucru p) - (a)
completarea informaiei utile pentru noul element (notat
cu nou) - (b)
completarea informaiei de legtur cu adresa coninut
n variabila prim (innd cont c acesta va deveni primul
element al listei i, conform definirii acesteia, trebuie s
conin adresa elementului urmtor din list, deci cel
care era primul nainte de a face inserarea) - (c)
Actualizarea variabilei referin prim cu adresa
elementului creat, care n acest moment devine primul
element al listei - (d)
Proiectarea Algoritmilor - curs
29
{
LISTA *p;
p=new LISTA;
p->inf=x;
p->leg=prim;
prim=p;
// pointerul de lucru
// (a)
// (b)
// (c)
// (d)
}
Proiectarea Algoritmilor - curs
30
31
Inf2
Inf3
prim
Infn
NULL
nou
NULL
ultim
32
33
LISTA *p;
p=new LISTA;
p->leg=NULL;
p->inf=x;
ultim->leg=p;
ultim=p;
// pointer de lucru
// (a)
// (b)
// (c)
// (d)
// (e)
}
Proiectarea Algoritmilor - curs
34
4
c) Adugarea unui element n interiorul listei
Aceast operaie se poate face naintea sau
dup un element al listei.
Cel mai comod se face inserarea dup un
element specificat al listei.
35
4
Sunt necesari doi pointeri de lucru:
q indic nodul dup care este facut
inserarea
p pointer de lucru necesar pentru crearea
unui nou element
36
Inf1
Inf2
Inf3
nou
prim
q
Infn
NULL
ultim
37
38
LISTA *p;
p=new LISTA;
p->inf=x;
p->leg=q->leg;
q->leg=p;
// pointer de lucru
// (a)
// (b)
// (c)
// (d)
}
Proiectarea Algoritmilor - curs
39
40
Inf2
prim
nou
Inf3
Infn
NULL
ultim
q
41
42
43
44
ntrebri?
45