Documente Academic
Documente Profesional
Documente Cultură
NULL
1 3 9 2
Prim
Observăm că adresa fiecărui nod din listă este conţinută într-un alt nod, cu o singură excepţie:
primul nod, a cărui adresă nu este conţinută de nici un nod al listei. Prin urmare, pentru a
identifica o listă simplu înlănţuită este suficient să reţinem adresa primului element al listei într-
un pointer separat, denumit Prim.
Exceptând primul nod, într-o listă simplu înlănţuită mai există un element special: ultimul
nod. Acest nod va conţine în partea de legătură pointerul NULL.
Precizăm de asemenea, că în figura de mai sus, legăturile dintre noduri le-am reprezentat prin
săgeţi.
În lmbajul C++, declaraţia unei structuri autoreferite, care reprezintă un nod din listă, va fi:
struct nod
{ <tip_de_data> inf; // Date efective memorate
nod *urm; // Legătura către nodul următor
};
nod *Prim; // Definirea pointerului Prim către un nod
Pentru comoditate în aplicaţiile ulterioare, vom defini tipul de date Lista care este adresa unui
nod din listă: typedef struct nod * Lista; // Lista –alias, pseudonim pentru expresia struct nod
*
Vom aloca dinamic memorie pentru un nou nod, a cărui adresă o vom reţine în variabila
pointer q. În câmpul inf al noului nod vom memora valoarea x (q->inf=x sau (*q).inf=x).
*q
q x
q->inf q->urm
În cazul aplicării
funcţiei Adaug la inserare apar două cazuri distincte. Dacă p=NULL, noul nod va fi inserat la
începutul listei; dacă p!=NULL, inserarea se va face în interiorul listei.>
Să ilustrăm pas cu pas inserarea la începutul acestei liste a unui nou nod, cu informaţia x
(==7), a cărei adresă va fi memorată în pointerul q:
1. Se alocă memorie din Heap pentru noul element (Lista q=new nod;).
2. Se iniţializează zona de informaţie utilă a acestuia (q->inf=x).
3. Se iniţializează zona de legătură cu adresa nodului care a fost anterior primul în listă,
adresă alocată în variabila Prim (q->urm=Prim).
4. Se reiniţializează variabila Prim cu adresa noului element alocat (Prim=q;).
Situaţia finală va fi următoarea:
3 9 2 NULL
Prim 4. 3.
q 7
1. 2.
Observaţie. Algoritmul prezentat este corect şi dacă lista iniţial este vidă (Prim==NULL).
3 9 2 NULL
Pri p
m
Algoritmul:
1. Se alocă memorie pentru noul element (Lista q=new nod;).
2. Se iniţializează zona de informaţie utilă a acestuia (q->inf=x).
3. Se iniţializează zona de legătură a noului nod cu adresa care se află în zona de legătură a
variabila p (q->urm= p->urm;).
4. Se reiniţializează variabila *p cu adresa noului element alocat (p->urm=q;).
Situaţia finală va fi următoarea:
q 1. 7
*p 4. 2. 3.
3 9 2 NULL
Pri
m
P
void Adaug(Lista & Prim, Lista p, int x) // Funcţia Adaug îmbină ambele cazuri descrise
anterior
{ Lista q=new nod;
q->inf=x;
if(!p) {q->urm=Prim; Prim=q;}
else {q->urm=p->urm; p->urm=q;}
Observaţii
1. Crearea unei liste se realizează prin inserări succesive de elemente.
2. Funcţia de inserare creată (Adaug) este generală, fucţionează pentru toate cazurile posibile:
inserare la începutul listei, inserare în interiorul listei şi inserare la sfârşitul listei.
void Adaug(Lista & Prim, Lista p, int x) // Inserarea unui nou nod
{ Lista q=new nod;
q->inf=x;
if(!p) {q->urm=Prim; Prim=q;}
else {q->urm=p->urm; p->urm=q;}
}
int main ()
{cout<<"Crearea unei liste pana la citirea valorii 0"<<endl;
cout<<"Dati un numar:";cin>>x;
while (x) // Depunerea numerelor citite de la tastatură în lista nou
creată
{
Adaug( Prim, NULL,x);
cout<<"dati un numar:";cin>>x;
}
cout<<endl<<"Lista creata initial:"<<endl;
Afisare(Prim); // Afişarea datelor din lista iniţială
cout<<endl;
Insert200(Prim); // Modificarea lista iniţiale
cout<<"Lista modificata:"<<endl;
Afisare(Prim); // Afişarea datelor din lista modificată
cout<<endl;
getch();
return 0;
}
3 9 2 NULL
Prim
1. Memorăm în variabila q adresa nodului ce urmează a fi şters (q=Prim).
2. Adresa primului element din listă se schimbă (Prim=Prim->urm).
3. La sfârşit eliberăm zona alocată nodului ce a fost eliminat din listă (delete q).
2. *q
3 9 2 NULL
Prim 1. 3.
q
Algoritmul:
1. Memorăm în variabila q adresa nodului ce urmează a fi şters (q=p->urm;).
2. Modificăm legătura care există de la *p la *q (elementul de şters) şi o transformăm într-o
legătură la nodul care urmează după cel ce va fi şters (p->urm = q->urm).
3. Eliberăm zona de memorie alocată nodului ce a fost eliminat din listă (delete q).
void Adaug(Lista & Prim, Lista p, int x) // Inserarea unui nou nod
{ Lista q=new nod;
q->inf=x;
if(!p) {q->urm=Prim; Prim=q;}
else {q->urm=p->urm; p->urm=q;}
}
void Afisare(Lista Prim) // Parcurgerea listei cu începutul indicat de pointerul Prim
{ Lista v;
for (v=Prim; v; v=v->urm) cout<<v->inf<<" ";
cout<<endl;
}
void Elimin(Lista & Prim, Lista p) // Stergerea unui nod din lista
{ Lista q;
if (p) { q =p->urm;
if (q) { p->urm =q->urm; delete q; }
}
else { q=Prim;
if (q) { Prim=Prim->urm; delete q; }
}
}
void DelPar(Lista Prim) // Determinarea numerelor pare din câmpurile inf ale nodurilir
{ Lista v;
v=Prim;
while(v->urm)
{ if (v->urm->inf %2==0 && v!=NULL)
Elimin( Prim, v); else v=v->urm;
}
}
int main ()
{ cout<<"Crearea unei liste pana la citirea valorii 0"<<endl;
cout<<"dati un numar:";cin>>x;
while (x) // Depunerea numerelor citite de la tastatură în lista nou creată
{ Adaug( Prim, NULL, x);
cout<<"dati un numar:";cin>>x; }
cout<<"Lista initiala:"<<endl;
Afisare(Prim); cout<<endl; //Afisarea datelor din lista initiala
DelPar(Prim);
Elimin(Prim, NULL); // Modificatea listei iniţiale
cout<<"Lista modificata:"<<endl;
Afisare(Prim); cout<<endl; //Afisarea datelor din lista modificata
getch();
return 0; }