Documente Academic
Documente Profesional
Documente Cultură
ALOCARE DINAMICĂ
Elementele nu mai sunt dispuse obligatoriu in zone de memorie succesive. Fiecare nod al listei
contine, in afara ce informatia utila, adresa urmatorului element.
O listă liniară simplu înlănțuită conține elemente (noduri) a căror valori constau din două părți:
informația utilă reprezintă informația propriu-zisă memorată în elementul liste (numere, șiruri
de caractere, etc.)
informația de legătură precizează adresa următorului element al listei
S-au declarat 3 variabile de tip pointer pentru a memora adresa primului element al listei , al ultimului
element și fiecare element al listei, începând cu primul, va memora în câmpul urm adresa elementului
următor (*prim,*p,*ultim)
Crearea unui element nou
Nodurile sunt variabile dinamice create cu ajutorul operatorului C++ new care are ca rezultat
adresa variabilei nou create. Aceasta va fi memorată într-un pointer de tip nod *, să-l
numim p:
nod * p = new nod;
Deoarece nodurile sunt variabile de tip structură, cu câmpurile info și urm, accesul la
câmpurile unui nod se va face prin intermediul pointerilor, cu ajutorul operatorului
“ ->”, astfel: p->info și p->urm
o p->info este informația utilă din nodul listei, de tip int
o p->urm este pointer. Memorează adresa elementului următor sau NULL dacă nu există
următorul element
Ne imaginăm lista în felul următor; săgețile simbolizează legăturile dintre nodurile listei.
Vârful săgeții reprezintă elementul următor.
Ultimul element nu are săgeată deoarece acesta nu are succesor. Valoarea
corespunzătoare din câmpul urm este NULL.Accesul la un nod al listei se face prin
parcurgerea nodurilor care îl preced
În exemplul de mai sus au loc următoarele relații:
struct nod
{ int info; //informatia utilă
nod * urm; // câmpul urm este de tip pointer la nod și reprezintă informația de legătură.
};
nod *prim,*p,*ultim;
void creare()
{ if (p==0) // if (!p) (daca lista este vida)
{ p=new nod; // se adauga primul nod la lista
cout<<"dati inf din primul nod :";
cin>>p->info;
prim=p;
ultim=p;}
else //se adauga un element la sfârșitul listei
{ p=new nod;
cout<<"dati inf din nodul care se adaugă :";
cin>>p->info;
ultim->urm=p; // leaga ultimul nod de noul nod adaugat
ultim=p; // nodul p devine ultimul nod
ultim->urm=0; // campul adresa urmatoare a ultimului nod este 0( acest nod nu se mai leagă de
nimic)
} }
Afisarea listei
Parcurgerea se realizează secvențial, element cu element:
folosim un pointer nod p în care vom memora, pe rând, adresele elementelor din listă;
începem de la primul element al listei: p = prim;
cât timp nu am trecut de ultimul element:
o prelucrăm(afisam) elementul curent (p->info)
o trecem la următorul element: p = p->urm;
void afisare()
{ nod *p; //declarăm nodul p;
p=prim; // pointerul p indica adresa primului nod si cu ajutorul căruia parcurgem lista si afisam elementele
while(p)
{ cout<< p->info<<" ";
p=p->urm;}
}
Se citesc mai multe numere până când se citeste cifra 0.
Afisati lista
Afișați numerele pare si cele impare
#include <iostream>
using namespace std;
struct nod
{ int info;
nod *urm;};
nod *p,*c,*u;
void creare()
{c=new nod;
cout<<"dati inf din primul nod :";
cin>>c->info;
p=c;
u=c;
do{
c=new nod;
cout<<"dati inf din urm nod :";
cin>>c->info;
c->urm=0;
u->urm=c;
u=c;} while(c->info !=0);
}
void afisare()
{c=p;
while(c)
{ cout<<c->info<<" ";
c=c->urm;}
}
int main()
{ creare();
afisare();
return 0;
}
Afisare pare
void afisare_p()
{c=p;
while(c)
{ if(c->info %2==0) cout<<c->info<<" ";
c=c->urm;}
}
Adăugarea unui nod la listă înainte de o valoare dată
void sterge_prim()
{nod *q;
q=prim; //se salveaza adresa nodului prim in variabila de tip pointer q
prim = q->urm; //succesorul nodului prim devine nodul prim
delete q; //se elibereaza zona de memorie de la adresa memorata in variabila q
}
2. STERGEREA ULTIMULUI NOD
void sterge_ultim()
{nod *q;
q=ultim; //se salveaza adresa nodului ultim in variabila de tip pointer q
p=prim;
while(p && p->urm->urm !=0) p=p->urm; //se cauta predecesorul ultimului nod prin
parcurgerea listei incepand de la primul nod
p->urm=0; //predecesorul nodului ultim devine nod terminal (adresa de legatura este NULL)
ultim=p; //predecesorul nodului ultim devine nodul ultim
delete q; // se elibereaza zona de memorie de la adresa memorata in variabila q
}
3. STERGEREA UNUI NOD IN INTERIORUL LISTEI
int main()
{ int i, n, val,valoare,valoare1,val2,val3;
creare_prim();
afisare();
cout<<endl;
cout<<"introduceti numarul de operatii de adaugare in lista ";cin>>n;
for( int i=1;i<=n;i++)
adauga_sfarsit();
afisare();
cout<<endl;
cout<<"introduceti valoarea nodului inaintea caruia vom insera un alt nod: ";cin>>val;
inserare_inainte(val);
afisare();
cout<<endl;
cout<<"dati valoarea de sters :";
cin>>val2;
sterge_nod(val2);
afisare();
cout<<endl;
cout<<"Introduceti valoarea nodului dupa care vom insera un alt nod :";
cin>>val3;
inserare_dupa(val3);
afisare();
cout<<endl;
cout<<"lista dupa stergerea primului element: ";
sterge_prim();
cout<<endl;
afisare();
cout<<endl;
cout<<"lista dupa stergerea ultimului element: ";
sterge_ultim();
cout<<endl;
afisare();
return 0;
}