Sunteți pe pagina 1din 5

Structuri de date

Definiție
O structură de date este un ansamblu de date caracterizat prin relațiile existente între
ele și prin operațiile care pot fi efectuate cu datele respective.
Clasificarea structurilor de date:
1. În funcţie de tipul datelor memorate în cadrul structurii, structurile de date se pot
clasifica în:
• structuri de date omogene – toate datele componente sunt de acelaşi tip (de
exemplu tabloul);
• structuri de date neomogene – pot conţine date de tipuri diferite (de exemplu
înregistrarea).
2. În funcţie de modul de alocare a memoriei interne, structurile de date sunt de
două tipuri:
• structuri de date statice – ocupă o zonă de memorie de dimensiune fixă, alocată
pe întreaga durată a execuţiei blocului în care este declarată (de exemplu
tabloul, fişierul, lista, stiva, coada);
• structuri de date dinamice – ocupă o zonă de memorie de dimensiune variabilă,
alocată pe parcursul execuţiei programului, la cererea explicită a
programatorului (de exemplu lista, stiva, coada).

Structura de date de tip listă

Definiție
Lista este o structură de date de tip secvenţial, constituită dintr-o succesiune de
elemente de acelaşi tip. Fiecare element din listă are un succesor (cu excepţia ultimului
element al listei) şi un predecesor (cu excepţia primului element din listă).
Operaţii elementare care se pot efectua asupra unei liste:
• crearea unei liste vide;
• inserarea unui element în listă;
• eliminarea unui element din listă;
• accesarea unui element din listă;
• afişarea elementelor unei liste.
Lista liniară
O listă liniară este o colecție de n≥0 noduri, X1, X2, ...Xn aflate într-o relație de ordine.
Astfel, X1 este primul nod al listei, X2 este al doilea nod al listei, ... Xn este ultimul nod.

Inf 1 Inf 2 Inf n

Nod 1 Nod 2 Nod n

Liste alocate înlănțuit


Există două tipuri de alocare înlănțuită
-alocare simplu înlănțuită
- alocare dublu înlănțuită

O listă liniară simplu înlănţuită este o structură de forma:

Semnificaţia notaţiilor folosite este următoarea:


 adr1,adr2,adr3,...,adrn reprezintă adresele celor n înregistrări;
 in1,in2,...,inn reprezintă informaţiile conţinute de noduri, de altă natură decât cele
de adresă;
 0 – are semnificaţia „nici o adresă”- este ultimul element din listă;
După cum observăm ,fiecare nod, cu excepţia ultimului, reţine adresa următorului
nod.
 Accesul la un nod al listei se face prin parcurgerea nodurilor care îl perced.
Aceasta necesită un efort de calcul.
 Informaţiile de adresă sunt prezente în cadrul fiecărui nod, deci ocupă memorie.
 Avantajele alocării înlănţuite sunt date de faptul că operaţiile de adăugare sau
eliminare ale unui nod se fac rapid.
Exemplu
Iniţial,o variabilă v reţine 0.
Presupunem că, la un moment dat, lista este cea de mai jos, iar v reţine adresa
primului element (adr1):

Dacă se citeşte un nou număr (de exemplu 4), atunci acesta se adaugă într-o
înregistrare aflată la începutul listei ,în următoarele etape:
-se alocă spaţiu pentru noua înregistrare, se completează câmpul numeric, iar adresa
următoare este cea din v, deci a primului element al listei:

variabila v va memora adresa noii înregistrări:


Programul este prezentat în continuare

#include <iostream>
using namespace std;
/*Realizati urmatoarele operatii asupra unei liste:
1. Creati o lista cu n elemente intregi
2. Adaugati un element la inceputul listei
3. Adaugati un element la sfarsitul listei
4. Stergeti un element de pe pozitia k
5. Inserati in interiorul listei pe pozitia s, elementul t
6. Afisati continutul listei
*/
struct lista
{int inf;
int adr_urm;} l[100];
int n;
void initializare()
{
l[1].adr_urm=0;
}
void creare_lista()
{int i=1;
cout<<"Dati numarul de componente ale listei:";cin>>n;
for(i=1;i<=n;i++)
{cout<<"elementul "<<i<<"=";
cin>>l[i].inf;
l[i].adr_urm=i+1;}
l[n].adr_urm=0;
}
void adaugare_inceput()
{int i, x;
cout<<"dati elementul pe care doriti sa il adaugati la inceputul listei:";
cin>>x;n++;
for(i=n;i>=1;i--)
{l[i].inf=l[i-1].inf;
l[i].adr_urm=i+1;}
l[1].inf=x;
if(l[1].adr_urm!=0)
l[1].adr_urm=2;
l[n].adr_urm=0;
}
void adaugare_sfarsit()
{int i, y;
cout<<"dati elementul pe care doriti sa il adaugati la sfarsitul listei:";
cin>>y;n++;
l[n].inf=y;
l[n].adr_urm=0;
l[n-1].adr_urm=n;
}
void stergere()
{int i, k;
cout<<"dati pozitia de pe care vreti sa stergeti:";
cin>>k;
for(i=k+1;i<=n;i++)
{l[i-1].inf=l[i].inf;
l[i-1].adr_urm=i;}
n--;
l[n].adr_urm=0;
}
void afisare()
{int i;
if (n==0)
cout<<"lista este goala";
else
for(i=1;i<=n;i++)
cout<<l[i].inf<<"adr urm->"<<l[i].adr_urm<<'\n';
}
int inserare()
{int s,t,i;
cout<<"pozitia pe care inserati: ";cin>>s;
cout<<"elem pe care il inserati: ";cin>>t;
n++;
for(i=n;i>=s;i--)
{ l[i].inf=l[i-1].inf;
l[i].adr_urm=i+1;
}
l[s].inf=t;
l[n].adr_urm=0;
l[s-1].adr_urm=s;
}
int main()
{ initializare();afisare();
creare_lista();afisare();
adaugare_inceput();afisare();
adaugare_sfarsit();afisare();
stergere();afisare();
inserare();
afisare();
return 0;
}

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