Sunteți pe pagina 1din 14

Lista liniară simplu înlănțuită

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

Declararea unei liste liniare simplu înlănțuite alocate dinamic

Nodurile sunt variabile de tip structură, cu câmpurile info și urm.


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;

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

Pointerul NULL este o constanta cu valoare 0 definita in mai multe biblioteci


standard, inclusiv iostream

Prin rularea programului se afișează :


 Rezumat:
o p este pointer la nod; este de tip nod *;
o *p este variabila de tip nod – este nod din listă
o p->info este informația utilă din nodul listei, de tip int
o p->urm este pointer. Memorează adresa elementului următor!

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:

 valoarea pointerului prim este adresa elementului cu valoarea 12;


 prim->info==12
 prim->urm->info==46
 prim->urm este adresa elemenului cu valoarea 46
 prim->urm->urm==p
 p->info==59
 p->urm->urm==t
 p->urm->urm->info==t->info
 t->info==17
 t->urm->info==25
 t->urm->urm->info==18
 t->urm->urm->urm==NULL
 t->urm->urm->urm->info nu există. Rezultatul acestei expresii este
impredictibil
Adăugare după primul nod

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 inserare_inainte(int val)


{ nod *a; //retine adresa nodului ce se va insera in lista
if (prim->info==val) // daca informatia din nodul prim =val adaugam inaintea nodului prim
{ p=new nod;
cout<<”introduceti valoarea de inserat “;
cin>>p->info; // se scrie informatia in nod
p->urm=prim; // nodul p se leaga de nodul prim
prim=p; //nodul p devine nodul prim
}
else
{ p=prim; // ne pozitionam pe primul nod
while (p->urm->info!=val && p)
p=p->urm;
a=new nod;
cout<<"dati valoarea de inserat :";
cin>>a->info;
a->urm=p->urm; //nodul a se leaga de succesorul nodului p
p->urm=a; } //succesorul nodului p este a
Adăugarea unui nod la listă după o valoare dată

void inserare_dupa(int valoare3)


{ nod *a; //retine adresa nodului ce se va insera in lista
p=prim; // ne pozitionam pe primul nod
if (prim->info==valoare3) // daca informatia din nodul prim =valoare3 adaugam dupa
nodul prim
{ a=new nod;
cout<<”introduceti valoarea de inserat “;
cin>>a->info; // se scrie informatia in nod
prim->urm= a // nodul prim se leaga de nodul a
}
else
{ while (p->info!=valoare3 && p)
p=p->urm;
a=new nod;
cout<<"dati valoarea de inserat :";
cin>>a->info;
a->urm=p->urm; //nodul a se leaga de succesorul nodului p
p->urm=a; } //succesorul nodului p este a
if(p==ultim) ultim=a;
}
STERGEREA UNUI NOD

1. STERGEREA PRIMULUI NOD

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

void sterge_nod(int val2)


{ nod *q;
p=prim;
while(p && p->urm->info!= val2) //cat timp pointerul p nu a ajuns la sfarsitul listei
(while p) si informatia utila din succesorul lui p e diferita de val2
p=p->urm; //parcurg lista trecand la urmatorul nod
q=p->urm; //salvez in pointerul q adresa succesorului lui p, adica nodul pe care trebuie sa il
elimin)
p->urm=q->urm; //leg nodul p de succesorul nodului q
delete q;
}
Programul COMPLET :
#include <iostream>
using namespace std;
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_prim()
{ if (p==0) // daca lista este vida
{p=new nod; // se adauga primul nod la lista
cout<<"dati inf din primul nod :";
cin>>p->info; //scriu informatia in nodul p
prim=p;
ultim=p;}
}
void adauga_sfarsit() //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; //ultimul nod nu se mai leaga de nimic
}
void inserare_inainte(int val) // se va insera un nod inainte de nodul cu valoarea val
{ nod *a;
p=prim; // ne pozitionam pe primul nod
if (prim->info==val) // daca informatia din nodul prim =val adaugam inaintea nodului prim
{ p=new nod;
cout<<"introduceti valoarea de inserat: ";
cin>>p->info; // se scrie informatia in nod
p->urm=prim; // nodul p se leaga de nodul prim
prim=p; //nodul p devine nodul prim
}
else
{ while (p->urm->info!=val && p)
p=p->urm;
a=new nod;
cout<<"dati valoarea de inserat :";
cin>>a->info;
a->urm=p->urm;
p->urm=a; }
}
void afisare()
{ nod *c;
c=prim;
while(c)
{ cout<<c->info<<" ";
c=c->urm;}
}
void sterge_nod(int val2) //se adauga un element la sfârșitul listei
{ nod *q;
p=prim;
while(p && p->urm->info!= val2)
p=p->urm;
q=p->urm;
p->urm=q->urm;
delete q;
}
void inserare_dupa(int valoare3)
{ nod *a; //retine adresa nodului ce se va insera in lista
p=prim; // ne pozitionam pe primul nod
if (prim->info==valoare3) // daca informatia din nodul prim =valoare3 adaugam dupa nodul prim
{ a=new nod;
cout<<"introduceti valoarea de inserat ";
cin>>a->info; // se scrie informatia in nod
prim->urm=a; // nodul prim se leaga de nodul a
}
else
{ while (p->info!=valoare3 && p)
p=p->urm;
a=new nod;
cout<<"dati valoarea de inserat :";
cin>>a->info;
a->urm=p->urm; //nodul a se leaga de succesorul nodului p
p->urm=a; } //succesorul nodului p este a
if(p==ultim) ultim=a;
}
void sterge_prim()
{nod *q;
q=prim;
prim = q->urm;
delete q;
}
void sterge_ultim()
{nod *q;
q=ultim;
p=prim;
while(p && p->urm->urm !=0) p=p->urm;
p->urm=0;
ultim=p;
delete q;
}

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;
}

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