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

Dlaczego lista się zapętla?

Ostatnio zmodyfikowano 2015-04-04 10:28
Autor Wiadomość
kam51
Temat założony przez niniejszego użytkownika
Dlaczego lista się zapętla?
» 2015-04-03 12:21:01
C/C++
#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 ) {
        //cout << "wyw" << endl;
        //fflush(stdout);
        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 ) {
        //              cout << "Ja sie wywolalem" << endl;
        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--;
        }
        //      cout << "Dzien dobry";
        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;
        }
       
    }
   
    //TUTAJ JEST FUNCKJA DO SWAPOWANIA, CO JEST ŹLE?!!!
    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;
    }
    //PORÓWNUJE TYLKO ROZMIARY-----------------------
    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;
    /*List c;
            c=list2+lista;
            cout <<"Lista 1 i 2 zmergowane w jedn¹ listê c" << endl <<  c;
            if (list2==lista)
                    cout << "Listy s¹ równe" << endl;
            else
                    cout << "Listy 1 i 2 nie s¹ równe" << endl;
            if (list2==c)
                    cout << "Listy s¹ równe" << endl;
            else
                    if (list2<c)
                            cout << "Lista c jest wiêksza od listy drugiej" << endl;*/
    cin >> list2;
    cin >> list2;
    cout << list2 << endl << endl << "Testy!" << endl;
    list2.SortTest();
    cout << list2 << endl;
    //cout << list2;
    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ć?
P-129976
Quirinnos
» 2015-04-03 13:51:33
Pewnie gdzieś nie przepięty odpowiedni wskaźnik.
P-129984
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?
P-129985
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).
P-130016
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.

C/C++
// to jest w porządku.
if( prev != NULL )
     prev->next = ahead;
else
     head = ahead;


Pozdrawiam.

P-130022
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.
P-130025
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
P-130061
« 1 »
  Strona 1 z 1