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

Prosta lista jednokierunkowa

Ostatnio zmodyfikowano 2016-07-23 19:47
Autor Wiadomość
mimotego
Temat założony przez niniejszego użytkownika
Prosta lista jednokierunkowa
» 2016-07-23 16:57:12
Dzień dobry!

Zmagam się z problemem stworzenia prostej listy, na bazie dwóch zagnieżdżonych klas. Stworzyłem klasę, która ma przedstawiać listę. Klasa ta posiada jako pola drugą klasę przedstawiającą dany element listy (jako pola ma ona tylko stringa na treść i wskaźnik na następny element) oraz wskaźnik na pierwszy element całej listy. Lista ma dwie metody, które dodają i wyświetlają elementy, jednak w nich właśnie pojawia się problem:

C/C++
void addElement( string napis ) {
    Item * newOne = new Item( napis );
    if( NULL == firstElement ) {
        firstElement = newOne;
    }
    else {
        Item * tmp = firstElement;
        while( tmp->next != NULL ) {
            tmp = tmp->next;
        }
        tmp->next = newOne;
    }
}

Warunek w pętli nigdy się nie spełnia i nie przechodzi ona do następnego obiektu. Może ktoś wie jak to rozwiązać?
P-150211
mateczek
» 2016-07-23 18:32:31
ciężko powiedzieć bez skompilowania kodu i sprawdzenia debuggerem.

1 dlaczego nie trzymasz wierzchołka listy w oddzielnej zmiennej??
C/C++
void addElement( string napis ) {
    Item * newOne = new Item( napis );
    newOne->next = nullptr // masz inicjalizacje wskaźnika next przy tworzeniu zmiennej??
    if( NULL == firstElement ) {
        firstElement = newOne;
       
    }
    else {
        Item * tmp = firstElement;
        while( tmp->next != NULL ) {
            tmp = tmp->next;
        }
        tmp->next = newOne;
    }
}
// ja bym robił jakoś tak  
void addElement( string napis ) {
    Item * newOne = new Item( napis );
    head->next = newOne;
    head = newOne // głowa listy
}
P-150212
mimotego
Temat założony przez niniejszego użytkownika
» 2016-07-23 19:37:59
Mam coś takiego:
C/C++
#include <iostream>
#include <string>

using namespace std;

class List {
private:
    static int size;
    class Item {
    public:
        string tresc;
        Item * next;
        Item( string s )
            : next( NULL )
             , tresc( s )
        { }
    };
    Item * firstElement;
   
public:
    List()
        : firstElement( NULL )
    { }
    void addElement( string napis ) {
        Item * newOne = new Item( napis );
        if( NULL == firstElement ) {
            firstElement = newOne;
        }
        else {
            Item * tmp = firstElement;
            while( tmp->next != NULL ) {
                tmp = tmp->next;
            }
            tmp->next = newOne;
        }
        size++;
    }
    void displayList() {
        Item * tmp = firstElement;
        while( tmp->next != NULL ) {
            cout << tmp->tresc << endl;
        }
    }
};

int List::size = 0;

int main() {
    List * l = new List;
    l->addElement( "A" );
    l->addElement( "B" );
    l->displayList();
    delete l;
    return 0;
}
P-150213
mateczek
» 2016-07-23 19:47:03
C/C++
void displayList() {
    Item * tmp = firstElement;
    while( tmp != NULL ) {
        cout << tmp->tresc << endl;
        tmp = tmp->next;
    }


//dodawanie elementów można zrobić bez pętli
C/C++
#include <iostream>
#include <string>

using namespace std;

class List {
private:
    static int size;
    class Item {
    public:
        string tresc;
        Item * next;
        Item( string s )
            : next( nullptr )
             , tresc( s )
        { }
    };
    Item * firstElement, * lastElement;
   
public:
    List()
    {
        firstElement = lastElement = nullptr;
    }
    void addElement( string napis ) {
        Item * newOne = new Item( napis );
        if( nullptr == firstElement ) {
            firstElement = lastElement = newOne;
        }
        else {
            lastElement->next = newOne;
            lastElement = newOne;
        }
        size++;
    }
    void displayList() {
        Item * tmp = firstElement;
        while( tmp != nullptr ) {
            cout << tmp->tresc << endl;
            tmp = tmp->next;
        }
    }
};

int List::size = 0;

int main() {
    List * l = new List;
    l->addElement( "A" );
    l->addElement( "B" );
    l->displayList();
    delete l;
    return 0;
}

musisz jeszcze destruktor listy doskrobać bo masz wycieki pamięci
P-150214
« 1 »
  Strona 1 z 1