next up previous contents
Next: Problema propusa Up: Problema rezolvata Previous: Sursa programului   Cuprins


Comentarea programului

Problema cere tiparirea persoanelor din evidenta, ordonate dupa trei criterii: ordonate dupa nume (comanda n), ordonate descrescator dupa vârsta (comanda v) si ordonate crescator dupa vârsta (comanda p). Din acest motiv, implementam evidenta printr-o lista multiplu înlantuita (fiecare nod fiind atasat unei persoane), iar criteriile de înlantuire a nodurilor corespunzând celor trei moduri de afisare cerute.

Programul este împartit pe trei fisiere. tip.h defineste tipul nodurilor din lista si declara operatorii pentru prelucrarea tipului abstract, lista.c defineste tipul abstract lista multiplu înlantuita, iar main.c defineste rutina pentru interfata cu utilizatorul si functia main.

Nodurile listei cuprind urmatoarele câmpuri:

Datorita înlantuirilor multiple, fiecare nod apare înlantuit în listele atasate celor trei criterii de ordonare. Variabilele inc1, inc2 si inc3 (din fisierul lista.c) indica spre începuturile listelor ordonate alfabetic, crescator dupa vârsta si, respectiv, descrescator dupa vârsta. Functia cauta parcurge lista ordonata alfabetic (folosind câmpul alf) si cauta persoana cu numele egal cu parametrul n. Daca un astfel de nod exista, atunci cauta returneaza pointerul la el, altfel NULL.

Când introducem un nod nou, el trebuie înlantuit dupa fiecare din cele trei criterii. Functia intr1 introduce nodul referit prin parametrul l în lista indicata de parametrul p, astfel încât lista sa ramâna ordonata alfabetic. Functia returneaza pointerul catre începutul listei rezultate. În mod asemanator, intr2 si intr3 înlantuie nodul indicat de l dupa criteriile ordonat crescator si descrescator dupa vârsta. Operatorul pentru introducerea unui nod nou în lista multiplu înlantuita este introdu. El are trei parametri, char *n pentru numele, char *lm pentru locul de munca si int v pentru vârsta nodului nou. introdu începe prin a verifica daca în evidenta apare deja o persoana cu numele n. În caz afirmativ se actualizeaza câmpurile loc_munca si varsta cu noile valori. În urma acestor modificari, pozitiile nodului în listele ordonate crescator si descrescator dupa vârsta se schimba. De aceea, scoatem nodul din pozitiile anterioare si îl reintroducem conform noilor câmpuri. Daca persoana nu apare în evidenta, atunci se creeaza un nod nou, se initializeaza câmpurile lui, apoi nodul este înlantuit dupa cele trei criterii de ordonare.

În mod asemanator, daca un nod trebuie eliminat din evidenta, el este scos din toate cele trei înlantuiri. scot1 elimina nodul din înlantuirea alf (cea ordonata alfabetic dupa nume), scot2 scoate nodul din înlantuirea dupa varcr (ordonata crescator dupa vârsta) si scot3 elimina nodul din înlantuirea dupa vardes (ordonata descrescator dupa vârsta). Operatorul (elimin) pentru stergerea persoanei cu numele dat de parametrul char *s apeleaza scot1, scot2 si scot3, dupa care elibereaza memoria ocupata de nodul sters. Pentru aceasta, foloseste variabila globala auxp pe care o pozitioneaza functia scot3.

afis_alf este operatorul pentru afisarea persoanelor ordonate dupa nume. afis_des tipareste persoanele ordonate descrescator dupa vârsta. afis_varsta parcurge lista ordonata crescator dupa vârsta si afiseaza persoanele care au câmpul varsta mai mare ca si parametrul int v.

afis_loc_munca tipareste ordonat alfabetic persoanele cu locul de munca dat de parametrul char *lm.

elimin_loc_munca scoate din evidenta toate persoanele cu locul de munca egal cu parametrul char *s. Rutina parcurge lista ordonata alfabetic si elimina persoanele apelând elimin.

Rutina meniu afiseaza meniul programului si functie de comanda selectata se apeleaza operatorul tipului abstract ce implementeaza functionalitatea dorita.


next up previous contents
Next: Problema propusa Up: Problema rezolvata Previous: Sursa programului   Cuprins
Cristian Gavrila 2001-10-02