Buna puteți să-mi explicați cum fucționeaza programul dat :
#include
using namespace std;
struct nod{
float data;
nod *next;
}L[100];
void elimin_dubluri(nod *x){
sterge nodul urmator.
nod *y=x->next;
while(y->next){
if(x->data == y->data){
x->next=y->next;
y=y->next;
}
else{
x=x->next;
y=y->next;
}
}
}
int main(){
int n,i;
cout<<"Introduceti numarul de elemente in lista: ";
cin >> n;
for(i=1;i<=n;i++){
cout<<"Introduceti elementul: ";
cin >> L[i].data;
L[i].next= &L[i+1];
}
L[n].next=NULL;
elimin_dubluri(&L[1]);
cout<<"Lista finala: ";
nod *x=&L[1];
while(x->next){
cout << x->data << " ";
x=x->next;
}
cout << x->data << " ";
return 0;
}
Răspunsuri la întrebare
Răspuns:
Explicație:
In primul rand, programul nu merge pt. ca lipseste libraria dupa directiva #include, respectiv "sterge nodul urmator." nu e sintaxa valida si presupun ca ar fi trebuit sa fie comentat. Dupa ce este reparat programul, face urm. lucru: citeste n elemente de la tastatura si le sterge pe cele egale cu predecesorul. Acel L[100] reprezinta o lista inlantuita alocata static (echivalentul in C++ ar fi un vector din STL, ie. vector<float> L). Cand intrebi cum functioneaza programul, presupun ca te referi in special la functia elimin_dubluri. In lista de parametri e transmis un pointer catre o variabila nod (in main, apelul se face cu adresa lui L[1] <=> &L[1], adica a primului element), iar in interiorul functiei este initializat un pointer de tip nod catre elementul care vine dupa x, notat y. Acel while ruleaza pana cand conditia y->next devine falsa, adica cand y->next = nullptr, sau pointer nul, adica care nu memoreaza o adresa de memorie anume si indica finalul listei. If-ul verifica daca valorile retinute in x si y, care sunt elemente consecutive in lista, sunt egale, caz in care schimba adresa memorata de next-ul lui x in next-ul lui y, care e echivalent cu stergerea lui y din lista. Altfel, x primeste adresa lui y, iar y adresa elementului urmator lui si continua ciclul.