Prosta lista jednokierunkowa
Ostatnio zmodyfikowano 2016-07-23 19:47
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: 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ć? |
|
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?? void addElement( string napis ) { Item * newOne = new Item( napis ); newOne->next = nullptr if( NULL == firstElement ) { firstElement = newOne; } else { Item * tmp = firstElement; while( tmp->next != NULL ) { tmp = tmp->next; } tmp->next = newOne; } }
void addElement( string napis ) { Item * newOne = new Item( napis ); head->next = newOne; head = newOne } |
|
mimotego Temat założony przez niniejszego użytkownika |
» 2016-07-23 19:37:59 Mam coś takiego: #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; }
|
|
mateczek |
» 2016-07-23 19:47:03 void displayList() { Item * tmp = firstElement; while( tmp != NULL ) { cout << tmp->tresc << endl; tmp = tmp->next; }
//dodawanie elementów można zrobić bez pętli #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 |
|
« 1 » |