Algoritmi i Strukture Podataka 1 3 Liste Zadatak

  • Slides: 51
Download presentation
Algoritmi i Strukture Podataka 1 3. Liste

Algoritmi i Strukture Podataka 1 3. Liste

Zadatak 0 Na programskim jezicima C i Python napisati funkcije za rad sa jednostruko

Zadatak 0 Na programskim jezicima C i Python napisati funkcije za rad sa jednostruko ulančanim listama sa generičkim sadržajem. Obezbediti mogućnost automatskog brisanja generičkog sadržaja prilikom brisanja liste. Napisati glavni program koji demonstrira korišćenje ovih funkcija. Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 2

Zadatak 0 - rešenje (C: 1/16) /* lista. h : jednostruko ulancana lista */

Zadatak 0 - rešenje (C: 1/16) /* lista. h : jednostruko ulancana lista */ typedef struct El. Liste { void *podatak; struct El. Liste *sledeci; } Element. Liste; typedef struct lista { Element. Liste *prvi, *poslednji; void (*brisi)(void *); int br_elem; } Lista; typedef struct list. Iterator { Lista *lista; Element. Liste *tekuci, *prethodni; } Iterator. Liste; Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 3

Zadatak 0 - rešenje (C: 2/16) /* pravljenje, brisanje i praznjenje liste */ Lista

Zadatak 0 - rešenje (C: 2/16) /* pravljenje, brisanje i praznjenje liste */ Lista *napravi. Listu( void (*brisi)(void *) ); void obrisi. Listu(Lista *l); void isprazni. Listu( Lista *l ); /* dodavanje i uklanjanje */ int dodaj. UListu(Lista *l, void *podatak ); int ukloni. Element. Br(Lista *l, int br); int ukloni. Element(Lista *l, Element. Liste *el); /* razne operacije sa listom */ int broj. Elemenata(Lista *l); /* funkcije iteratora */ void inicijalizuj. Iterator(Lista *l, Iterator. Liste *i); void na. Pocetak(Iterator. Liste *i); void sledeci. Element(Iterator. Liste *i); int kraj. Liste(Iterator. Liste *i); Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 4

Zadatak 0 - rešenje (C: 3/16) #include "lista. h" #include <stdlib. h> /* pravljenje

Zadatak 0 - rešenje (C: 3/16) #include "lista. h" #include <stdlib. h> /* pravljenje i brisanje liste */ Lista *napravi. Listu( void (*brisi)(void *) ) { Lista *l = calloc(1, sizeof(Lista) ); if( ! l ) return 0; l->brisi = brisi; return l; } void obrisi. Listu(Lista *l) { if( l ) { isprazni. Listu(l); free(l); } } Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 5

