You are on page 1of 4

Rjesenje predhodne zadace & Navigacija kroz listu

Rjesenja zadace:

#include <stdio.h>
#include <cstdlib>
#include <iostream>

using namespace std;


/* Definicija cvora liste*/
struct cvor
{
char slovo;
cvor* sledeci;
};
void ispisi_listu(cvor* start_ptr)
{

cvor *pom = start_ptr;


do
{
if (pom == NULL)
cout << endl<<"Kraj liste" << endl;
else
{ // Ispis detalja iz čvora na koji pokazuje pom pointer
cout << "Slovo: " << pom->slovo << endl;

cout << endl;


// Pomjeranje na slijedeći čvor

pom = pom->sledeci;

while (pom != NULL);

return;

cvor* brisi_prvi_cvor(cvor* start_ptr)


{ cvor *pom;
pom = start_ptr;
start_ptr = start_ptr->sledeci;
delete pom;
return start_ptr;
}

int main()
{

cvor *startpokazivac,*zadnji,*pomocni;
string rijec;
cout<<"upisite rijec:";
cin>>rijec;
int i=0;
startpokazivac=NULL;
while(rijec[i] !='\0'){
cvor *novi = new cvor;

novi->slovo=rijec[i];

novi->sledeci = NULL;
if (startpokazivac == NULL){
startpokazivac=novi;
}else{
pomocni = startpokazivac;
// postavljamo pom na kraj liste
while (pomocni->sledeci != NULL)
{
pomocni = pomocni->sledeci; // pomjeranje na slijedeći čvor
}
pomocni->sledeci = novi;// pokazivač zadnjeg čvora u listi postavljamo da
pokazuje na novi čvor
}
i++;
}
cout<<"ispis podataka iz liste:"<<endl;
zadnji=startpokazivac;

while(zadnji !=NULL){
zadnji=zadnji->sledeci;

}
cout<<endl;
cout<<"ispis podataka iz liste uz pomoc funkcije:"<<endl;
ispisi_listu(startpokazivac);
cout<<"ispis podataka iz liste uz pomoc funkcije ali nakon brisanja prvog
cvora:"<<endl;
startpokazivac= brisi_prvi_cvor(startpokazivac);
cout<<"vrijednost startnog pokazivaca: "<<startpokazivac<<endl;

ispisi_listu(startpokazivac);

return 0;}
Za rad sa povezanom listom, potrebno je uspostaviti mehanizam kretanja po listi, unaprijed ili unazad.
Ovo je naročito potrebno aki želimo brisati ili upisivati čvor unutar liste.

Kretanje naprijed:

Deklarišimo pointer tekuci. Najprije mu dodjeljujemo adresu prvog čvora u listi, koju čuvamo u pointeru
start_ptr (startni pokazivac je nasa veza sa listom!) :
cvor *tekuci;
tekuci = start_ptr;
Nakon ovih naredbi oba pointera pokazuju na isti (pocetni) čvor:

Pomjeranje pointera tekuci unaprijed realizujemo naredbom u kojoj pointeru tekuci dodjeljujemo
adresu cvora koji slijedi, a koja je upisana u članicu “slijedeci” čvora na kojeg tekuci pokazuje:

tekuci = tekuci->slijedeci;
Prije prethodne naredbe dodjele, potrebno je provjeriti da tekući u polju slijedeći ne sadrži null
vrijednost. Ako je to tako, onda tekuci pokazuje na zadnji čvor u list i nema potrebe za njegovim
pomjeranjem:
if (tekuci->slijedeci == NULL)
cout << "Pozicionirani ste na kraj liste." << endl;
else
tekuci = tekuci->slijedeci;

Pomjeranje pokazivača unazad

Kretanje unazad je nesto komplikovanije.Logika je sledeca: (npr: nalazimo se na 4. cvoru,a u prvom


koraku se trebamo pomjeriti na 3. cvor (3. cvor je predhodnik od 4. cvora),zatim na drugi I tako sve do
prvog)

Kao sto znamo listi pristupamo preko startnog pokazivaca.Idemo naprijed sve dok ne dodjemo do cvora
br. 3 (jer je on predhodnik naseg trenutnog cvora na kome se nalazimo).

Kako cu znati da sam nasao predhodnika? Tako sto pokazivac slijedeci od predhodnika pokazuje na nas
trenutni cvor (tj sadrzi njegovu adresu).

Najprije ćemo provjeriti da li pointer tekuci pokazuje na prvi čvor. Ako je tako, onda on nema
prethodnika. Ako nije, onda provjeravamo sve čvorove dok ne naiđemo na prethodnika tekućeg
if (tekuci == start_ptr)
cout << "Pocetak liste!" << endl;
else
{ cvor *prethodni; // pointer koji pokazuje na prethodnika
prethodni = start_ptr;
while (prethodni->slijedeci != tekuci)
{
prethodni = prethodni->slijedeci;
}
tekuci = prethodni;//tekuci smo pomijerili za jedno mjesto unaprijed
}

Kod koji je naveden iza else određuje slijedeće:


- Najprije deklarišemo pointer koji će pokazivati na prethodni čvor – pointer prethodni.
- U prethodni postavljamo adresu prvog čvora.
- Sve dok ne pokazuje na čvor koji prethodi tekućem, mijenjamo adresu u pointeru prethodni
tako da pokazuje na slijedeći čvor.
- Kada pronađemo prethodnika u odnosu na tekući, pointer tekuci postavljamo da pokazuje na
isti čvor kao i pointer prethodni, kojeg smo „doveli“ do njegovog prethodnika

Sada kada možemo da se “krećemo” unaprijed i unazad kroz listu, možemo uraditi još ponešto sa listom.
Naprimjer, možemo mijenjati podatke u čvoru liste na koji pokazuje tekuci:

cout << "Unesite novo ime: ";


cin >> tekuci->ime;
cout << "Unesite novi podatak o godinama : ";
cin >> tekuci->ime;
cout << "Upisite novi podatak o visini : ";
cin >> tekuci->visina;

You might also like