Va Rooooooooooog in c++
Se consideră o listă dublu înlănţuită. Să se un program care primeşte ca parametru adresa primului nod al listei şi şterge primul şi ultimul nod din listă.
Răspunsuri la întrebare
FUNCTIE CERUTA :
nod * stergere(nod *n){
//Sterge primul nod
n=n->u;
n->a=NULL;
//Memoreaza noul cap (pentru a il return la final) - OPTIONAL
nod *cap_nou=n;
//Cauta ultimul nod al listei si sterge-l
while(n->u!=NULL) n=n->u;
n=n->a;
n->u=NULL;
//Returneaza noul cap - OPTIONAL
return cap_nou;
}
EXEMPLU IN PROGRAM (demonstratia ca functia functioneaza corect):
#include <iostream>
using namespace std;
struct nod{
int data;
nod *u, *a;
};
nod * stergere(nod *n){
//Sterge primul nod
n=n->u;
n->a=NULL;
//Memoreaza noul cap (pentru a il return la final) - OPTIONAL
nod *cap_nou=n;
//Cauta ultimul nod al listei si sterge-l
while(n->u!=NULL) n=n->u;
n=n->a;
n->u=NULL;
//Returneaza noul cap - OPTIONAL
return cap_nou;
}
int main(){
//Construire lista
nod a,b,c,d,e;
a.data=0;
b.data=1;
c.data=2;
d.data=3;
e.data=4;
a.a=NULL;
b.a=&a;
c.a=&b;
d.a=&c;
e.a=&d;
a.u=&b;
b.u=&c;
c.u=&d;
d.u=&e;
e.u=NULL;
//Afisare proprietati inainte de operatie
cout << "INAINTE DE STERGERE:\n";
cout << "a - (" << &a << ") = " << a.a << " - " << a.u << endl;
cout << "b - (" << &b << ") = " << b.a << " - " << b.u << endl;
cout << "c - (" << &c << ") = " << c.a << " - " << c.u << endl;
cout << "d - (" << &d << ") = " << d.a << " - " << d.u << endl;
cout << "e - (" << &e << ") = " << e.a << " - " << e.u << endl;
//Efectuarea operatiei
cout << "\nPRIMUL ELEMENT DIN LISTA DUPA STERGERE:" << stergere(&a) << endl << endl;
//Afisarea proprietati dupa oeprtie
cout << "DUPA STERGERE:\n";
cout << "a - (" << &a << ") = " << a.a << " - " << a.u << endl;
cout << "b - (" << &b << ") = " << b.a << " - " << b.u << endl;
cout << "c - (" << &c << ") = " << c.a << " - " << c.u << endl;
cout << "d - (" << &d << ") = " << d.a << " - " << d.u << endl;
cout << "e - (" << &e << ") = " << e.a << " - " << e.u << endl;
}
Nota :
Am proiectat functia astfel incat sa returneze adresa noului nod initial al listei. Chiar daca cerinta nu cere practic este esential sa stim adresa unui nod valid pentru prelurarea in continuare a listei.
Observi in imagine ca la final nodul anterior nodului b este null (nodul a a fost sters din structura) iar nodul urmator nodului d este null (nodul e a fost sters din structura). Deci functia functioneaza corect.