O listă înlănţuită este o structură de date constituită dintr-o succesiune de elemente denumite noduri. Fiecare nod din listă conţine două părţi: o parte de informaţie (în care sunt memorate informaţiile corespunzătoare nodului, specifice problemei) şi o parte de legătură (în care este memorată adresa următorului element din listă).
Pentru simplitate vom considera, fără a restrânge generalitatea, ca informaţiile memorate în nodurile listei sunt numere întregi. Declaraţia structurii care reprezintă un nod din listă va fi:
Struct Nod {
int inf;
struct Nod *urm;
};
Se obeservă că adresa fiecărui nod din listă este conţinută într-un alt nod, cu o singură excepţie: primul nod al listei. Prin urmare, pentru a identifica o listă simplu înlănţuită este suficient să reţinem adresa primului element al listei.
Definim tipul de date Lista, care este adresa unui nod din listă:
typedef struct Nod * Lista;
Exceptând primul nod (a cărui adresă nu este conţiuntă de nici un nod al listei), într-o listă simplu înlănţuită mai există un nod special: ultimul nod. După acest nod nu mai urmează nici un alt nod al listei, deci ultimul nod va conţine în partea de legătură pointerul NULL.
Operaţiile fundamentale sunt:
Inserarea unui nod într-o listă simplu înlănţuită
Pentru inserare vom implementa o funcţie denumită Insert cu trei parametri.
Vom aloca dinamic memorie pentru un nou nod, a cărui adresă o vom reţine în variabila pointer
q . În zona de informaţii vom memora valoarea x (q->inf=x).
La inserare apar două cazuri distincte. Dacă p==NULL noul nod va fi inserat la începutul listei; dacă p!=NULL inserarea se face în interiorul listei.
void Insert (Lista &Prim, Lista p, int x){
Lista q=new Nod;
q->inf=x;
if(!p) {q->urm=Prim; Prim=q;}
else {q->urm=p->urm; p->urm=q;}
}
Observaţii:
Ştergerea unui nod dintr-o listă simplu înlănţuită
Pentru ştergere vom implementa o funcţie denumită Delete cu doi parametri:
Şi la ştergere apar două cazuri distincte. Dacă p==NULL va fi şters primul nod din listă; dacă
p!=NULL va fi şters un nod din interiorul listei.
void Delete (Lista &Prim, Lista p){
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;}
}
}
Parcurgerea unei liste
A parcurge o listă presupune a vizita fiecare nod din listă, în scopul prelucrării informaţiilor asociate nodurilor.
În acest scop vom utiliza un pointer p căruia îi vom atribui iniţial adresa primului element din listă. Cât timp lista nu s-a terminat (p!=NULL), se vizitează nodul curent, apoi se trece la nodul următor (p=p->urm). Funcţia următoare realizează parcurgerea unei liste simplu înlănţuite cu afişarea informaţiilor din noduri:
void Afisare (Lista Prim){
Lista p;
for (p=Prim; p; p=p->urm)
cout << p->inf<<’ ’;
cout<<endl;
}