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

zamiania wartości w liście dynamicznej

Ostatnio zmodyfikowano 2018-01-19 23:38
Autor Wiadomość
Crowsow
Temat założony przez niniejszego użytkownika
zamiania wartości w liście dynamicznej
» 2017-12-29 17:32:44
Witam serdecznie.
Chciałbym zamienić wartości końcowe z początkowymi w moim sznurze(liście dynamicznej).
Plan był taki żeby z jednej strony złapać startem, z drugiej zamieniaczem, wartości zamienić swapem i żeby tak jakby odwrócić sznur
(np. 4761 ma się zamienić na 1674 )
Licznik to długość sznura.
Pierwsza zamiana działa niestety za drugim razem zamieniacz nie znajduje się w miejscu przeze mnie pożądanym, i nie mam pojęcia dlaczego.
Z góry bardzo dziękuję za pomoc, już kolejny dzień nad tym siedzę :/
Kod pliku h:
C/C++
struct Sznur
{
private:
    struct Node
    {
        int value;
        Node * next;
        Node( int _value, Node * _next = NULL )
        {
            value = _value;
            next = _next;
        }
    };
    Node * head;
    int counter;
   
public:
    Sznur();
    ~Sznur();
    void wstaw( int _value );
    void wypisz( int licznik );
    void dodawanie( int licznik );
    void zamiana( int licznik );
   
};
A kod funkcji w cpp:
C/C++
void Sznur::wypisz( int licznik )
{
    Node * tmp = head;
    cout << "\nCiag 1 : ";
    for( int i = 0; i < licznik; i++ )
    {
        cout << tmp->value << " ";
        tmp = tmp->next;
    }
    cout << "\nCiag 2 : ";
    while( tmp != NULL )
    {
        cout << tmp->value << " ";
        tmp = tmp->next;
    }
}

void Sznur::zamiana( int licznik )
{
    Node * start = head;
    Node * stop = NULL;
    Node * zamieniacz = head;
    Node * pzamieniacz = NULL;
    int j = licznik - 1;
    for( int i = 0; i < licznik / 2; i++ )
    {
        for( j; j > 0; j-- )
        {
            pzamieniacz = zamieniacz;
            zamieniacz = zamieniacz->next;
            pzamieniacz->next = zamieniacz;
        }
        cout << "\nZamieniam liczbe " << start->value << " z liczba " << zamieniacz->value;
        swap( start->value, zamieniacz->value );
        wypisz( licznik );
        stop = start;
        start = start->next;
        stop->next = start;
        j--;
       
    }
P-168208
pekfos
» 2017-12-31 01:35:24
Zmienna j jest błędnie użyta. Po pierwszym obiegu zewnętrznej pętli, jej wartość jest ujemna i wewnętrzna pętla więcej nie wykonuje się. Masz też w tym kodzie konstrukcje, które nie mają żadnego sensu:
C/C++
pzamieniacz = zamieniacz;
zamieniacz = zamieniacz->next;
pzamieniacz->next = zamieniacz;
Przypisanie do next nic tu nie wnosi, nie zmienia w ogóle wartości tego wskaźnika. To samo ze zmiennymi start i stop. Skoro zamieniasz same wartości pól value, nie ma żadnego sensu w grzebaniu przy wartościach next.

Znasz długość listy n, więc zamieniaj element start = head z elementem znajdującym się o n - 1 pozycji dalej (ostatni element). Następnie powtarzaj dla start = start->next i n = n - 2 (dla podciągu pomiędzy zamienionymi elementami).
P-168265
Crowsow
Temat założony przez niniejszego użytkownika
» 2018-01-19 23:38:19
Dziękuję, rzeczywiście  po przemyśleniu Twoich rad i zastosowaniu się do nich kod zaczął działać bez zarzutu :).
Dziękuję bardzo, temat do zamknięcia ;)
P-168847
« 1 »
  Strona 1 z 1