Šta je ispis?

Dat je deo programa koji ručno povezuje tri čvora, a zatim menja pokazivače. Strukturu Cvor<T> iz zaglavlja lista.h koristimo bez klase Lista.

Cvor<int>* c = new Cvor<int>(3, nullptr);
Cvor<int>* b = new Cvor<int>(2, c);
Cvor<int>* a = new Cvor<int>(1, b);
Cvor<int>* p = a->sledeci;

p->sledeci->podatak = 7;             // (1)
a->sledeci = p->sledeci;             // (2)
p->sledeci = a;                      // (3)
p->podatak += a->sledeci->podatak;   // (4)
a = p;                               // (5)

for (Cvor<int>* q = a; q != nullptr; q = q->sledeci)
    std::cout << q->podatak << ' ';

Pre pokretanja nacrtati čvorove i pokazivače, ažurirati sliku posle svake naredbe i zapisati šta će program ispisati. Zatim pokrenuti program i uporediti.

Pitanja za razmišljanje: Šta bi se desilo da su naredbe (2) i (3) zamenjene? Koliko čvorova bi tada bilo dostupno iz a, a šta bi ispisala petlja?

Ulaz

Program nema ulaz.

Izlaz

U jednom redu ispisati podatke čvorova, onako kako ih ispisuje petlja.

Postavka

main.cpp

#include <iostream>

#include "lista.h"   // zbog strukture Cvor

int main()
{
    Cvor<int>* c = new Cvor<int>(3, nullptr);
    Cvor<int>* b = new Cvor<int>(2, c);
    Cvor<int>* a = new Cvor<int>(1, b);
    Cvor<int>* p = a->sledeci;

    p->sledeci->podatak = 7;             // (1)
    a->sledeci = p->sledeci;             // (2)
    p->sledeci = a;                      // (3)
    p->podatak += a->sledeci->podatak;   // (4)
    a = p;                               // (5)

    for (Cvor<int>* q = a; q != nullptr; q = q->sledeci)
        std::cout << q->podatak << ' ';
    std::cout << std::endl;

    while (a != nullptr) {
        Cvor<int>* stari = a;
        a = a->sledeci;
        delete stari;
    }

    return 0;
}

Rešenje

main.cpp

#include <iostream>

#include "lista.h"   // zbog strukture Cvor

int main()
{
    Cvor<int>* c = new Cvor<int>(3, nullptr);
    Cvor<int>* b = new Cvor<int>(2, c);
    Cvor<int>* a = new Cvor<int>(1, b);
    Cvor<int>* p = a->sledeci;

    // Na pocetku:  a(1) -> b(2) -> c(3) -> nullptr, a p pokazuje na b.
    p->sledeci->podatak = 7;             // (1) a(1) -> b(2) -> c(7)
    a->sledeci = p->sledeci;             // (2) a(1) -> c(7), b(2) -> c(7)
    p->sledeci = a;                      // (3) b(2) -> a(1) -> c(7)
    p->podatak += a->sledeci->podatak;   // (4) b dobija 2 + 7 = 9
    a = p;                               // (5) lista sada pocinje od b

    // Da su (2) i (3) zamenjene, a bi pokazivao sam na sebe: b(3) -> a(1) -> a(1) ...
    // Cvor c bi bio izgubljen, a petlja bi beskonacno ispisivala 1.

    for (Cvor<int>* q = a; q != nullptr; q = q->sledeci)
        std::cout << q->podatak << ' ';
    std::cout << std::endl;

    while (a != nullptr) {
        Cvor<int>* stari = a;
        a = a->sledeci;
        delete stari;
    }

    return 0;
}