Sunteți pe pagina 1din 2

Structuri de Date L A B O R A T O R 13b

Arbori binari de cautare 1. Sa se defineasca un nod de arbore binar folosit ca dictionar cu chei si valori numere intregi si tipul Map pentru un dictionar arbore binar. Sa se scrie urmatoarele functii pentru operatii cu un dictionar realizat ca arbore binar de cautare: void init (Map & d); // initializare dictionar void put (Map & d,int k,int v); // pune in dictionar cheia k si valoarea v int get (Map d,int k); void print (Map d); int size (Map d); // scoate din d valoarea asociata cheii k // afisare dictionar ca secventa de perechi k:v // dimensiune dictionar

Obs: - Afisarea arborelui se face infixat (stanga-radacina-dreapta) - Functia "get" are rezultat -1 daca cheia k nu este in dictionar - Functia "put" cauta cheia k in arbore; daca o gaseste atunci inlocuieste valoarea asociata ei cu v, daca nu o gaseste atunci adauga un nod cu perechea (k ,v). - Se pot defini functii auxiliare pentru cautare si adaugare in arbore binar Sa se verifice functiile anterioare cu urmatorul program: int main () { int n=32; Map d; init(d); srand(7); for (int i=0;i<n;i++) put (d, rand()%1000,rand()%1000); print (d); printf("\nsize=%d\n", size(d)); system("pause"); } 2. Sa se modifice functiile put, get si print pentru cazul cand cheile sunt siruri de caractere. Sa se verifice cu programul urmator: int main () { char* w[]={"c","a","d","b","d","c","d","b","d","c"}; int n=sizeof(w)/sizeof(char*); // nr de cuvinte int i,nr; // nr de aparitii Map d; // dictionar de cuvinte init (d); for (i=0;i<n;i++){ // pentru fiecare cuvant nr=get (d,w[i]); // numar de aparitii if ( nr < 0) // daca acest cuvant nu exista in dictionar put (d,w[i],1); // este prima aparitie else // daca acest cuvant exista in dictionar put (d,w[i],nr+1); // mareste numarul de aparitii } print (d); system("pause"); }

Rezultate: a:1, b:2, c:3, d:4 3. Un dictionar cu valori multiple este un dictionar in care fiecare cheie are asociata o multime de valori si nu o singura valoare. O aplicatie care foloseste un dictionar cu valori multiple este crearea unei liste de referinte incrucisate, in care cheile sunt cuvinte distincte dintr-un fisier text, iar valorile asociate unei chei sunt numerele liniilor in care apare cuvantul respectiv (cuvintele sunt separate prin spatii albe). Exemplu de fisier: unu patru doi trei unu doi patru patru unu Rezultate afisate (infixat): doi 2,4 patru 2,4,5 trei 3 unu 1,3,5 Operatii asupra dictionarului, necesare in aplicatie: void init (Map & d); // initializare dictionar void put (Map & d, char* k, int v); // pune pereche cuvant-nr linie void print (Map d); // afisare dictionar infixat (o linie ptr fiecare cuvan t) Sa se modifice dictionarul arbore de cautare cu valori unice astfel ca fiecare nod sa contina o cheie, numarul de valori si un vector de valori. Functia "put" cauta cuvantul k in arbore; daca il gaseste atunci adauga v la vectorul din acel nod, iar daca nu il gaseste creeaza si adauga un nod nou avand un vector cu valoarea v. Sa se verifice cu programul urmator si cu fisierul "words" dat ca exemplu: int main () { char *w,lin[256]; // w= adresa cuvint int nl=0; // nl= nr de linie Map d; // lista de cuvine init (d); FILE* f =fopen("words","r"); while (fgets (lin,256,f) != NULL) { nl++; // creste nr de linie w=strtok(lin," \n"); // extrage primul cuvant din linie while (w != NULL) { // repete pentru fiecare cuvant dintr-o linie put (d,strdup(w),nl); // pune in dictionar nr de linie w=strtok(0," \n"); // extrage urmatorul cuvant din linie } } print (d); // afisare dictionar getchar(); }

S-ar putea să vă placă și