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

Sortowanie elementów listy- nieskończona pętla.

Ostatnio zmodyfikowano 2015-04-14 20:19
Autor Wiadomość
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

C/C++
#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;
}
P-130733
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ść.
P-130779
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;

C/C++
struct lista
{
    element * poczatek;
    ...
};

...
void lista::segreguj()
{
    element * NowyPoczatek = NULL;
    element * maks;
    element * pop_maks;
    element * temp;
   
    cout << endl << "Tutaj" << endl;
   
    while( poczatek ) // warunek petli kiedy się skończy
    {
        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;
    }
}
P-130781
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 ?...
P-130847
Quirinnos
» 2015-04-13 21:27:46
Tutaj sie przyjrzyj
(oczywiście, patrząc na resztę kodu)
C/C++
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ę :>
P-130851
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ę ?
P-130861
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.
P-130862
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.
P-130870
« 1 » 2
  Strona 1 z 2 Następna strona