Dlaczego lista się zapętla?
Ostatnio zmodyfikowano 2015-04-04 10:28
kam51 Temat założony przez niniejszego użytkownika |
Dlaczego lista się zapętla? » 2015-04-03 12:21:01 #include <iostream> #include <cstdio> using namespace std; class List;
class element { private: int number; element * next; friend class List; friend ostream & operator <<( ostream &, const List & ); public: element( int data ) { number = data; } int getData() { return number; } };
class List { private: element * head; int size; friend ostream & operator <<( ostream &, const List & ); public: List() { head = NULL; size = 0; } List( const List & lista ) { if( lista.size == 0 ) { size = 0; head = NULL; } else { size = 0; head = NULL; element * tmp = lista.head; while( tmp != NULL ) { cout << tmp->number << " "; fflush( stdout ); this->addToList( tmp->number ); tmp = tmp->next; } } } ~List() { if( head != NULL ) { element * tmp = head; element * temp; while( tmp != NULL ) { temp = tmp->next; delete tmp; tmp = temp; } head = NULL; } } void addToList( int data ) { element * newNode = new element( data ); newNode->next = NULL; element * tmp = head; if( tmp != NULL ) { while( tmp->next != NULL ) { tmp = tmp->next; } tmp->next = newNode; } else { head = newNode; } size++; } int popSelected( element * deleted ) { int value = deleted->number; element * tmp; if( head == deleted ) { delete head; head = NULL; } else { tmp = head; while( tmp->next != deleted ) tmp = tmp->next; tmp->next = deleted->next; delete deleted; size--; } return value; } element * getPrevious( element * lol ) { element * tmp; if( lol == head ) return NULL; else { tmp = head; while( tmp->next != lol ) tmp = tmp->next; return tmp; } } void Swap( element * before, element * ahead ) { element * prev = getPrevious( before ); element * prev2 = getPrevious( ahead ); element * tmp; tmp = before->next; before->next = ahead->next; ahead->next = tmp; prev2->next = before; if( prev != NULL ) prev->next = ahead; else head = ahead; } void SortTest() { Swap( head->next, head->next->next ); } void Sort() { if( head != NULL ) { element * current = head; element * prev = NULL; element * tmp = NULL; bool check = false; for( int i = 0; i < size; i++ ) { while( current->next != NULL ) { tmp = current->next; if( current->number > tmp->number ) { check = true; current->next = tmp->next; tmp->next = current; if( prev != NULL ) prev->next = tmp; prev = tmp; if( head == current ) head = tmp; } else { prev = current; current = current->next; } } if( check == false ) { break; } else { prev = NULL; current = head; check = false; } } } } List & operator =( const List & lista ) { if( & lista == this ) return * this; if( this->head != NULL ) { element * tmp = head; element * temp; while( tmp != NULL ) { temp = tmp->next; delete tmp; tmp = temp; } head = NULL; } if( lista.size == 0 ) { size = 0; head = NULL; } else { size = 0; head = NULL; element * tmp = lista.head; while( tmp != NULL ) { this->addToList( tmp->number ); tmp = tmp->next; } } return * this; } List operator +( const List & lista ) { List newList; element * tmp = this->head; while( tmp != NULL ) { newList.addToList( tmp->number ); tmp = tmp->next; } tmp = lista.head; while( tmp != NULL ) { newList.addToList( tmp->number ); tmp = tmp->next; } return newList; } bool operator ==( const List & lista ) { if( this->size == lista.size ) return true; else return false; } bool operator >( const List & lista ) { if( this->size > lista.size ) return true; else return false; } bool operator <( const List & lista ) { if( this->size < lista.size ) return true; else return false; } };
istream & operator >>( istream & str, List & lists ) { int data; str >> data; lists.addToList( data ); return str; }
ostream & operator <<( ostream & str, const List & lists ) { element * tmp = lists.head; if( tmp == NULL ) { str << "List is empty" << endl; } else { while( tmp != NULL ) { str << "(" << tmp->number << ")" << "--"; tmp = tmp->next; } str << "NULL" << endl << "Size of list: " << lists.size << endl; } return str; }
int main() { List lista; cin >> lista; cin >> lista; List list2 = lista; cout << "Lista nr 1" << endl << lista; cout << "Lista nr 2" << endl << list2; cin >> list2; cout << "Lista nr 2 po zmianie danych" << endl << list2; cin >> list2; cin >> list2; cout << list2 << endl << endl << "Testy!" << endl; list2.SortTest(); cout << list2 << endl; return 0; }
Mój problem polega na tym, że po wykonaniu funkcji Swap lista się zapętla na 2 elemencie. Fakt, 2 elementem jest ten co chciałem żeby był, ale nie wiem dlaczego wskazuje on później na samego siebie, mógłby ktoś spojrzeć i coś poradzić? |
|
Quirinnos |
» 2015-04-03 13:51:33 Pewnie gdzieś nie przepięty odpowiedni wskaźnik. |
|
kam51 Temat założony przez niniejszego użytkownika |
» 2015-04-03 13:56:15 Tyle wywnioskować to i ja potrafię... Moje pytanie jest gdzie? A jeśli to nie to to co jest nie tak? |
|
C-Objective |
» 2015-04-03 19:07:00 Hmm... Wogóle to zdziwiło mnie to: friend . Już system kolegów dodali! To 'C++' powoli staje się RPG! Co do tematu, coś tam pewnie jest tak przegrzebane w klasach lub wskaźnikach (co ma piernik do wiatraka :P). |
|
Quirinnos |
» 2015-04-03 19:53:52 No witam ponownie, chodzi Ci o typowego swapa, tak? Zamianę dwóch podanych elementów miejscami? Zobacz co robisz; masz dwa elementy X i Y, chcesz zamienić miejscami, czyli mieć Y i X. - tworzysz prev, który wskazuje na poprzednik X. - tworzysz prev2, który wskazuje na poprzednik Y (czyli notabene na X, tutaj już powinna zapalić Ci się kontrolką). - tworzysz tmp, który wskazuje X->next(czyli wskazuje na Y, następna kontrolka) - następnie X->next zaczyna wskazywać na Y->next - a Y->next zaczyna wskazywać na tmp (czyli Y wskazuje na Y, huncwot!). potem poprzednik Y wskazuje na X. Chyba już widzisz, gdzie się zapętla. Teraz masz jeszcze, jak (po mojemu) by to było. - Tworzysz prev, który wskazuje na poprzednik X. - Tworzysz post, który wskazuje na Y->next - Tworzysz tmp, który wskazuje na X. - X->next wskazuje na Y->next - i Y->next na tmp :) I wtedy ładnie zamienia. if( prev != NULL ) prev->next = ahead; else head = ahead;
Pozdrawiam. |
|
Brunon3 |
» 2015-04-03 21:12:42 Hmm... Wogóle to zdziwiło mnie to: friend . |
To normalny element języka C++ i nie ma w tym nic dziwnego. To 'C++' powoli staje się RPG! |
Tego lepiej nie będę komentować. coś tam pewnie jest tak przegrzebane w klasach lub wskaźnikach |
Wow, naprawdę? Twój poprzednik to stwierdził, jakbyś nie zauważył... (co ma piernik do wiatraka :P) |
No właśnie. -- -BD. |
|
C-Objective |
» 2015-04-04 10:28:31 System przyjaciół wprowadzili, teraz pewnie pieniądze C++'owe będą! :D I jeszcze questy by się przydału :D |
|
« 1 » |