U funkciji
dodaj_posle problem je u nepokrivenom slučaju kada je
tekuci_el postavljen na
NULL, tj. na početku dodavanja u listu. U tom smislu, i ja sam napravio grešku zadavši da je funkcija bez povratnog tipa, trebalo bi da vrati pokazivač na novododati element. Tako ispravljena funkcija je:
Code:
struct el * dodaj_posle (struct el *const tekuci_el, struct el *const novi_el) {
if (novi_el != NULL && tekuci_el != NULL) {
novi_el->sljedeci = tekuci_el->sljedeci;
tekuci_el->sljedeci = novi_el;
}
return novi_el;
}
a prvi njen poziv u glavnom programu je (ostali ostaju isti):
Code:
...
// Dodajemo prvi element u listu.
prvi_el = dodaj_posle(prvi_el, novi_el); // Pamtimo pocetak liste.
...
Funkcija
ispisi izgleda kao da je u redu.
Za funkciju
obrisi možda nisam bio dovoljno jasan: pokazivač
tekuci_el pokazuje baš na onaj element koji treba da se izbaci, ne moraš da ga tražiš po koeficijentu. Ne zaboravi i da oslobodiš zauzet prostor za njega (pomoću
delete) pošto ga isključiš iz liste. Takođe, potpuno sam smetnuo sa uma da lista nije dvostruko povezana, pa ćeš morati da funkciji proslediš i početak liste, tj. zaglavlje treba da glasi
struct el * obrisi (struct el *prvi_el, struct el *tekuci_el). Uz ovu izmenu pozivi u glavnom programu će biti:
Code:
// Brisemo zadnji element u listi.
zadnji_el = obrisi(prvi_el, zadnji_el);
...
// Brisemo prvi element u listi.
prvi_el = obrisi(prvi_el, prvi_el);
...
// Brisemo i zadnji element.
prvi_el = obrisi(prvi_el, prvi_el);
...
Ako ovo sa brisanjem već izgleda komplikovano, čini mi se da neće ni biti potrebno ako ne moraš da implementiraš ništa više osim sabiranja (i oduzimanja). U tom slučaju, možeš da napišeš samo funkciju
void obrisi_listu (struct el *prvi_el) koja će obrisati celu listu. Tada bi onaj gore glavni program, posle prvog ispisa liste, od brisanja imao samo:
Code:
...
// Ispisujemo listu.
ispisi(prvi_el, cout); // Trebalo bi da ispise: 0.5*x^1 + 2.5*x^3 + 7.5*x^6
// Brisemo listu...
obrisi_listu(prvi_el);
prvi_el = NULL; // i prvi_el postavljamo na NULL, posto je lista obrisana.
return 0;
}