Lista jednokierunkowa - usuwanie.
Ostatnio zmodyfikowano 2015-12-28 12:26
pepe450 Temat założony przez niniejszego użytkownika |
Lista jednokierunkowa - usuwanie. » 2015-12-21 02:00:16 Witam mam problem z funkcją usuwania elementów z listy. Co robię nie prawidłowo w funkcji usun_od_poczatku(int ile). Wygląda na to że delete p, nic nie zmienia w moim programie. #include<iostream> #include<ctime> #include<cstdlib> using namespace std; class Element { Element * next; int wartosc; public: Element(); Element( int arg = 0, Element * n = NULL ); ~Element(); friend class Lista; }; class Lista { Element * wskaznik; public: Lista(); ~Lista(); bool add_first( int arg ); bool add_last( int arg ); bool add_sorted( int arg ); bool usun_od_poczatku( int ile ); void print(); }; int main() { srand( time( NULL ) ); Lista A; cout << "Ile elementow dodac do listy jednokierunkowej zwyklej?" << endl; int ile; cin >> ile; for( int i = 0; i < ile; i++ ) { A.add_last( rand() % 10 ); A.print(); } Lista B; cout << "Ile elementow dodac do listy jednokierunkowej sortowanej?" << endl; int ile2; cin >> ile2; int x; for( int i = 0; i < ile2; i++ ) { x = rand() % 10; cout << "Dodajesz: " << x << endl; B.add_sorted( x ); B.print(); } cout << "Usuwanie" << endl; B.usun_od_poczatku( 5 ); B.print(); return 0; } Element::Element() { next = NULL; wartosc = 0; } Element::Element( int arg, Element * n ) { wartosc = arg; next = n; } Element::~Element() { }
Lista::Lista() { wskaznik = NULL; } Lista::~Lista() { Element * p, * nx; for( p = wskaznik; p != NULL; p = nx ) { nx = p->next; delete p; } wskaznik = NULL; } bool Lista::add_first( int arg ) { wskaznik = new Element( arg, wskaznik ); return true; } bool Lista::add_last( int arg ) { Element * p = wskaznik; if( p == NULL ) { add_first( arg ); } else { while( p->next != NULL ) { p = p->next; } p->next = new Element( arg, NULL ); return true; } return false; } bool Lista::add_sorted( int arg ) { if(( wskaznik == NULL ) or wskaznik->wartosc >= arg ) { add_first( arg ); } else { Element * p = wskaznik; Element * nx; for(; p; p = p->next ) { nx = p->next; if( nx == NULL ) { p->next = new Element( arg, NULL ); return true; } if( nx->wartosc >= arg ) { p->next = new Element( arg, nx ); return true; } } } return false; } void Lista::print() { cout << "Lista: " << endl; int licznik = 1; for( Element * i = wskaznik; i != NULL; i = i->next ) { cout << "Numer: " << licznik << " " << i->wartosc << endl; licznik++; } } bool Lista::usun_od_poczatku( int ile ) { int i = 0; Element * nx; Element * p = wskaznik; for(; i < ile; p = nx, i++ ) { cout << p->next << endl; cout << p->wartosc << endl; if( p == NULL ) { cout << "Lista juz jest pusta" << endl; return false; } nx = p->next; delete p; } return true; }
|
|
mateczek |
» 2015-12-21 06:26:21 luźna uwaga nie wiem czy dobrze myśle bool Lista::usun_od_poczatku( int ile ) { int i = 0; Element * nx; Element * p = wskaznik; for(; i < ile; p = nx, i++ ) { cout << p->next << endl; cout << p->wartosc << endl; if( p == NULL ) { cout << "Lista juz jest pusta" << endl; return false; } nx = p->next; this->wskaxnik = p->next; delete p; } return true; }
|
|
pepe450 Temat założony przez niniejszego użytkownika |
» 2015-12-27 21:34:20 Robię to przypisując do nx=p->next; |
|
mateczek |
» 2015-12-27 22:16:25 Tyle, że nx jest zmienną tymczasową. po wyjściu z funkcji przestaje istnieć!!! składowa klasy lista, która pokazuje na pierwszy element nie jest modyfikowana!!! (przynajmniej tak mi się wydaje). A operator "delete p" nic nie robi (zwraca pamięć do dyspozycji systemu) bo destruktor klasy element jest funkcją pustą Robię to przypisując do nx=p->next; |
zapisujesz na kartce a kartkę do niszczarki wywalasz !!! przynajmniej ja tak to widzę |
|
pepe450 Temat założony przez niniejszego użytkownika |
» 2015-12-27 22:23:29 bool Lista::usun_od_poczatku( int ile ) { int i = 0; Element * nx; Element * p = wskaznik; for(; i < ile; i++ ) { cout << p->next << endl; cout << p->wartosc << endl; if( p == NULL ) { cout << "Lista juz jest pusta" << endl; return false; } nx = p->next; delete p; p = nx; } return true; } Czyli teraz powinno działać, ale wciąż brak efektów. |
|
mateczek |
» 2015-12-28 04:50:11 rozumiem, że moja propozycja z postu wyżej również nie działa ?? czy nie sprawdzałeś?? nx = p->next;
cout << "adres pierwszego elementu listy" << wskaznik << endl; cout << "adres na ktory pokazuje nx" << nx << endl; delete p;
|
|
pepe450 Temat założony przez niniejszego użytkownika |
» 2015-12-28 12:26:37 Dzięki teraz już zrozumiałem co miałeś na myśli. :) Wszystko śmiga :) bool Lista::usun_od_poczatku( int ile ) { int i = 0; Element * p = wskaznik; for(; i < ile; i++ ) { if( p == NULL ) { cout << "Lista juz jest pusta" << endl; return false; } wskaznik = p->next; delete p; p = wskaznik; } return true; }
|
|
« 1 » |