Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Lista jednokierunkowa - usuwanie.

Ostatnio zmodyfikowano 2015-12-28 12:26
Autor Wiadomość
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.
C/C++
#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;
}
P-142205
mateczek
» 2015-12-21 06:26:21
luźna uwaga nie wiem czy dobrze myśle
C/C++
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; // a nie powinieneś aktualizować wskaznika na pierwszy element w liscie??
        delete p;
    }
    return true;
}
P-142208
pepe450
Temat założony przez niniejszego użytkownika
» 2015-12-27 21:34:20
Robię to przypisując do nx=p->next;
P-142437
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ę
P-142442
pepe450
Temat założony przez niniejszego użytkownika
» 2015-12-27 22:23:29
C/C++
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.
P-142444
mateczek
» 2015-12-28 04:50:11
rozumiem, że moja propozycja z postu wyżej również nie działa ?? czy nie sprawdzałeś??
C/C++
nx = p->next;
//wskaznik = p->next; //A czy to nie działa ??
cout << "adres pierwszego elementu listy" << wskaznik << endl;
cout << "adres na ktory pokazuje nx" << nx << endl;
delete p;
P-142452
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 :)
C/C++
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;
}
P-142456
« 1 »
  Strona 1 z 1