You are on page 1of 6

AUDITORNE VJEBE 5 Jednostruko povezane liste

Liste osnovni pojmovi linearna lista A=(a1,a2,...an) je struktura podataka koja se sastoji od ureenog niza elemenata odabranih iz nekog skupa podataka za linearnu listu kaemo da je prazna ako ima n=0 elemenata elementi liste ai nazivaju se jo i atomi (vorovi) moe se realizirati statikom strukturom podataka - nizom dinamika podatkovna struktura za realizaciju liste sastoji se od pokazivaa na prvi element liste i od proizvoljnog broja atoma (vorova) svaki se atom (vor) sastoji od podatkovnog dijela i pokazivaa na sljedei element liste memorija za svaki atom liste zauzme se u trenutku kad je potrebna za pohranu podataka, a oslobaa kad se podatak brie granulacija je veliine atoma podatak je mogue u listu umetnuti: o na poetak liste o iza nekog elementa na listi

class Cvor { public: int _stavka; Cvor* _sljed; Cvor() : _stavka(0), _sljed(0) {} Cvor(int e) : _stavka(e), _sljed(0) {} };

_glava

_glava

15

45

63
1

class Lista { private: Cvor *_glava; public: Lista(); Lista(const Lista &izvor); ~Lista(); void void bool bool bool bool void void }; Lista::Lista() { _glava = NULL; } Lista::Lista(const Lista &izvor) { Cvor *pCvorPred,*pCvorIzvor; if (izvor._glava==NULL) _glava=NULL; else { _glava=new Cvor(); _glava->_stavka=izvor._glava->_stavka; pCvorPred=_glava; for (pCvorIzvor=izvor._glava->_sljed; pCvorIzvor!=NULL; pCvorIzvor=pCvorIzvor->_sljed) { pCvorPred->_sljed=new Cvor(); pCvorPred=pCvorPred->_sljed; pCvorPred->_stavka=pCvorIzvor->_stavka; } pCvorPred->_sljed=NULL; } } Lista::~Lista() { BrisiSve (); } DodajNaPocetak(int stavka); DodajNaKraj(int stavka); DodajSortirano(int stavka,bool uzlazno); NadjiPoKljucu(int kljuc,int &stavka); BrisiSPocetka(int &stavka); BrisiZadanog(int kljuc,int &stavka); BrisiSve(); IspisiListu();

pretraivanje liste od glave dok se ne pronae traeni element


bool Lista::NadjiPoKljucu(int kljuc, int& stavka) { Cvor *p; for (p = _glava; (p != NULL) && (p->_stavka != kljuc); p = p>_sljed); if (p != NULL) { stavka = p->_stavka; return true; } else return false;

_glava

15

45

64

95

element moemo dodati: na poetak liste (tad mijenjamo glavu) negdje iza postojeeg elementa liste na posljednje mjesto ispred elementa koji je vei od onog koji umeemo

_glava

15

45

64

95

void Lista::DodajNaPocetak(int stavka) { Cvor *novi = new Cvor(); novi->_stavka = stavka; novi->_sljed = _glava; _glava = novi; cout << " na adresu " << novi; }

_glava

45

64

71

95

void Lista::DodajNaKraj(int stavka) { Cvor *novi = new Cvor(); Cvor *pom; novi->_stavka = stavka; novi->_sljed = NULL; if (_glava == NULL) _glava = novi; else{ for (pom=_glava; pom->_sljed!=NULL; pom=pom->_sljed); pom->_sljed=novi; } cout << " na adresu " << novi; } bool Lista::DodajSortirano(int stavka, bool uzlazno) { Cvor *novi = new Cvor(); Cvor *p; novi->_stavka = stavka; if (_glava == NULL || (uzlazno ^ (_glava->_stavka < stavka))) { // Dodavanje na pocetak liste // koristi se "ekskluzivno ili" smjera i usporedbe DodajNaPocetak (stavka); } else { // Dodavanje iza postojeceg elementa kad: // nema sljedeeg ili element u sljedeem je (uzlazno ^ veci od novoga) for (p = _glava; (p->_sljed != NULL) && (uzlazno ^ (p->_sljed->_stavka > stavka)); p = p>_sljed); // da li takav vec postoji if ((p->_sljed != NULL) && (p->_sljed->_stavka == stavka)) return 0; novi->_sljed = p->_sljed; p->_sljed = novi; cout << " na adresu " << novi; } return 1; }

element koji briemo moe biti: na poetku liste (tad pomiemo glavu na sljedei element) negdje iza postojeeg elementa liste treba pronai element koji prethodi onom koji briemo i povezati ga s elementom koji se nalazi iza onog kojeg briemo obavezno obrisati memoriju koju je zauzimao brisani element

p _glava

45

64

71

95

bool Lista::BrisiSPocetka(int& stavka) { if (_glava != NULL) { stavka = _glava->_stavka; _glava = _glava->_sljed; // ako je bio jedini return true; } return false; }

_glava

45

64

71

95

bool Lista::BrisiZadanog(int kljuc, int& stavka) { Cvor *p, *preth = NULL; for (p = _glava; (p != NULL); p = p->_sljed){ if (p->_stavka == kljuc){ if (_glava == p){ // brisanje 1. elementa - promjena glave _glava = p->_sljed; }else { // brisanje elementa u tijelu liste preth->_sljed = p->_sljed; } stavka = p->_stavka; delete p; return true; } preth = p; } return false; } void Lista::IspisiListu() Cvor *pom; pom = _glava; if (pom == NULL) cout <<"Lista else for (pom; pom cout << } {

je prazna\n"; !=NULL; pom = pom->_sljed) "Element="<< pom->_stavka << endl;

void Lista::BrisiSve() { Cvor *pom; while (_glava!=NULL) { pom = _glava; _glava = _glava->_sljed; delete pom; } }

You might also like