Advertisement
Guest User

lab6

a guest
Nov 20th, 2018
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.08 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. typedef struct nod_lista {      
  6.     char *nume;        
  7.     char *loc_munca;        
  8.     int virsta;        
  9.     struct nod_lista *alf;                 /* înlănţuirea în ordine alfabetică */        
  10.     struct nod_lista *vircr;              /* înlănţuirea în ordinea crescătoarea a vârstei */        
  11.     struct nod_lista *virdes;           /* înlănţuirea în ordinea descrescătoarea a vârstei */
  12. } nod;
  13.  
  14. nod *inc1 =NULL, *inc2 =NULL, *inc3=NULL ;
  15. static nod *auxp; /* variabilă auxiliară folosită la eliminarea unui nod */
  16.  
  17. /* operaţiile asupra listei */
  18. nod *cauta( char* );
  19. void introdu( char*, char*, int );
  20. void afis_alf( void );
  21. void afis_des( void );
  22. void afis_loc_munca( char* );
  23. void afis_virsta( int );
  24. void elimin( char* );
  25.  void elimin_loc_munca( char* );
  26.  
  27.  nod *cauta( char *n)
  28.  {      
  29.      nod *l;
  30.  
  31.      for(l = inc1;l!=NULL && strcmp(l->nume, n) < 0; l = l->alf) ;                    
  32.      /* parcurge lista cautind nodul cu nume egal cu n */        
  33.      if( l != NULL && strcmp(l->nume,n ) == 0)   /* daca nodul a fost gasit */              
  34.          return l;        
  35.      return NULL;
  36.  } /* cauta */
  37.  
  38.  
  39.  nod *scot1( nod *p, char *l)  {  /* p este inceputul listei din care se face eliminarea */      
  40.      nod *l1, *l2;
  41.      for(l1 = l2 = p; l1 != NULL && strcmp(l1->nume, l) < 0; l2 = l1, l1 = l1->alf) ;            
  42.      /* se parcurge lista ordonată alfabetic căutând  nodul cu numele egal cu l */        
  43.      if( l1 != NULL && strcmp(l1->nume, l) == 0)    /* daca s-a gasit nodul */              
  44.          if(l1 == l2 )                                                 /* daca este primul nod în listă */                
  45.              return p->alf;                
  46.          else {          
  47.              l2->alf = l1->alf;          
  48.              return p;              
  49.          }      
  50.      else {              
  51.          /* nodul nu a fost găsit în lista */              
  52.          printf("Eroare: %s nu apare Œn evidenta\n",l);          
  53.          return p;      
  54.      }  
  55.  } /* scot1 */
  56.  
  57.  nod *scot2(nod *p, char *l)
  58.  {  
  59.      /* p este inceputul listei din care se face eliminarea */  
  60.      nod *l1, *l2;
  61.        for(l1 = l2 = p; l1 != NULL && strcmp( l1->nume,l) != 0; l2 = l1, l1=l1->vircr);
  62.        /* se parcurge lista ordonată crescător funcţie de  vârsta cautând nodul cu numele egal   cu l */
  63.        if( l1 != NULL && strcmp(l1->nume, l) ==0)   /* daca s-a gasit nodul */              
  64.            if(l1 == l2 ) /* daca este primul nod în listă */                      
  65.                return p->vircr;              
  66.            else {          
  67.                l2->vircr = l1->vircr;      
  68.                return p;               }        
  69.        else  {            
  70.            printf("Eroare: %s nu apare Œn evidenta\n",l);      
  71.            return p;        
  72.        }
  73.  } /* scot2 */
  74.  
  75.  nod *scot3(nod *p, char *l) {  /* p este inceputul listei din care se face eliminarea */      
  76.      nod *l1, *l2;
  77.      for(l1 = l2 = p; l1 != NULL && strcmp(l1->nume, l) != 0;  l2 = l1, l1 = l1->virdes) ;        
  78.      /* se parcurge lista ordonată descrescător funcţie de vârstă căutând nodul cu numele egal cu l */      
  79.      if( l1 != NULL && strcmp (l1->nume, l) == 0)
  80.      {       /* daca s-a gasit nodul */            
  81.          auxp = l1;                          
  82.          /* auxp indică spre nodul care se elimină */      
  83.          if(l1 == l2 )                          /* dacă este primul nod în listă */                  
  84.              return p->virdes;              
  85.          else {          
  86.              l2->virdes = l1->virdes;          
  87.              return p;               }        
  88.      }        
  89.      else {              
  90.          printf("Eroare: %s nu apare in evidenta\n",l);        
  91.          return p;      
  92.      }
  93.  } /* scot3 */
  94.  
  95.  nod *intr1(nod *p, nod *l)  {  /* p este inceputul listei in care se face introducerea */  
  96.      nod *l1,*l2;                    /* l este nodul care este inserat */
  97.  
  98.        for(l1 = l2 = p;l1!=NULL && strcmp(l1->nume, l->nume) < 0; l2 = l1, l1 = l1->alf) ;        
  99.        l->alf = l1;      
  100.        if(l1 == l2 )   /* daca nodul este inserat la inceputul listei */        
  101.            return l;      
  102.        else {            
  103.            l2->alf = l;      
  104.            return p;      
  105.        }
  106.  } /* intr1 */
  107.  
  108.  nod *intr2( nod *p, nod *l) {  
  109.      /* p este inceputul listei in care se face introducerea */
  110.      nod *l1, *l2;                     /* l este nodul care este inserat */  
  111.      for(l1 = l2 = p; l1 != NULL && l1->virsta < l->virsta ;  l2 = l1, l1 = l1->vircr) ;  
  112.      l->vircr = l1;      
  113.      if(l1 == l2)       /* daca nodul este inserat la inceputul listei */        
  114.          return l;      
  115.      else {            
  116.          l2->vircr = l;          
  117.          return p;      
  118.      }
  119.  } /* intr2 */
  120.  
  121.  nod *intr3( nod *p,nod *l) {    
  122.      /* p este inceputul listei in care se face introducerea */        
  123.      /* l este nodul care este inserat */      
  124.      nod *l1, *l2;        
  125.      for(l1 = l2 = p; l1 != NULL && l1->virsta> l->virsta ; l2 = l1, l1 = l1->virdes) ;
  126.       l->virdes = l1;    
  127.       if(l1 == l2 )               /* daca nodul este inserat la inceputul listei */      
  128.           return l;        
  129.       else {              
  130.           l2->virdes = l;          
  131.           return p;        
  132.       }
  133.  } /* intr3 */
  134.  
  135.  
  136.  void introdu(char *n, char *lm, int v)
  137.  {        /* n reprezinta numele persoanei */    
  138.      /* lm reprezinta locul de munca */        
  139.      /* v reprezinta varsta */      
  140.      nod *t;      
  141.      if( (t = cauta( n )) != NULL)
  142.      {              
  143.          /* daca exista deja o persoana cu numele n */          
  144.          /* actualizeaza locul de munca */              
  145.          free(t->loc_munca);              
  146.          if((t->loc_munca=(char*)malloc(strlen(lm)+1))== NULL)
  147.          {          
  148.              printf("Eroare: memorie insuficienta\n");      
  149.              exit( 1 );              
  150.          }              
  151.          else
  152.          {    
  153.              strcpy(t->loc_munca, lm);      /* noul loc de munca */    
  154.              t->virsta = v;             /* noua varsta */          
  155.              inc2 = scot2(inc2, t->nume);/*elimina nodul din lista ordonata cresc. dupa var. */  
  156.              inc2 = intr2(inc2, t);      /* introdu nodul in lista ordonata crescator dupa varsta */        
  157.              inc3 = scot3(inc3, t->nume);   /*elimina nodul din lista ord. descresc. dupa var.*/    
  158.              inc3 = intr3(inc3, t);      /* introdu nodul in lista ordonata crescator dupa varsta */            
  159.          }        
  160.      }        
  161.      else {
  162.          /* daca nodul nu apare in evidenta */      
  163.          t = (nod*)malloc(sizeof(nod));
  164.          /* aloca memorie pentru nod */              
  165.          t->nume = (char*)malloc(strlen(n) + 1);    
  166.          t->loc_munca = (char*) malloc(strlen(lm) + 1);        
  167.          if( t == NULL || t->nume == NULL || t->loc_munca ==NULL)
  168.          {          
  169.              printf("Eroare: memorie insuficienta\n");  
  170.              exit( 1 );              
  171.          }            
  172.          else {   /* initializeaza campurile nodului nou */      
  173.              strcpy(t->nume, n);
  174.               strcpy(t->loc_munca, lm);          
  175.               t->virsta = v;          
  176.               inc1=intr1(inc1, t);/*nodul este introdus in lista 1*/          
  177.               inc2=intr2(inc2, t);/*nodul este introdus in lista 2*/          
  178.               inc3=intr3(inc3, t);/*nodul este introdus in lista 3*/  
  179.          }    
  180.      }  
  181.  } /* introdu */
  182.  
  183.  void afis_alf(void)
  184.  {      
  185.      nod *p;          
  186.      for(p = inc1; p != NULL ; p = p->alf)
  187.      { /* parcurge lista ordonata alfabetic */  
  188.          printf("Nume: %s\n", p->nume);        
  189.          printf("Loc de munca: %s\n", p->loc_munca);        
  190.          printf("Virsta: %d\n\n", p->virsta);    
  191.      }
  192.  } /* afis_alf */
  193.  
  194.  void afis_des(void) {    
  195.      nod *p;
  196.  
  197.       for(p = inc3; p != NULL; p = p->virdes)/*parcurge  lista ord. descresc. in functie de var.*/    
  198.           printf("Nume: %s\n", p->nume);
  199.  } /* afis_des */
  200.  
  201.  void afis_loc_munca (char *lm) {      
  202.      nod *l;
  203.  
  204.       for(l = inc1; l != NULL; l = l->alf)  /* parcurge lista ordonata alfabetic */    
  205.           if(strcmp(l->loc_munca, lm) == 0) /* daca are locul de munca egal cu lm */    
  206.               printf(" Nume: %s\n",l->nume);
  207.  } /* afis_loc_munca */
  208.  
  209.  void afis_virsta(int v) {      
  210.      nod *l;
  211.  
  212.        for(l = inc2; l != NULL; l = l->vircr)  /* se parcurge lista ordonata functie de virsta */    
  213.            if(l->virsta >= v)  /* daca virsta este mai >= ca si limita v */            
  214.                printf("Nume: %s\n", l->nume);
  215.  } /* afis_virsta */
  216.  
  217.  void elimin(char *s) {      
  218.      if (cauta(s))
  219.      {              
  220.          /* daca s apare in evidenta */      
  221.          inc1 = scot1(inc1, s); /* scoate nodul din lista 1 */    
  222.          inc2 = scot2(inc2, s); /* scoate nodul din lista 2 */      
  223.          inc3 = scot3(inc3, s); /* scoate nodul din lista 3 */        
  224.          /* elibereaza memoria ocupata de nodul eliminat */            
  225.          free (auxp->nume);          
  226.          free (auxp->loc_munca);        
  227.          free (auxp);        }  
  228.      else
  229.          printf("Persoana %s nu apare Œn evidenta\n");
  230.  } /* elimin */
  231.  
  232.  void elimin_loc_munca(char *s) {      
  233.      nod *l, *aux;
  234.  
  235.       for(l = inc1; l != NULL; )            
  236.           if(strcmp(l->loc_munca, s) == 0)
  237.           { /* s-a gasit o persoana cu locul de munca cautat */          
  238.               aux = l->alf;              
  239.               elimin(l->nume); /* elimina persoana gasita */          
  240.               l = aux;              }          
  241.           else              
  242.               l = l->alf;  
  243.  } /* elimin_loc_munca */
  244.  
  245.  void meniu( void ){      
  246.      char c, s[ 30 ], lm[ 30 ];      
  247.      int v;      
  248.      nod *t;
  249.      while( 1 ) {      
  250.          //clrscr();  
  251.          printf("a- Introducerea unei persoane noi in evidenta\n");      
  252.          printf("t- Cautarea unui nume in evidenta\n");          
  253.          printf("l- Tipareste persoanele ce au un anumit loc de munca\n");      
  254.          printf("p- Afiseaza persoanele de virsta mai mare sau egala cu o valoare citita\n");      
  255.          printf("s- Elimina o persoana din evidenta\n");            
  256.          printf("d- Elimina persoanele cu un anumit loc de munca\n");          
  257.          printf("n- Afiseaza alfabetic persoanele din evidenta\n");            
  258.          printf("v- Afiseaza persoanele in ordinea descrescatoare a virstei\n");      
  259.          printf("f- Termina programul\n\n\n");            
  260.          printf(" Introduceti optiunea:");        
  261.          c =getchar();
  262.          getchar(); /* citeste optiunea */
  263.          switch( c )
  264.          {                
  265.          case 'a':
  266.              printf(" Numele persoanei: ");
  267.              gets(s);  /* citeste numele */                          
  268.              printf(" Locul de munca: ");
  269.              gets(lm);    /* citeste locul de munca */          
  270.              printf(" Virsta:");
  271.              scanf("%d",&v);
  272.              getchar();  /* citeste virsta */    
  273.              introdu(s, lm, v); /* pers. si datele aferente sunt introduse in evidenta */      
  274.              break;                    
  275.          case 'v':
  276.              afis_des(); /* tipareste evidenta in ordinea  descrescatoare a virstei */              
  277.              break;                    
  278.          case 't': printf(" Numele persoanei: ");
  279.              gets(s);   /* citeste numele */        
  280.              if ((t = cauta(s)) != NULL)
  281.              {  /* daca persoana apare in evidenta */        
  282.                  printf("Nume: %s\n", t->nume);              
  283.                  printf("Loc de munca: %s\n", t->loc_munca);      
  284.                  printf("Virsta: %d\n", t->virsta);                    
  285.              }                      
  286.              else  printf("%s nu apare in evidenta\n",s);      
  287.              break;                  
  288.          case 'l': printf(" Locul de munca: ");
  289.              gets(lm);   /* citeste numele */  
  290.              afis_loc_munca(lm); /* afiseaza persoanele cu locul de munca citit */      
  291.              break;                    
  292.          case 'p':printf(" Virsta limita: ");
  293.              scanf("%d", &v); /* citeste varsta */  
  294.              getchar();
  295.               afis_virsta( v ); /* afiseaza persoanele cu varsta >= ca limita */    
  296.               break;                  
  297.          case 's':
  298.              printf(" Numele persoanei: ");
  299.              gets(s);   /* citeste numele */      
  300.              elimin(s); /* elimina persoana cu numele s din evidenta */              
  301.              break;                    
  302.          case 'd':  
  303.              printf(" Locul de munca: ");
  304.              gets(lm); /* citeste numele */          
  305.              elimin_loc_munca(lm);/*elimina persoanele cu un anumit loc de munca*/    
  306.              break;                    
  307.          case 'n':
  308.              afis_alf(); /* afiseaza evidenta in ordine alfabetica */  
  309.              break;                    
  310.          case 'f':  
  311.              return; /* incheie meniu */      
  312.          }            
  313.          getchar();    
  314.      }
  315.  } /* meniu */
  316.  
  317.  void main(){      
  318.      meniu();
  319.  } /* main */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement