Š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;
}