You are on page 1of 5

Multidicionar ordonat (MDO)

Multidicionar = o cheie are mai multe valori asociate (o list de valori asociate) Multidicionar ordonat = cheile sunt ntr -o anumit relaie de ordine R i sunt memorate n ordine Problem: S se implementeze TAD Multidicionar ordonat (MDO) reprezentare nlnuit cu alocare dinamic. Operaii: creeaza (mdo, R) pre: R relatie pe multimea cheilor post: mdo MDO, mdo distruge(mdo) pre: mdo MDO post:mdo a fost distrusa (spatiul alocat a fost eliberat) adauga(mdo, c, v) pre: mdo MDO, c TCheie, v TValoare post: perechea <c,v> a fost adaugata in mdo sterge(mdo, c, v) pre: mdo MDO, c TCheie, v TValoare post: perechea <c,v> a fost stearsa din mdo cauta(mdo, c, l) pre: mdo MDO, c TCheie
l L,

post:

true si l este lista valorilor asociate cu c, daca c este cheie in mdo fals si l , altfel

iterator(mdo, i) pre: mdo MDO post: i I , i este iterator pe mdo

Alte operatii posibile: multimeaCheilor(mdo, m) pre: mdo MDO post: m M , m este multimea tuturor cheilor din mdo

multimeaValorilor(mdo, m) pre: mdo MDO post: m M , m este multimea tuturor valorilor din mdo

Reprezentare: MDO: prim: NodT R: relaie NodT: urm: NodT e: Telement TElement: c: TCheie l : TLista Iterator MDO: mdo: MDO curent: NodT itL: IteratorList Operaii iterator: Subalgoritm creeaza (it, mdo): { (1) } it.mdo mdo it.curent [it.mdo].prim Daca it.curent NIL atunci iterator ([it.mdo.prim].e.l, it.itL) SfDaca SfSubalgoritm Functia valid(it): { (1) } valid it.curent NIL SfSubalgoritm Subalgoritm element(it, e): {e = <c,v>} { (1) } e.c [it.curent].e.c element (it.itL, e.v) SfSubalgoritm Subalgoritm urmator (it): { (1) } urmator(it.itL) Daca valid(it.itL) atunci it.curent [it.curent].urm

Daca it.curent NIL atunci iterator ([it.curent].e.l, it.itL) SfDaca SfDaca SfSubalgoritm Operatii multidictionar ordonat: La complexitati: - n nr de chei distinct - mdo nr total de elemente Subalgoritm creeaza(mdo, R): { (1) } mdo.R R mdo.prim NIL SfSubalgoritm Subalgoritm distruge(mdo): { (mdo)} CatTimp mdo.prim NIL executa p mdo.prim distruge ([p].e.l) mdo.prim [mdo.prim].urm dealoca(p) SfCatTimp SfSubalgoritm Subalgoritm cauta (mdo, c, l): { (n)} p mdo.prim gasit fals CatTimp p NIL si gasit executa Daca [p].e.c = c atunci gasit adevarat altfel p [p].urm SfDaca SfCatTimp Daca gasit atunci l [p].e.l altfel creeaza (l) SfDaca SfSubalgoritm Functia cautNod (mdo, c): {(n)} p mdo.prim gasit fals

CatTimp p NIL si gasit executa Daca [p].e.c = c atunci gasit adevarat altfel p [p].urm SfDaca SfCatTimp Daca gasit atunci cautNod p altfel cautNod NIL SfDaca SfFunctia Subalgoritm adauga (mdo, c, v): {(n)} p cautNod (mdo, c) Daca p = NIL atunci adaugaCheieNoua (mdo, c, v) altfel adaugaSfarsit([p].e.l, v) SfDaca SfSubalgoritm Subalgoritm adaugaCheieNoua(mdo, c,v): {(n)} Daca mdo.prim = NIL atunci aloca (mdo.prim) [mdo.prim].e.c c creeaza ([mdo.prim].e.l) adaugaSfarsit([mdo.prim].e.l, v) altfel aloca (q) [q].e.c c creeaza ([q].e.l) adaugaSfarsit([q].e.l, v) p mdo.prim Daca mdo.R(c, [p].e.c) atunci {inseram inainte de primul nod} [q].urm p mdo.prim q altfel CatTimp ([p].urm NIL si mdo.R(c, [[p].urm].e.c)) executa p [p].urm SfCatTimp {am gasit pozitia (nodul p) dupa care inseram} [q].urm [p].urm [p].urm q SfDaca

SfDaca SfSubalgoritm Subalgoritm sterge (mdo, c, v): {(n)} p cautNod (mdo, c) Daca p NIL atunci pos pozitie ([p].e.l, v) Daca pos atunci sterge ([p].e.l, pos, e) SfDaca Daca vida ([p].e.l) atunci stergCheie (mdo, c) SfDaca SfDaca SfSubalgoritm Subalgoritm stergCheie (mdo, c): {(n)} Daca [mdo.prim].e.c = c atunci p mdo.prim mdo.prim [mdo.prim].urm dealoca (p) altfel p mdo.prim CatTimp [p].urm NIL si [[p].urm].e.c c executa p [p].urm SfCatTimp q [p].urm [p].urm [q].urm dealoca (q) SfDaca SfSubalgoritm

You might also like