Advertisement
Dany1858

inf. Ex alberi con liste (Mappa dipendeti)

Jan 11th, 2015
578
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.46 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h>
  4. #define N 20
  5.      
  6. struct nodo{
  7.        char inf[N];
  8.        struct nodo *figlio;
  9.        struct nodo *fratello;
  10. };
  11.  
  12.    
  13. int menuAlb(struct nodo *);
  14. void albero(struct nodo *);
  15. void addElem(struct nodo *);
  16. void ciclo1(struct nodo *, struct nodo **, int *);
  17. struct nodo *ciclo2(struct nodo *, int);
  18. void delElem(struct nodo *);
  19. struct nodo *ricerca(struct nodo *, struct nodo **, char *);
  20. void delNodo(struct nodo *, struct nodo *);
  21. void delPiano(struct nodo *);
  22. void ordina(struct nodo *, int);
  23. void printAlb(struct nodo *);
  24.  
  25. main()
  26. {
  27.       struct nodo *radice=NULL;
  28.       int menu=-1;
  29.      
  30.       radice=(struct nodo *)malloc(sizeof(struct nodo));
  31.       printf("\nNome edificio?\t");
  32.       scanf("%s", radice->inf);
  33.       radice->fratello=NULL; radice->figlio=NULL;
  34.      
  35.       while(menu=!0){
  36.       if(menu==-1) menu=1;
  37.       else menu=menuAlb(radice);
  38.          
  39.       switch(menu){
  40.           case 1:{ albero(radice); break;}
  41.           case 2:{ addElem(radice); break;}
  42.           case 3:{ delElem(radice); break;}
  43.           case 4:{ delPiano(radice); break;}
  44.           case 6:{ printAlb(radice); break;}
  45.           case 0:{ break;}
  46.           default:{ printf("\nOpzione non ammessa!\t"); getchar();}
  47.       }}
  48. }
  49.      
  50. int menuAlb(struct nodo *p)
  51. {
  52.     int menu;
  53.     system("cls");
  54.     printf("-------------------------\n\t%s\n", p->inf);
  55.     printf("\n1. Aggiungi piano\n\n2. Aggiungi dipendenti\n\n3. Elimina dipendente\n\n4. Cancella piano\n\n6. Stampa albero\n\n0. Exit\t");
  56.     scanf("%d", &menu);
  57.     getchar();
  58.     return menu;
  59. }
  60.      
  61. void albero(struct nodo *p)
  62. {
  63.        struct nodo *px, *paus=p->fratello;;
  64.        int n=0;
  65.        char newDip;
  66.        ciclo1(p, &px, &n);
  67.        p->fratello=(struct nodo *)malloc(sizeof(struct nodo));
  68.        p=p->fratello; p->inf[0]=n; p->fratello=paus; p->figlio=NULL;
  69.        printf("\nPiano %d creato", n); getchar();
  70. }
  71.  
  72. void addElem(struct nodo *p)
  73. {
  74.        struct nodo *px, *paus=NULL;
  75.        int val, liv, m=-1, n=-1;
  76.        char cognome[N];
  77.        ciclo1(p, &px, &n);
  78.        if(n==0){ printf("\nNessun piano ancora presente!\t"); getchar();}
  79.        else{
  80.            while(m<=0 || m>n){
  81.                printf("\nA che piano vuoi aggiungere dipendenti? L'ultimo e' il %d\t", n);
  82.                scanf("%d", &m);}
  83.            p=ciclo2(p, m);
  84.            printf("\nCognome dipendente?\t");
  85.            scanf("%s", cognome);
  86.            if(p->figlio==NULL){ p->figlio=(struct nodo *)malloc(sizeof(struct nodo)); p=p->figlio;}
  87.            else{ p=p->figlio; ciclo1(p, &paus, &n);
  88.                paus->fratello=(struct nodo *)malloc(sizeof(struct nodo)); p=paus->fratello;}
  89.            strcpy(p->inf, cognome); p->figlio=NULL; p->fratello=NULL;}
  90. }
  91.  
  92. void delPiano(struct nodo *p)
  93. {
  94.        struct nodo *r=p, *px, *paus=p, *paux;
  95.        int n=-1, m=-1;
  96.        ciclo1(p, &px, &n);
  97.        if(n==0){ printf("\nNessun piano ancora presente!\t"); getchar();}
  98.        else{
  99.            while(m<=0 || m>n){
  100.                printf("\nChe piano vuoi eliminare? l'ultimo e' il %d\t", n);
  101.                scanf("%d", &m);}
  102.            p=ciclo2(p, m);
  103.            while(paus!=p){ px=paus;
  104.                paus=paus->fratello;}
  105.            if(p->figlio!=NULL){
  106.                paus=p->figlio;
  107.                while(paus!=NULL){
  108.                    paux=paus->fratello; free(paus); paus=paux;}}
  109.                px->fratello=p->fratello;
  110.                free(p);
  111.        ordina(r->fratello, n);
  112.        printf("\nEliminazione completata con successo!\t");
  113.        getchar(); getchar();}
  114. }
  115.  
  116. void ordina(struct nodo *p, int n)
  117. {
  118.        if(n>1){
  119.            n--;
  120.            p->inf[0]=n;
  121.            ordina(p->fratello, n);}
  122. }
  123.  
  124. void ciclo1(struct nodo *p, struct nodo **paus, int *n)
  125. {
  126.        if(p!=NULL){
  127.            ++*n; *paus=p;
  128.            ciclo1(p->fratello, paus, n);}
  129. }
  130.  
  131. struct nodo *ciclo2(struct nodo *p, int m)
  132. {
  133.        if(p->inf[0]!=m) p=ciclo2(p->fratello, m);
  134.        return p;
  135. }
  136.  
  137.  
  138. void delElem(struct nodo *p)
  139. {
  140.        struct nodo *paus=NULL;
  141.        char cognome[N];
  142.        printf("\nCognome dipendente da eliminare?\t");
  143.        scanf("%s", cognome);
  144.        p=ricerca(p, &paus, cognome);
  145.        if(p==NULL) printf("\nNessun elemento trovato!\t");
  146.        else{ printf("\nElemento trovato!"); delNodo(p, paus);
  147.        printf("\nEliminazione completata con successo!\t");}
  148.        getchar(); getchar();
  149.        
  150. }
  151.  
  152. struct nodo *ricerca(struct nodo *p, struct nodo **paus, char *c)
  153. {
  154.        struct nodo *px;
  155.        while(p!=NULL){
  156.            *paus=p;
  157.            px=p->figlio;
  158.            while(px!=NULL){
  159.                if(strcmp(px->inf, c)==0) return px;
  160.                else px=px->fratello;}
  161.            p=p->fratello;}
  162.        return NULL;
  163. }
  164.  
  165. void delNodo(struct nodo *p, struct nodo *paus)
  166. {
  167.      struct nodo *paux;
  168.      if(p==paus->figlio){
  169.          paus->figlio=p->fratello;
  170.          free(p);}
  171.      else{
  172.          paus=paus->figlio;
  173.          while(paus!=p){ paux=paus;
  174.              paus=paus->fratello;}
  175.          paux->fratello=p->fratello;
  176.          free(p);}
  177. }
  178.  
  179. void printAlb(struct nodo *p)
  180. {
  181.      struct nodo *paus;
  182.      system("cls");
  183.      printf("\n\n\t%s\n\n", p->inf);
  184.      p=p->fratello;
  185.      while(p!=NULL){
  186.          printf("\n  %d-->", p->inf[0]);
  187.          paus=p->figlio;
  188.          while(paus!=NULL){
  189.              printf(" -> %s", paus->inf);
  190.              paus=paus->fratello;}
  191.          p=p->fratello;}
  192.      getchar();
  193.  
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement