Anim Temat założony przez niniejszego użytkownika |
Sortowanie elementów listy- nieskończona pętla. » 2015-04-12 22:20:27 Witajcie. Cały dzień walczę ze zrozumieniem list. I idzie mi po prawdzie jak krew z nosa. Mam do wykonania listę z elementami losowymi w zakresie do 20, a następnie mam je posegregować. I chciałbym spytać o poniższy kod. Dlaczego pętla while (tam gdzie jest printf: "Tutaj_3") w metodzie segreguj(), biegnie w nieskończoność ? Wiem, że problem jest jakby kontynuacją problemu, który postawiłem już dzisiaj na forum, ale jak regulamin to regulamin ;p Jedno pytanie, jeden wątek ;p #include <iostream> #include <string> #include <time.h> #include <conio.h> #include <cstdlib>
using namespace std;
struct element { int liczba; element * next; element(); };
element::element() { next = 0; }
struct lista { element * poczatek; void uzupelnij_liste( int liczba ); void segreguj(); void wypisz_liste(); lista(); };
lista::lista() { poczatek = 0; }
void lista::uzupelnij_liste( int liczba ) { element * nowy = new element; nowy->liczba = liczba; if( poczatek == 0 ) { poczatek = nowy; } else { element * temp = poczatek; while( temp->next ) { temp = temp->next; } temp->next = nowy; } }
void lista::wypisz_liste() { element * temp = poczatek; while( temp ) { cout << temp->liczba << endl; temp = temp->next; } }
void lista::segreguj() { element * NowyPoczatek = NULL; element * maks; element * pop_maks; element * temp; cout << endl << "Tutaj" << endl; while( poczatek ) { maks = poczatek; pop_maks = NULL; temp = poczatek; cout << endl << "Tutaj_2" << endl; while( temp->next ) { cout << endl << "Tutaj_3" << endl; if( temp->next->liczba > maks->liczba ) { pop_maks = temp; maks = temp->next; } temp = temp->next; } cout << endl << "Tutaj_4" << endl; if( pop_maks ) { pop_maks->next = maks->next; } else { poczatek = maks->next; } maks->next = NowyPoczatek; NowyPoczatek = maks; poczatek = NowyPoczatek; } }
int main() { srand( time( NULL ) ); int liczba = 0; int n = 0; cout << "Podaj liczbe n - rozmiar listy" << endl; cin >> n; cout << "" << endl; lista * baza = new lista; for( int j = 0; j < n; j++ ) { liczba = rand() % 20 + 1; baza->uzupelnij_liste( liczba ); } baza->segreguj(); baza->wypisz_liste(); delete( baza ); return 0; }
|
|
DejaVu |
» 2015-04-13 12:09:28 Strzelam, że zapewne jak zmieniasz wskaźniki elementów to wprowadzasz gdzieś po drodze cykl, więc pętla kręci się w nieskończoność. |
|
darko202 |
» 2015-04-13 12:19:01 1. masz petlę nieskończoną, gdyż masz błąd w while( poczatek ) zastanów się kiedy warunek petli kiedy się skończy tzn. będzie nieprawdziwy ? poczatek = maks->next; zawsze coś będzie zawierać 2. funkcja segreguj to chyba nie jest sortuj bo zmieniasz listę poczatek = maks->next; struct lista { element * poczatek; ... };
... void lista::segreguj() { element * NowyPoczatek = NULL; element * maks; element * pop_maks; element * temp; cout << endl << "Tutaj" << endl; while( poczatek ) { maks = poczatek; pop_maks = NULL; temp = poczatek; cout << endl << "Tutaj_2" << endl; while( temp->next ) { cout << endl << "Tutaj_3" << endl; if( temp->next->liczba > maks->liczba ) { pop_maks = temp; maks = temp->next; } temp = temp->next; } cout << endl << "Tutaj_4" << endl; if( pop_maks ) { pop_maks->next = maks->next; } else { poczatek = maks->next; } maks->next = NowyPoczatek; NowyPoczatek = maks; poczatek = NowyPoczatek; } }
|
|
Anim Temat założony przez niniejszego użytkownika |
» 2015-04-13 20:18:38 hm. To chyba nie jest do końca problem z warunkiem while ;/ To znaczy nie neguję, że sam warunek while(poczatek) może być błędny, ale jak zamieniłem tą pętlę na for(0,5,++) <- dla przykładu....to i tak się zapętla w nieskończoność. może faktycznie tak jak DejaVu napisał, że problem jest ze wskaźnikami, tylko, że wskaźniki również w moim przypadku są w fazie "nauki", co powoduje, że nie potrafię ich jeszcze umieszczać zbyt dobrze. Czy zechciałby ktoś ten kod przeanalizować ? i wskazać mi, w którym miejscu są błędy ?... |
|
Quirinnos |
» 2015-04-13 21:27:46 Tutaj sie przyjrzyj (oczywiście, patrząc na resztę kodu) NowyPoczatek = maks; poczatek = NowyPoczatek;
PS. To chyba nie jest do końca problem z warunkiem while ... może faktycznie tak jak DejaVu napisał, że problem jest ze wskaźnikami |
Zarówno DejaVu jak i Darko mają rację :> |
|
Anim Temat założony przez niniejszego użytkownika |
» 2015-04-13 23:19:16 To już wiem co się stało źle :)
@Quirinnos miałeś rację, że chodzi o te dwie linijki. Rozwiązaniem okazało się przerzucenie : poczatek = NowyPoczatek, poza pętlę while :) i wszystko działa ^^
ładnie sortuje od najmniejszego elementu do największego :) Tyle godzin psu w tyłek ^^
Dziękuję Wam za pomoc... Tz. mam jeszcze jedno pytanie, ale to tak dla sportu: Czy listy są użyteczne? tz. nie neguję wykorzystywania struktur, ale czy nie łatwiej to zadanie byłoby zrobić z wykorzystaniem vectora ? czy znowu coś mylę ? |
|
michal11 |
» 2015-04-13 23:24:50 To zależy od problemu, dlatego powstały te struktury żeby był wybór. DO jednych problemów lepiej wykorzystać listę a do innych vector a do jeszcze innych kolejkę czy stos. |
|
Quirinnos |
» 2015-04-14 10:31:52 Lista (jednokierunkowa) od vectora to zbytnio się nie różni. Inaczej rozwiązane jest zarządzanie pamięcią. Lista opiera się na węzłach (tak jak u Ciebie), a vector to taka opakowana tablica. Główna różnica leży w szybkości dodawania/odczytywania danych. Odczyt vectora jest szybki, za to wolne jest dodanie kolejnego elementu. W liście jest na odwrót. Tak jak wspomniał Michał, wszystko zależy od tego, czego potrzebujemy. Jak poznasz drzewa, grafy, to dopiero zobaczysz ile roboty zaoszczędzają Ci takie struktury. |
|
« 1 » 2 |