L10a

3
 Structuri de Date L A B O R A T O R 10a  Arbori XML  1. Sa se defineasca un tip "Node" pentru un nod de arbore XML in reprezentarea cu ector de pointeri !a fii ector e#tins cu 1 !a fiecare adau$are a unui fiu %a&puri'  ( a! )c*ar+,' adresa ta$ sau te#t ( nc )s*ort,' nu&ar de fii  ( -ids )Node++,' adresa ector de pointeri !a fii  ( parent )Node+, ' adresa nod parinte  Sa se scrie si sa se erifice ur&atoare!e functii'  ( Node+ &a-e ) c*ar+ , // creare nod frunza cu a!oarea  ( oid add%*i!d )Node+ p Node+ f, // adau$a nodu! f ca fiu a! nodu!ui p  ( oid print )Node+ r int n, // afisare arbore cu rad. r cu indentare n  ( int size )Node+ r, // nu&ar de noduri in arbore!e cu radacina r  #e&p!u de pro$ra& pentru erificarea functii!or anterioare' int &ain),  Node+ r +p +2  r3 &a-e )"4preturi5",  add%*i!d )r )p3&a-e)"4produs5",,,  add%*i!d )p &a-e)"cafea",,  add%*i!d )p 23&a-e)"4fir&a5",,  add%*i!d )2 &a-e)"!ite",,  add%*i!d )p 23&a-e)"4pret5",,  add%*i!d )2 &a-e)"10",,  add%*i!d )r )p3&a-e)"4produs5",,,  add%*i!d )p &a-e)"ceai",,  add%*i!d )p 23&a-e)"4fir&a5",,  add%*i!d )2 &a-e)"Lipton",,  add%*i!d )p 23&a-e)"4pret5",,  add%*i!d )2 &a-e)"6",,  print )r0, // afisare arbore  printf )"7d noduri8n" size)r,,  $etc*ar), 9  :. Sa se scrie si sa se erifice o functie parser XML care construieste un arbore XML pe baza unui te#t ce contine un docu&ent XML'  Node+ parse )c*ar+ #&!, // rezu!tat 3 radacina arbore #&! A!$orit& fo!osit'  creare nod radacina r cu pri&u! ta$ crt3r // pozitie curenta in arbore  repeta cat ti&p nu e sfarsit de te#t  e#tra$e ur&atoru! si&bo! in to-en  daca to-en este &arca; de inceput atunci  creare nod "nou" cu a!oare &arca;

description

09

Transcript of L10a

Structuri de Date

L A B O R A T O R 10a

Arbori XML

1. Sa se defineasca un tip "Node" pentru un nod de arbore XML in reprezentareacu vector de pointeri la fii, vector extins cu 1 la fiecare adaugare a unui fiuCampuri: - val (char*): adresa tag sau text - nc (short): numar de fii - kids (Node**): adresa vector de pointeri la fii - parent (Node*) : adresa nod parinte Sa se scrie si sa se verifice urmatoarele functii: - Node* make ( char* v); // creare nod frunza cu valoarea v - void addChild (Node* p, Node* f); // adauga nodul f ca fiu al nodului p - void print (Node* r, int n);// afisare arbore cu rad. r, cu indentare n - int size (Node* r);// numar de noduri in arborele cu radacina r

Exemplu de program pentru verificarea functiilor anterioare:

int main() { Node* r, *p, *q; r= make (""); addChild (r, (p=make(""))); addChild (p, make("cafea")); addChild (p, q=make("")); addChild (q, make("Elite")); addChild (p, q=make("")); addChild (q, make("10")); addChild (r, (p=make(""))); addChild (p, make("ceai")); addChild (p, q=make("")); addChild (q, make("Lipton")); addChild (p, q=make("")); addChild (q, make("7")); print (r,0);// afisare arbore printf ("%d noduri\n", size(r)); getchar();}

2. Sa se scrie si sa se verifice o functie parser XML care construieste unarbore XML pe baza unui text ce contine un document XML: Node* parse (char* xml); // rezultat = radacina arbore xml

Algoritm folosit: creare nod radacina r cu primul tag crt=r// pozitie curenta in arbore repeta cat timp nu e sfarsit de text { extrage urmatorul simbol in token daca token este marcaj de inceput atunci { creare nod "nou" cu valoare marcaj adauga la crt pe nou crt=nou // coboara un nivel } daca token este marcaj de sfarsit atunci crt = parent(crt)// urca un nivel, la nod parinte daca token este text atunci { creare nod "nou" cu text adauga la crt pe nou // ramane pe acelasi nivel } } return r; Functia urmatoare extrage urmatorul atom XML dintr-un text XML; are ca rezultat adresa urmatoare din textul XML sau zero (NULL) la sfarsit de text.Atomii se depun la adresa t si pot fi deosebiti dupa primele caractere:orice marcaj incepe cu ''); tl=(p2+1)-p1; strncpy(t,p1,tl); t[tl]=0; return p2+1;}

In functia "main" se va citi un fisier XML, se va crea si afisa arborele XML, numarul de noduri si inaltimea arborelui. Exemplu de fisier:

cafea Elite 10 ceai Lipton 7

3. Sa se scrie o functie care verifica daca un sir s contine numai spatii:

int spaces(char* s); // 1= numai spatii, 0= alte caractere

Se va folosi functia "isspace" declarata in Sa se modifice functia "parse" pentru a nu crea noduri cu spatii albe si sa se afiseze numarul de noduri din arbore.

4. Sa se modifice functia "parse" (pentru construire arbore XML) astfel casa foloseasca varianta urmatoare a functiei "next":

char* next (char * & s) { // rezultat adresa token urmator char t[100], *p1, *p2; int tl;// tl=tag length p1=strchr(s,''); tl=(p2+1)-p1; strncpy(t,p1,tl); t[tl]=0; s= p2+1; } return strdup(t); // adresa diferita pentru fiecare token}

5. Sa se scrie o functie pentru serializarea continutului unui arbore XMLintr-un fisier XML cu cate o linie pentru fiecare marcaj sau text si cuindentare de 3 spatii la schimbare nivel. Sa se verifice prin serializareaarborelui creat la pct.1 (se adauga functiei "main" date apelul functiei deserializare). Serializarea este o varianta de afisare prefixata cu indentare, care adaugaun marcaj de terminare dupa afisarea subarborelui marcajului de inceput.