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 |