Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- typedef struct nod_lista {
- char *nume;
- char *loc_munca;
- int virsta;
- struct nod_lista *alf; /* înlănţuirea în ordine alfabetică */
- struct nod_lista *vircr; /* înlănţuirea în ordinea crescătoarea a vârstei */
- struct nod_lista *virdes; /* înlănţuirea în ordinea descrescătoarea a vârstei */
- } nod;
- nod *inc1 =NULL, *inc2 =NULL, *inc3=NULL ;
- static nod *auxp; /* variabilă auxiliară folosită la eliminarea unui nod */
- /* operaţiile asupra listei */
- nod *cauta( char* );
- void introdu( char*, char*, int );
- void afis_alf( void );
- void afis_des( void );
- void afis_loc_munca( char* );
- void afis_virsta( int );
- void elimin( char* );
- void elimin_loc_munca( char* );
- nod *cauta( char *n)
- {
- nod *l;
- for(l = inc1;l!=NULL && strcmp(l->nume, n) < 0; l = l->alf) ;
- /* parcurge lista cautind nodul cu nume egal cu n */
- if( l != NULL && strcmp(l->nume,n ) == 0) /* daca nodul a fost gasit */
- return l;
- return NULL;
- } /* cauta */
- nod *scot1( nod *p, char *l) { /* p este inceputul listei din care se face eliminarea */
- nod *l1, *l2;
- for(l1 = l2 = p; l1 != NULL && strcmp(l1->nume, l) < 0; l2 = l1, l1 = l1->alf) ;
- /* se parcurge lista ordonată alfabetic căutând nodul cu numele egal cu l */
- if( l1 != NULL && strcmp(l1->nume, l) == 0) /* daca s-a gasit nodul */
- if(l1 == l2 ) /* daca este primul nod în listă */
- return p->alf;
- else {
- l2->alf = l1->alf;
- return p;
- }
- else {
- /* nodul nu a fost găsit în lista */
- printf("Eroare: %s nu apare Œn evidenta\n",l);
- return p;
- }
- } /* scot1 */
- nod *scot2(nod *p, char *l)
- {
- /* p este inceputul listei din care se face eliminarea */
- nod *l1, *l2;
- for(l1 = l2 = p; l1 != NULL && strcmp( l1->nume,l) != 0; l2 = l1, l1=l1->vircr);
- /* se parcurge lista ordonată crescător funcţie de vârsta cautând nodul cu numele egal cu l */
- if( l1 != NULL && strcmp(l1->nume, l) ==0) /* daca s-a gasit nodul */
- if(l1 == l2 ) /* daca este primul nod în listă */
- return p->vircr;
- else {
- l2->vircr = l1->vircr;
- return p; }
- else {
- printf("Eroare: %s nu apare Œn evidenta\n",l);
- return p;
- }
- } /* scot2 */
- nod *scot3(nod *p, char *l) { /* p este inceputul listei din care se face eliminarea */
- nod *l1, *l2;
- for(l1 = l2 = p; l1 != NULL && strcmp(l1->nume, l) != 0; l2 = l1, l1 = l1->virdes) ;
- /* se parcurge lista ordonată descrescător funcţie de vârstă căutând nodul cu numele egal cu l */
- if( l1 != NULL && strcmp (l1->nume, l) == 0)
- { /* daca s-a gasit nodul */
- auxp = l1;
- /* auxp indică spre nodul care se elimină */
- if(l1 == l2 ) /* dacă este primul nod în listă */
- return p->virdes;
- else {
- l2->virdes = l1->virdes;
- return p; }
- }
- else {
- printf("Eroare: %s nu apare in evidenta\n",l);
- return p;
- }
- } /* scot3 */
- nod *intr1(nod *p, nod *l) { /* p este inceputul listei in care se face introducerea */
- nod *l1,*l2; /* l este nodul care este inserat */
- for(l1 = l2 = p;l1!=NULL && strcmp(l1->nume, l->nume) < 0; l2 = l1, l1 = l1->alf) ;
- l->alf = l1;
- if(l1 == l2 ) /* daca nodul este inserat la inceputul listei */
- return l;
- else {
- l2->alf = l;
- return p;
- }
- } /* intr1 */
- nod *intr2( nod *p, nod *l) {
- /* p este inceputul listei in care se face introducerea */
- nod *l1, *l2; /* l este nodul care este inserat */
- for(l1 = l2 = p; l1 != NULL && l1->virsta < l->virsta ; l2 = l1, l1 = l1->vircr) ;
- l->vircr = l1;
- if(l1 == l2) /* daca nodul este inserat la inceputul listei */
- return l;
- else {
- l2->vircr = l;
- return p;
- }
- } /* intr2 */
- nod *intr3( nod *p,nod *l) {
- /* p este inceputul listei in care se face introducerea */
- /* l este nodul care este inserat */
- nod *l1, *l2;
- for(l1 = l2 = p; l1 != NULL && l1->virsta> l->virsta ; l2 = l1, l1 = l1->virdes) ;
- l->virdes = l1;
- if(l1 == l2 ) /* daca nodul este inserat la inceputul listei */
- return l;
- else {
- l2->virdes = l;
- return p;
- }
- } /* intr3 */
- void introdu(char *n, char *lm, int v)
- { /* n reprezinta numele persoanei */
- /* lm reprezinta locul de munca */
- /* v reprezinta varsta */
- nod *t;
- if( (t = cauta( n )) != NULL)
- {
- /* daca exista deja o persoana cu numele n */
- /* actualizeaza locul de munca */
- free(t->loc_munca);
- if((t->loc_munca=(char*)malloc(strlen(lm)+1))== NULL)
- {
- printf("Eroare: memorie insuficienta\n");
- exit( 1 );
- }
- else
- {
- strcpy(t->loc_munca, lm); /* noul loc de munca */
- t->virsta = v; /* noua varsta */
- inc2 = scot2(inc2, t->nume);/*elimina nodul din lista ordonata cresc. dupa var. */
- inc2 = intr2(inc2, t); /* introdu nodul in lista ordonata crescator dupa varsta */
- inc3 = scot3(inc3, t->nume); /*elimina nodul din lista ord. descresc. dupa var.*/
- inc3 = intr3(inc3, t); /* introdu nodul in lista ordonata crescator dupa varsta */
- }
- }
- else {
- /* daca nodul nu apare in evidenta */
- t = (nod*)malloc(sizeof(nod));
- /* aloca memorie pentru nod */
- t->nume = (char*)malloc(strlen(n) + 1);
- t->loc_munca = (char*) malloc(strlen(lm) + 1);
- if( t == NULL || t->nume == NULL || t->loc_munca ==NULL)
- {
- printf("Eroare: memorie insuficienta\n");
- exit( 1 );
- }
- else { /* initializeaza campurile nodului nou */
- strcpy(t->nume, n);
- strcpy(t->loc_munca, lm);
- t->virsta = v;
- inc1=intr1(inc1, t);/*nodul este introdus in lista 1*/
- inc2=intr2(inc2, t);/*nodul este introdus in lista 2*/
- inc3=intr3(inc3, t);/*nodul este introdus in lista 3*/
- }
- }
- } /* introdu */
- void afis_alf(void)
- {
- nod *p;
- for(p = inc1; p != NULL ; p = p->alf)
- { /* parcurge lista ordonata alfabetic */
- printf("Nume: %s\n", p->nume);
- printf("Loc de munca: %s\n", p->loc_munca);
- printf("Virsta: %d\n\n", p->virsta);
- }
- } /* afis_alf */
- void afis_des(void) {
- nod *p;
- for(p = inc3; p != NULL; p = p->virdes)/*parcurge lista ord. descresc. in functie de var.*/
- printf("Nume: %s\n", p->nume);
- } /* afis_des */
- void afis_loc_munca (char *lm) {
- nod *l;
- for(l = inc1; l != NULL; l = l->alf) /* parcurge lista ordonata alfabetic */
- if(strcmp(l->loc_munca, lm) == 0) /* daca are locul de munca egal cu lm */
- printf(" Nume: %s\n",l->nume);
- } /* afis_loc_munca */
- void afis_virsta(int v) {
- nod *l;
- for(l = inc2; l != NULL; l = l->vircr) /* se parcurge lista ordonata functie de virsta */
- if(l->virsta >= v) /* daca virsta este mai >= ca si limita v */
- printf("Nume: %s\n", l->nume);
- } /* afis_virsta */
- void elimin(char *s) {
- if (cauta(s))
- {
- /* daca s apare in evidenta */
- inc1 = scot1(inc1, s); /* scoate nodul din lista 1 */
- inc2 = scot2(inc2, s); /* scoate nodul din lista 2 */
- inc3 = scot3(inc3, s); /* scoate nodul din lista 3 */
- /* elibereaza memoria ocupata de nodul eliminat */
- free (auxp->nume);
- free (auxp->loc_munca);
- free (auxp); }
- else
- printf("Persoana %s nu apare Œn evidenta\n");
- } /* elimin */
- void elimin_loc_munca(char *s) {
- nod *l, *aux;
- for(l = inc1; l != NULL; )
- if(strcmp(l->loc_munca, s) == 0)
- { /* s-a gasit o persoana cu locul de munca cautat */
- aux = l->alf;
- elimin(l->nume); /* elimina persoana gasita */
- l = aux; }
- else
- l = l->alf;
- } /* elimin_loc_munca */
- void meniu( void ){
- char c, s[ 30 ], lm[ 30 ];
- int v;
- nod *t;
- while( 1 ) {
- //clrscr();
- printf("a- Introducerea unei persoane noi in evidenta\n");
- printf("t- Cautarea unui nume in evidenta\n");
- printf("l- Tipareste persoanele ce au un anumit loc de munca\n");
- printf("p- Afiseaza persoanele de virsta mai mare sau egala cu o valoare citita\n");
- printf("s- Elimina o persoana din evidenta\n");
- printf("d- Elimina persoanele cu un anumit loc de munca\n");
- printf("n- Afiseaza alfabetic persoanele din evidenta\n");
- printf("v- Afiseaza persoanele in ordinea descrescatoare a virstei\n");
- printf("f- Termina programul\n\n\n");
- printf(" Introduceti optiunea:");
- c =getchar();
- getchar(); /* citeste optiunea */
- switch( c )
- {
- case 'a':
- printf(" Numele persoanei: ");
- gets(s); /* citeste numele */
- printf(" Locul de munca: ");
- gets(lm); /* citeste locul de munca */
- printf(" Virsta:");
- scanf("%d",&v);
- getchar(); /* citeste virsta */
- introdu(s, lm, v); /* pers. si datele aferente sunt introduse in evidenta */
- break;
- case 'v':
- afis_des(); /* tipareste evidenta in ordinea descrescatoare a virstei */
- break;
- case 't': printf(" Numele persoanei: ");
- gets(s); /* citeste numele */
- if ((t = cauta(s)) != NULL)
- { /* daca persoana apare in evidenta */
- printf("Nume: %s\n", t->nume);
- printf("Loc de munca: %s\n", t->loc_munca);
- printf("Virsta: %d\n", t->virsta);
- }
- else printf("%s nu apare in evidenta\n",s);
- break;
- case 'l': printf(" Locul de munca: ");
- gets(lm); /* citeste numele */
- afis_loc_munca(lm); /* afiseaza persoanele cu locul de munca citit */
- break;
- case 'p':printf(" Virsta limita: ");
- scanf("%d", &v); /* citeste varsta */
- getchar();
- afis_virsta( v ); /* afiseaza persoanele cu varsta >= ca limita */
- break;
- case 's':
- printf(" Numele persoanei: ");
- gets(s); /* citeste numele */
- elimin(s); /* elimina persoana cu numele s din evidenta */
- break;
- case 'd':
- printf(" Locul de munca: ");
- gets(lm); /* citeste numele */
- elimin_loc_munca(lm);/*elimina persoanele cu un anumit loc de munca*/
- break;
- case 'n':
- afis_alf(); /* afiseaza evidenta in ordine alfabetica */
- break;
- case 'f':
- return; /* incheie meniu */
- }
- getchar();
- }
- } /* meniu */
- void main(){
- meniu();
- } /* main */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement