Sunteți pe pagina 1din 3

Program liste liniare dublu inlantuite

alocate dinamic
#include <iostream>
using namespace std;
struct nod {
nod *as, *ad;
int inf;
};

nod *s, *d, *c; // s=nodul din stanga,


// d=nodul din dreapta,
// c=nodul care parcurge lista
int n,m,i;

void creare (nod *& s, nod *&d)


{
cout<<"info=";
cin>>n; // se citeste informatia pt primul nod
s=new (nod); // se aloca spatiu pr primul nod
s->inf=n; // se completeaza informatia pt primul nod
s->as=s->ad=0; // se completeaza adresele campurilor din stanga si dr
d=s; // nodul drept=nodul stang
}

void adaugare_dr (nod *& d) // se adauga pe rand cate un nod la dreapta


{
cout<<"info="; cin>>n; // se citeste informatia pt nodul care se adauga la dr
nod *c=new nod; // se aloca spatiu pt noul nod
c->inf=n; // se completeaza informatia noului nod
c->as=d; // se face legatura cu nodul precedent
c->ad=0; // se completeaza adresa la dreapta cu 0
d->ad=c; //
d=c; // nodul drept va lua valoarea noii inregistrari
}

void listare (nod *& s)


{
nod *c=s; // se porneste din stanga listei
while (c ) // cat timp nu s-a parcurs toata lista
{
cout<<c->inf<<endl; // se afiseaza informatiile nodurilor
c=c->ad; // se trece la nodul urmator din dreapta
}
}

void includ (int m, nod *s)// includem la dreapta nodului m o inregistrare


{
nod *c=s, *e; // c=nodul care parcurge lista, e=noul nod
while (c->inf != m) c=c->ad; // se parcurge lista pana la nodul m
cout<<"info="; cin>>n; // se citeste informatia pt noul nod
e=new nod; // se aloca spatiu pt noul nod
e->inf=n; // se completeaza informatia pt noul nod
e->as=c; // se face legatura cu nodul precedent
c->ad->as=e; // se face legatura succesorului cu noul nod
e->ad=c->ad; // se face legatura cu nodul succesor
c->ad=e; // se face legatura predecesorului cu noul nod
}

void sterg (int m, nod *s) // se sterge nodul cu informatia m


{
nod *d=s;
while (d->inf != m) // se parcurge lista pana la nodul m
d=d->ad;
d->as->ad=d->ad; // se face leg nodului precedent cu nodul succesor
d->ad->as=d->as; // se face leg nodului succesor cu nodul precedent
delete d; // se elibereaza spatiu de memorie
}

int main ()
{
int i,m;
cout<<"creare lista cu o singura inregistrare "<<endl;
creare (s,d);
cout<<"cate inregistrari se adauga?"; cin>>m;
for (i=1; i<=m; i++) adaugare_dr (d);
cout<<"listare de la stanga la dreapta"<<endl;
listare (s);
cout<<"includem la dreapta o inregistrare "<<endl;
cout<<"dupa care inregistrare se face adaugarea? "; cin>>m;
includ (m,s);
listare (s);
cout<<"stergem o inregistrare din interior"<<endl;
cout<<"care inregistrare se sterge? "; cin>>m;
sterg (m,s);
cout<<"listare de la stanga la dreapta"<<endl;
listare (s);
return 0;
}

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