130 likes | 270 Views
DINAMIČNE TABELE. POMNILNIK. Fizični naslovi. Logični naslovi.
E N D
DINAMIČNE TABELE POMNILNIK Fizični naslovi Logični naslovi Dinamične podatkovne strukture (tabele) med izvajanjem programa spreminjajo zasedenost pomnilnika; naraščajo oz. se krčijo (zasegajo in sproščajo pomnilnik). Program uporablja samo toliko pomnilniškega prostora, kot ga v resnici potrebuje. Dinamične tabele realiziramo kot množice podatkovnih elementov, ki so med seboj povezane s pomočjo kazalcev. Posamezni elementi se ustvarjajo in brišejo med izvajanjem programa; spreminjamo pa lahko tudi njihove povezave. Z uporabo kazalcev lahko tvorimo abstraktne dinamične podatkovne strukture kot so seznami (enosmerni, dvosmerni), vrste, skladi, drevesa in grafi. SEZNAM Seznam je zaporedje nič ali več elementov: a1, a2, a3, … an. Pri tem je a1 prvi element seznama in an zadnji element. Elementi seznama niso urejeni po velikosti ali kako drugače. Posamezni elementi seznama se lahko večkrat ponavljajo. Predpisan jim je le vrstni red, kako si sledijo. Elementi seznama vsebujejo vsaj dve komponenti: element in kazalec na naslednji element v seznamu. Vsebina Zaslon
DINAMIČNE TABELE POMNILNIK Fizični naslovi Logični naslovi Definicija strukture za enosmerni seznam celih števil: struct element_seznama { int st; //element element_seznama * nasl; //kazalec na naslednji element }; element_seznama * zacetek; //kazalec na začetek seznama Na začetku izvajanja programa elementi seznama števil še ne obstajajo. Kazalec “zacetek“ ima nedefinirano vrednost; pomnilniški prostor za elemente pa je potrebno najprej ustvariti. Za to uporabimo operator new: element_seznama * el; //deklaracija kazalca el = new(element_seznama); //zaseganje pomnilniškega prostora el->st = 50; //določitev vrednosti elementa el->nasl = NULL; //kazalec iz tega elementa kaže na NULL zacetek = el; //kazalec zacetek bo kazal na ta element Vsebina 0x0012ffa4 0x0012ff40 el el->nasl NULL el->st 50 0x0012ff40 Zaslon element_seznama st nasl zacetek NULL 50 *
ENOSMERNI SEZNAM POMNILNIK Fizični naslovi Logični naslovi • Enosmerni seznam vsebuje vrednosti komponent elementa in kazalec na naslednji element v seznamu. • Osnovne operacije nad enosmernim seznamom so: • dodajanje elementa na začetek seznama • dodajanje novega elementa na konec • vstavljanje v seznam pred ali za podanim elementom • brisanje elementa iz seznama, … Vsebina 0x0012ffa4 0x0012ff40 zacetek 0x0012fa36 a1.nasl 0x0012ff40 50 a1.st a1 a2 a3 NULL a3.nasl st nasl st nasl st nasl zacetek NULL 50 * 110 * 32 * 0x0012fc42 32 a3.st a2.nasl 0x0012fc42 0x0012fa36 110 a2.st Zaslon
ENOSMERNI SEZNAM POMNILNIK Fizični naslovi Logični naslovi Dodajanje novega elementa na začetek seznama: Vsebina a1 a2 a3 0x0012ffa4 0x0012ff40 zacetek st nasl st nasl st nasl zacetek NULL 50 * 110 * 32 * 0x0012fa36 a1.nasl 0x0012ff40 50 a1.st a0 st nasl NULL a3.nasl 99 * 0x0012fc42 32 a3.st a0.nasl 0x0012fb20 99 a0.st a2.nasl 0x0012fc42 0x0012fa36 110 a2.st Zaslon
ENOSMERNI SEZNAM POMNILNIK Fizični naslovi Logični naslovi Dodajanje novega elementa na začetek seznama: Vsebina a1 a2 a3 0x0012ffa4 0x0012fb20 zacetek st nasl st nasl st nasl NULL 50 * 110 * 32 * 0x0012fa36 a1.nasl zacetek 0x0012ff40 50 a1.st a0 st nasl NULL a3.nasl 99 * 0x0012fc42 32 a3.st 0x0012ff40 a0.nasl int vstavi_zacetek(int podatek) { element_seznama * el; el = new(element_seznama); el->st = podatek; el->nasl = zacetek; zacetek = el; return (1); } 0x0012fb20 99 a0.st a2.nasl 0x0012fc42 0x0012fa36 110 a2.st Zaslon
ENOSMERNI SEZNAM POMNILNIK Fizični naslovi Logični naslovi Dodajanje novega elementa na konec seznama: Vsebina a1 a2 a3 0x0012ffa4 0x0012ff40 zacetek st nasl st nasl st nasl zacetek NULL 50 * 110 * 32 * 0x0012fa36 a1.nasl 0x0012ff40 50 a1.st a4 st nasl NULL a3.nasl 99 * 0x0012fc42 32 a3.st a4.nasl 0x0012fb20 99 a4.st a2.nasl 0x0012fc42 0x0012fa36 110 a2.st Zaslon
ENOSMERNI SEZNAM POMNILNIK Fizični naslovi Logični naslovi Dodajanje novega elementa na konec seznama: Vsebina a1 a2 a3 0x0012ffa4 0x0012ff40 zacetek st nasl st nasl st nasl zacetek 50 * 110 * 32 * 0x0012fa36 a1.nasl 0x0012ff40 50 a1.st int vstavi_konec(int podatek) { element_seznama * el; element_seznama * seznam; el = new(element_seznama); el->st = podatek; el->nasl = NULL; if(zacetek == NULL) { zacetek = el; } else { seznam = zacetek; while(seznam->nasl != NULL) seznam = seznam->nasl; seznam->nasl = el; } return (1); } a4 st nasl NULL 0x0012fb20 a3.nasl 99 * 0x0012fc42 32 a3.st NULL a4.nasl 0x0012fb20 99 a4.st a2.nasl 0x0012fc42 0x0012fa36 110 a2.st Zaslon
ENOSMERNI SEZNAM POMNILNIK Fizični naslovi Logični naslovi Vstavljanje v seznam pred ali za podanim elementom: Vsebina a1 a2 a3 0x0012ffa4 0x0012ff40 zacetek st nasl st nasl st nasl zacetek NULL 50 * 110 * 32 * 0x0012fa36 a1.nasl 0x0012ff40 50 a1.st a4 st nasl NULL a3.nasl 99 * 0x0012fc42 32 a3.st a4.nasl 0x0012fb20 99 a4.st a2.nasl 0x0012fc42 0x0012fa36 110 a2.st Zaslon
ENOSMERNI SEZNAM POMNILNIK Fizični naslovi Logični naslovi Vstavljanje v seznam pred ali za podanim elementom: Vsebina a1 a2 a3 0x0012ffa4 0x0012ff40 zacetek st nasl st nasl st nasl zacetek NULL 50 * 110 * 32 * 0x0012fa36 a1.nasl 0x0012ff40 50 a1.st a4 st nasl NULL a3.nasl 99 * 0x0012fc42 32 a3.st 0x0012fc42 a4.nasl 0x0012fb20 99 a4.st a2.nasl 0x0012fb20 0x0012fa36 110 a2.st Zaslon
ENOSMERNI SEZNAM POMNILNIK Fizični naslovi Logični naslovi Brisanje elementa iz seznama: Vsebina 0x0012ffa4 0x0012ff40 zacetek a1 a2 a3 st nasl st nasl st nasl zacetek NULL 0x0012fa36 a1.nasl 50 * 110 * 32 * 0x0012ff40 50 a1.st NULL a3.nasl 0x0012fc42 32 a3.st a2.nasl 0x0012fc42 0x0012fa36 110 a2.st Zaslon
ENOSMERNI SEZNAM POMNILNIK Fizični naslovi Logični naslovi Brisanje elementa iz seznama: Vsebina (delete) 0x0012ffa4 0x0012ff40 zacetek a1 a2 a3 st nasl st nasl st nasl zacetek NULL 0x0012fc42 a1.nasl 50 * 110 * 32 * 0x0012ff40 50 a1.st Pogosto je naloga obdelati vse elemente v seznamu. Za to je potreben sprehod po seznamu. Obhod elementov naredimo takole: NULL a3.nasl 0x0012fc42 32 a3.st int obdelavaSeznama( ) { element_seznama * seznam; seznam = zacetek; while(seznam != NULL) { //obdelava elementov seznam = seznam->nasl; } return (1); } Zaslon
DVOSMERNI SEZNAM POMNILNIK Fizični naslovi Logični naslovi Dvosmerni seznam vsebuje vrednosti komponent elementa in kazalec na naslednji element ter kazalec na prejšnji element v seznamu. Definicija strukture: struct element_seznama { int st; //element element_seznama * nasl; //kazalec na naslednji element element_seznama * pred; //kazalec na prejšnji element }; element_seznama * zacetek = NULL; //kazalec na začetek element_seznama * konec = NULL; //kazalec na konec Vsebina 0x0012ffa4 0x0012ff40 zacetek 0x0012ffa0 0x0012fc42 konec NULL a1.pred 0x0012fa36 a1.nasl 0x0012ff40 50 a1.st 0x0012fa36 a3.pred NULL a3.nasl 0x0012fc42 32 a3.st 0x0012ff40 a2.pred zacetek konec a2.nasl 0x0012fc42 a1 a2 a3 0x0012fa36 110 a2.st pred st nasl pred st nasl pred st nasl NULL * 50 * * 110 * * 32 * NULL Zaslon
SKLAD POMNILNIK Fizični naslovi Logični naslovi Sklad je podatkovna struktura, ki si jo najlaže predstavljamo s skladom knjig. Novo knjigo vedno dodamo na vrh sklada in ko jemljemo knjige s sklada, jih vedno jemljemo z vrha. Na vrh sklada kaže kazalec sklada. Če na skladu ni nobenega elementa, potem ima kazalec sklada vrednost NULL (ne kaže nikamor). struct elem { int st; elem * predhodnik; }; elem * vrh_sklada = NULL; void vstavi(int podatek) //operacija vstavi (push) { elem * el = new(elem); el->st = podatek; el->predhodnik = vrh_sklada; vrh_sklada = el; } void vzami(int & r_st) //operacija vzami (pop) { elem * el_odstrani = vrh_sklada; r_st = el_odstrani->st; vrh_sklada = vrh_sklada->predhodnik; delete el_odstrani; } NALOGA: Napiši funkcijo main(), ki bo implementirala sklad. Vsebina Zaslon