Zadatak 0 - rešenje (C: 4/16) void isprazni. Listu( Lista *l ) { if(

Zadatak 0 - rešenje (C: 4/16) void isprazni. Listu( Lista *l ) { if( l ) { Element. Liste *el = l->prvi; while( el ) { Element. Liste *stari = el; el = el->sledeci; if( l->brisi ) l->brisi(stari->podatak); free(stari); } l->prvi = l->poslednji = 0; l->br_elem = 0; } } Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 6

Zadatak 0 - rešenje (C: 5/16) int dodaj. UListu(Lista *l, void *podatak ) {

Zadatak 0 - rešenje (C: 5/16) int dodaj. UListu(Lista *l, void *podatak ) { if( l && podatak ) { Element. Liste *novi. El = calloc(1, sizeof(Element. Liste)); if( ! novi. El ) return 0; novi. El->podatak = podatak; if( l->prvi ) l->poslednji->sledeci = novi. El; else l->prvi = novi. El; l->poslednji = novi. El; return ++l->br_elem; } return 0; } Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 7

Zadatak 0 - rešenje (C: 6/16) /* uklanja element na koga ukazuje iterator, prototip

Zadatak 0 - rešenje (C: 6/16) /* uklanja element na koga ukazuje iterator, prototip ne postoji u lista. h fajlu, pa nije "javno" dostupna funkcija */ void ukloni. Element. Iz. Liste(Lista *l, Iterator. Liste *il) { if( ! il->prethodni ) l->prvi = il->tekuci->sledeci; else il->prethodni->sledeci = il->tekuci->sledeci; if( il->tekuci == l->poslednji ) l->poslednji = il->prethodni; if( l->brisi ) l->brisi( il->tekuci->podatak ); free( il->tekuci ); } Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 8

Zadatak 0 - rešenje (C: 7/16) /* uklanja element pod zadatim rednim brojem */

Zadatak 0 - rešenje (C: 7/16) /* uklanja element pod zadatim rednim brojem */ int ukloni. Element. Br(Lista *l, int br) { if( l && br > 0 && l->br_elem >= br ) { Iterator. Liste il; int i; inicijalizuj. Iterator(l, &il); for( i = 0, na. Pocetak(&il); i < br-1 && ! kraj. Liste(&il); kraj. Liste(&il) i++, sledeci. Element(&il) ); ukloni. Element. Iz. Liste( l, &il ); return 1; } return 0; } Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 9

Zadatak 0 - rešenje (C: 8/16) /* uklanja zadati element iz liste */ int

Zadatak 0 - rešenje (C: 8/16) /* uklanja zadati element iz liste */ int ukloni. Element(Lista *l, Element. Liste *el) { if( ! l || !el ) return 0; else { Iterator. Liste il; inicijalizuj. Iterator(l, &il); for( na. Pocetak(&il); ! kraj. Liste(&il) && il. tekuci != el; sledeci. Element(&il) ); if( ! kraj. Liste(&il) ) { ukloni. Element. Iz. Liste(l, &il); return 1; } } return 0; } Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 10

Zadatak 0 - rešenje (C: 9/16) /* razne operacije sa listom */ int broj.

Zadatak 0 - rešenje (C: 9/16) /* razne operacije sa listom */ int broj. Elemenata(Lista *l) { if( l ) return l->br_elem; return 0; } Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 11

Zadatak 0 - rešenje (C: 10/16) /* funkcije iteratora */ void inicijalizuj. Iterator(Lista *l,

Zadatak 0 - rešenje (C: 10/16) /* funkcije iteratora */ void inicijalizuj. Iterator(Lista *l, Iterator. Liste *i) { i->lista = l; i->prethodni = i->tekuci = 0; } void na. Pocetak(Iterator. Liste *i) { i->prethodni = 0; i->tekuci = i->lista->prvi; } void sledeci. Element(Iterator. Liste *i) { i->prethodni = i->tekuci; i->tekuci = i->tekuci->sledeci; } int kraj. Liste(Iterator. Liste *i){ if( i->tekuci ) return 0; else return 1; }Elektrotehnički fakultet, Algoritmi i Strukture Podataka 1 Beograd 12

Zadatak 0 - rešenje (C: 11/16) #include "lista. h" <stdio. h> <string. h> <stdlib.

Zadatak 0 - rešenje (C: 11/16) #include "lista. h" <stdio. h> <string. h> <stdlib. h> typedef struct { char *prezime, *ime; char jmbg[14]; } Osoba; void brisi. Osobu(void *o) { Osoba *osoba = (Osoba *)o; if( osoba ) free( } }Elektrotehnički fakultet, Beograd { osoba->prezime ); osoba->ime ); osoba ); Algoritmi i Strukture Podataka 1 13

Zadatak 0 - rešenje (C: 12/16) Osoba *citaj. Osobu() { char niz[128]; Osoba *o

Zadatak 0 - rešenje (C: 12/16) Osoba *citaj. Osobu() { char niz[128]; Osoba *o = calloc(1, sizeof(Osoba) ); if( ! o ) return 0; printf("Unesite prezime osobe: "); scanf("%s", niz); o->prezime = malloc( strlen(niz)+1 ); if( ! o->prezime ) { brisi. Osobu(o); return 0; } strcpy(o->prezime, niz); 14

Zadatak 0 - rešenje (C: 13/16) printf("Unesite ime osobe: "); scanf("%s", niz); o->ime =

Zadatak 0 - rešenje (C: 13/16) printf("Unesite ime osobe: "); scanf("%s", niz); o->ime = malloc( strlen(niz)+1 ); if( ! o->ime ) { brisi. Osobu(o); return 0; } strcpy(o->ime, niz); printf("Unesite JMBG osobe: "); scanf("%s", o->jmbg); return o; } Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 15

Zadatak 0 - rešenje (C: 14/16) void main() { Lista *lista = napravi. Listu(

Zadatak 0 - rešenje (C: 14/16) void main() { Lista *lista = napravi. Listu( brisi. Osobu ); char odgovor = 'd'; Iterator. Liste il; if( ! lista ) { printf("Greska u alokaciji memorije!" "n. Program se prekida. n"); exit(0); } Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 16

Zadatak 0 - rešenje (C: 15/16) do { printf("Unesite podatke o osobi: n"); if(

Zadatak 0 - rešenje (C: 15/16) do { printf("Unesite podatke o osobi: n"); if( ! dodaj. UListu(lista, citaj. Osobu() ) ) { printf("Doslo je do greske prilikom " "dodavanja osobe u listu. Unos se prekida. n"); break; } printf("Jos? (d/n) "); scanf("n%c", &odgovor); } while( odgovor != 'n' && odgovor != 'N' ); Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 17

Zadatak 0 - rešenje (C: 16/16) printf("Uneta lista: n"); inicijalizuj. Iterator(lista, &il); for( na.

Zadatak 0 - rešenje (C: 16/16) printf("Uneta lista: n"); inicijalizuj. Iterator(lista, &il); for( na. Pocetak(&il); ! kraj. Liste(&il); sledeci. Element(&il) ) { Osoba *o = (Osoba *)il. tekuci->podatak; printf("%s %s %sn", o->prezime, o->jmbg); } obrisi. Listu(lista); } Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 18

Zadatak 0 - rešenje (Python: 1/17) # fajl lista. py – koristi se kao

Zadatak 0 - rešenje (Python: 1/17) # fajl lista. py – koristi se kao module class Element. Liste: def __init__(self, data): self. podatak = data self. sledeci = None def __repr__(self): return self. podatak Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 19

Zadatak 0 - rešenje (Python: 2/17) class Lista: def __init__(self): self. prvi = None

Zadatak 0 - rešenje (Python: 2/17) class Lista: def __init__(self): self. prvi = None self. poslednji = None self. br_elem = 0 def __repr__(self): tek = self. prvi lista_ispis = [] while tek is not None: lista_ispis. append(tek. podatak) tek = tek. sledeci lista_ispis. append("None") return " -> ". join(lista_ispis) Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 20

Zadatak 0 - rešenje (Python: 3/17) def obrisi. Listu(lista): if lista is not None:

Zadatak 0 - rešenje (Python: 3/17) def obrisi. Listu(lista): if lista is not None: isprazni. Listu(lista) del lista def isprazni. Listu(lista): if lista is not None: el = lista. prvi while (el is not None): lista. prvi = lista. prvi. sledeci del el el = lista. prvi lista. poslednji = None lista. br_elem = 0 Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 21

Zadatak 0 - rešenje (Python: 4/17) def dodaj. Na. Kraj(lista, element): if lista. poslednji

Zadatak 0 - rešenje (Python: 4/17) def dodaj. Na. Kraj(lista, element): if lista. poslednji is not None: lista. poslednji. sledeci = element else: lista. prvi = element lista. poslednji = element lista. br_elem += 1 Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 22

Zadatak 0 - rešenje (Python: 5/17) def dodaj. Na. Pocetak(lista, element): if lista. prvi

Zadatak 0 - rešenje (Python: 5/17) def dodaj. Na. Pocetak(lista, element): if lista. prvi is not None: element. sledeci = lista. prvi else: lista. poslednji = element lista. prvi = element lista. br_elem += 1 Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 23

Zadatak 0 - rešenje (Python: 6/17) def ukloni. Element(lista, element): if (lista is None)

Zadatak 0 - rešenje (Python: 6/17) def ukloni. Element(lista, element): if (lista is None) or (element is None): return 0 pret = None tek = lista. prvi while tek is not None: if tek == element: if pret is not None: pret. sledeci = tek. sledeci else: lista. prvi = tek. sledeci if lista. prvi is None: lista. poslednji = None del tek lista. br_elem -= 1 return 1 else: pret = tek. sledeci return 0 24

Zadatak 0 - rešenje (Python: 7/17) def ukloni. Element. Br(lista, br: int): if (lista

Zadatak 0 - rešenje (Python: 7/17) def ukloni. Element. Br(lista, br: int): if (lista is None) or (br < 0) or (br >= lista. br_elem): return 0 i = 0 pret = None tek = lista. prvi while i < br: tek = tek. sledeci i += 1 if pret is not None: pret. sledeci = tek. sledeci else: lista. prvi = tek. sledeci if lista. prvi is None: lista. poslednji = None del tek lista. br_elem -= 1 return 1 25

Zadatak 0 - rešenje (Python: 8/17) def dohvati(lista, br: int): if (lista is None)

Zadatak 0 - rešenje (Python: 8/17) def dohvati(lista, br: int): if (lista is None) or (br < 0) or (br >= lista. br_elem): return None i = 0 tek = lista. prvi while i < br: tek = tek. sledeci i += 1 return tek Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 26

Zadatak 0 - rešenje (Python: 9/17) def br. Elemenata(lista): if lista is not None:

Zadatak 0 - rešenje (Python: 9/17) def br. Elemenata(lista): if lista is not None: return lista. br_elem return 0 # kraj lista. py Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 27

Zadatak 0 - rešenje (Python: 10/17) # fajl main. py # importuje modul lista.

Zadatak 0 - rešenje (Python: 10/17) # fajl main. py # importuje modul lista. py radi korišćenja; # definišemo prvo funkcije koje će se koristiti import lista li = lista. Lista() def nova. Lista(): global li if li is not None: brisi. Listu() li = lista. Lista() Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 28

Zadatak 0 - rešenje (Python: 11/17) def dodaj. Element(): print("Unesite vrednost elementa: n") x

Zadatak 0 - rešenje (Python: 11/17) def dodaj. Element(): print("Unesite vrednost elementa: n") x = input() element = lista. Element. Liste(data=x) while True: print("Izaberite opciju dodavanja elementa: n" "1. Dodaj na pocetakn" "2. Dodaj na krajn") try: x = int(input()) if x < 1 or x > 2: print("Unesite ispravnu opcijun") continue except: print("Unesite ispravnu opcijun") continue if x == 1: lista. dodaj. Na. Pocetak(li, element) else: lista. dodaj. Na. Kraj(li, element) break 29

Zadatak 0 - rešenje (Python: 12/17) def obrisi. Element(): print("Unesite indeks elementa koji zelite

Zadatak 0 - rešenje (Python: 12/17) def obrisi. Element(): print("Unesite indeks elementa koji zelite da obrisete: n") try: x = int(input()) ret = lista. ukloni. Element. Br(li, x) if ret == 1: print("Uspesno ste obrisali elementn") else: print("Uneli ste nevalidan indeksn") except: print("Uneli ste nevalidan indeksn") Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 30

Zadatak 0 - rešenje (Python: 13/17) def ispisivanje. Liste(): print(li) def ispis. Br. Elem.

Zadatak 0 - rešenje (Python: 13/17) def ispisivanje. Liste(): print(li) def ispis. Br. Elem. Liste(): print(li. br_elem) def brisi. Listu(): lista. obrisi. Listu(li) Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 31

Zadatak 0 - rešenje (Python: 14/17) def ispis. Odredjenog. Elem. Liste(): print("Unesite indeks elementa

Zadatak 0 - rešenje (Python: 14/17) def ispis. Odredjenog. Elem. Liste(): print("Unesite indeks elementa koji zelite da prikazete: n") try: x = int(input()) elem = lista. dohvati(li, x) if elem is None: print("Uneli ste nevalidan indeksn") else: print(elem) except: print("Uneli ste nevalidan indeksn") Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 32

Zadatak 0 - rešenje (Python: 15/17) # glavna funkcija main. py fajla while True:

Zadatak 0 - rešenje (Python: 15/17) # glavna funkcija main. py fajla while True: print("------MENI-----n" "Izaberite opciju: n" "1. Napravi novu listun" "2. Dodaj element u listun" "3. Obrisi element iz listen" "4. Ispisi listun" "5. Ispisi broj elemenata u listin" "6. Prikazati odredjeni element iz listen" "7. Obrisi listun" "8. Kraj programan") Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 33

Zadatak 0 - rešenje (Python: 16/17) try: x = int(input()) if x < 0

Zadatak 0 - rešenje (Python: 16/17) try: x = int(input()) if x < 0 or x > 8: print("Unesite ispravnu opcijun") continue except: print("Unesite broj kao opcijun") continue Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 34

Zadatak 0 - rešenje (Python: 17/17) if x == 1: nova. Lista() elif x

Zadatak 0 - rešenje (Python: 17/17) if x == 1: nova. Lista() elif x == 2: dodaj. Element() elif x == 3: obrisi. Element() elif x == 4: ispisivanje. Liste() elif x == 5: ispis. Br. Elem. Liste() elif x == 6: ispis. Odredjenog. Elem. Liste() elif x == 7: brisi. Listu() elif x == 8: break # kraj while True petlje, ujedno i fajla main. py 35

Zadatak 1 Realizovati operaciju CONCATENATE(list 1, list 2) koja nadovezuje listu na koju pokazuje

Zadatak 1 Realizovati operaciju CONCATENATE(list 1, list 2) koja nadovezuje listu na koju pokazuje list 2 na listu na koju pokazuje list 1: a) ako su liste jednostruko ulančane, b) sa kružno ulančanim listama. Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 36

Zadatak 1 - rešenje a) CONCATENATE(list 1, list 2) if list 1 = nil

Zadatak 1 - rešenje a) CONCATENATE(list 1, list 2) if list 1 = nil then list 1 = list 2 return else if list 2 = nil then return end_if p = list 1 while (next(p) nil) do p = next(p) end_while next(p) = list 2 Elektrotehnički fakultet, Beograd p list 1 1 2 čvor 1 čvor 2 3 čvor 3 nil list 2 4 čvor 1 čvor 2 Algoritmi i Strukture Podataka 1 čvor 3 čvor 4 nil 37

Zadatak 1 - rešenje b) Spoljni pokazivač (list 1 i list 2) pokazuje na

Zadatak 1 - rešenje b) Spoljni pokazivač (list 1 i list 2) pokazuje na poslednji element liste !! CONCATENATE-C(list 1, list 2) if (list 1 = nil) then list 1 = list 2 return else if (list 2 = nil) then return end_if p = next(list 1) = next(list 2) = p list 1 = list 2 Elektrotehnički fakultet, Beograd p list 1 1 čvor 2 čvor 3 3 list 2 2 čvor 1 čvor 2 Algoritmi i Strukture Podataka 1 čvor 3 4 čvor 4 38

Zadatak 2 Realizovati operaciju INVERT(list) koja menja poredak čvorova u listi na čiji prvi

Zadatak 2 Realizovati operaciju INVERT(list) koja menja poredak čvorova u listi na čiji prvi čvor ukazuje pokazivač list, tako da prvi čvor postane poslednji, drugi pretposlednji, itd. glava čvor 1 čvor 2 čvor 3 čvor 4 nil Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 39

Zadatak 2 - rešenje INVERT(list) p = list q = nil while (p nil)

Zadatak 2 - rešenje INVERT(list) p = list q = nil while (p nil) do r=q q=p p = next(p) next(q) = r end_while list = q Elektrotehnički fakultet, Beograd 5 čvor l 2 čvor m 1 čvor n 1 4 3 r Algoritmi i Strukture Podataka 1 q p 40

Zadatak 3 Neka su dva skupa predstavljena uređenim jednostruko ulančanim listama sa zaglavljima na

Zadatak 3 Neka su dva skupa predstavljena uređenim jednostruko ulančanim listama sa zaglavljima na koja ukazuju pokazivači A i B. Realizovati funkciju koja vraća pokazivač na zaglavlje liste koja predstavlja presek ova dva skupa. Zaglavlje: specifičan čvor na početku liste, čiji informacioni deo sadrži informacije o samoj listi (koliko čvorova, itd) glava zaglavlje čvor 1 čvor 2 čvor 3 nil Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 41

Zadatak 3 - rešenje INTERSECTION(A, B) r = c = GETNODE a = next(A)

Zadatak 3 - rešenje INTERSECTION(A, B) r = c = GETNODE a = next(A) b = next(B) while (a nil) and (b nil) do if (info(a) = info(b)) then next(c) = GETNODE c = next(c) info(c) = info(a) a = next(a) b = next(b) else if (info(a) < info(b)) then a = next(a) else b = next(b) end_if end_while return r Elektrotehnički fakultet, Beograd Rezultujuća lista obavezno mora da bude istog tipa kao i liste A i B (sa zaglavljem) r c 2 zaglavlje čvor 1 1 Algoritmi i Strukture Podataka 1 3 4 6 čvor 2 čvor 3 5 nil 42

Zadatak 4 Neka su dva polinoma sa jednom nezavisnom promenljivom predstavljena uređenim jednostruko ulančanim

Zadatak 4 Neka su dva polinoma sa jednom nezavisnom promenljivom predstavljena uređenim jednostruko ulančanim kružnim listama sa zaglavljima na koja ukazuju pokazivači p 1 i p 2. Realizovati funkciju koja vraća pokazivač na zaglavlje liste koja predstavlja zbir ova dva polinoma. Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 43

Zadatak 4 - rešenje POLY-ADD(p 1, p 2) r = GETNODE next(r) = r

Zadatak 4 - rešenje POLY-ADD(p 1, p 2) r = GETNODE next(r) = r exp(r) = -1 t=r p = next(p 1) q = next(p 2) Elektrotehnički fakultet, Beograd while (p p 1) or (q p 2) do if (exp(p) = exp(q)) then if (c(p) + c(q) 0) then INSERT-AFTER(r, t, c(p)+c(q), exp(p)) t = next(t) end_if p = next(p) q = next(q) else if (exp(p) < exp(q)) then INSERT-AFTER(r, t, c(q), exp(q)) q = next(q) t = next(t) else INSERT-AFTER(r, t, c(p), exp(p)) p = next(p) t = next(t) end_if end_while return r Algoritmi i Strukture Podataka 1 44

Zadatak 4 - rešenje INSERT-AFTER(list, n, c, e) q = GETNODE next(q) = next(n)

Zadatak 4 - rešenje INSERT-AFTER(list, n, c, e) q = GETNODE next(q) = next(n) = q c(q) = c exp(q) = e Funkcija za umetanje novog elementa kružne liste: - n : čvor iza kojeg se vrši umetanje - c : koeficijent pridružen čvoru - e : eksponent čvor m čvor n čvor p čvor q if ( list = n ) then list = q return Samo u slučaju kada zaglavlje nije poseban član liste! list čvor m Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 čvor n čvor q 45

Zadatak 5 Napisati operacije inicijalizacije liste slobodnih ulaza, alokacije i dealokacije čvora u slučaju

Zadatak 5 Napisati operacije inicijalizacije liste slobodnih ulaza, alokacije i dealokacije čvora u slučaju vektorske implementacije ulančanih lista. Vektorska implementacija: umesto pokazivača, pamte se indeksi u vektoru čvorova 2 indeks 1 3 2 Elektrotehnički fakultet, Beograd 4 3 5 4 6 5 Algoritmi i Strukture Podataka 1 7 6 . . . 0 n 46

Zadatak 5 - rešenje INIT avail = 1 for i = 1 to n

Zadatak 5 - rešenje INIT avail = 1 for i = 1 to n – 1 do L[i]. next = i +1 end_for L[n]. next = 0 2 1 Elektrotehnički fakultet, Beograd 3 2 4 3 0 4 avail X GETNODE if (avail = 0) then ERROR(Nema prostora) end_if p = avail = L[avail]. next return p FREENODE(p) L[p]. next = avail = p avail 2 1 Y 3 2 Z 0 3 0 4 FREENODE(2) avail 2 X 1 . . . 4 2 Z 0 3 0 4 FREENODE(3) avail X 1 0 Algoritmi i Strukture Podataka 1 . . . 2 4 . . . 3 2 0 4 47

Zadatak 6 – za samostalnu vežbu Kako se mogu implementirati ulančane strukture na jezicima

Zadatak 6 – za samostalnu vežbu Kako se mogu implementirati ulančane strukture na jezicima koji ne podržavaju pokazivače? Na primeru uređene jednostruko ulančane kružne liste celih brojeva, prikazati stanje strukture podataka u svakom koraku ukoliko se izvrši sledeća sekvenca operacija – umetanje elemenata 4, 3, 1, 8, 15, 7, brisanje elemenata 1, 3 i umetanje elemenata 2, 14. Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 48

Zadatak 6 – za samostalnu vežbu - rešenje početno stanje avail [=1] 2 3

Zadatak 6 – za samostalnu vežbu - rešenje početno stanje avail [=1] 2 3 1 4 2 3 5 4 6 5 7 6 8 7 0 8 umetanje 4 avail [=2] list 4 1 3 1 2 4 3 5 4 6 5 7 6 8 7 0 8 umetanje 3 avail [=3] list 4 2 1 3 1 2 4 3 5 4 6 5 7 6 8 7 0 8 Napomena: avail je pokazivač na slobodnu memoriju, list pokazivač na poslednji element liste („spoljašnji“ pokazivač) Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 49

Zadatak 6 – za samostalnu vežbu - rešenje umetanje 1, 8, 15, 7 avail

Zadatak 6 – za samostalnu vežbu - rešenje umetanje 1, 8, 15, 7 avail [=7] list 4 2 3 1 3 2 1 4 8 3 5 4 15 6 7 5 1 6 8 7 0 8 brisanje 1 avail [=3] 4 2 1 3 4 2 7 list 8 3 5 4 15 6 7 5 1 6 8 7 0 8 brisanje 3 avail [=2] 4 4 1 list 3 2 7 3 8 5 4 15 6 7 5 1 6 8 7 0 8 Napomena: avail je pokazivač na slobodnu memoriju, list pokazivač na poslednji element liste („spoljašnji“ pokazivač) Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 50

Zadatak 6 – za samostalnu vežbu - rešenje umetanje 2 list 4 4 2

Zadatak 6 – za samostalnu vežbu - rešenje umetanje 2 list 4 4 2 1 avail [=3] 1 2 7 8 3 5 4 15 6 7 5 2 6 8 7 0 8 umetanje 14 avail [=7] list 4 4 1 2 3 2 14 1 3 8 5 4 15 6 7 5 2 6 8 7 0 8 Napomena: avail je pokazivač na slobodnu memoriju, list pokazivač na poslednji element liste („spoljašnji“ pokazivač) Elektrotehnički fakultet, Beograd Algoritmi i Strukture Podataka 1 51