Gestione liste e file binari - MyRub.c
Cerca
 











MyRub.c

Caricato da: Bonny
Scarica il programma completo

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. static FILE *fp;
  5. // struttura del nodo
  6. typedef struct dato{      
  7.                       int n;
  8.                       char nome[10];
  9.                  }element_type;
  10.                  
  11. typedef struct elemento {
  12.                              element_type value;
  13.                              struct elemento *next;
  14.                           } nodo;
  15.                                                  
  16. typedef nodo *list;
  17.  
  18. list root = NULL;
  19. //prototipi
  20. list inputFile();
  21. list cons_sort(element_type,list);
  22. int Menu();
  23. int empty(list);
  24. void insertContatto();
  25. void stampaContatti(list,int);
  26. void deleteContatto(list);
  27. void update(list);
  28. //main principale
  29. main() {
  30.  
  31.      int x=1;
  32.    
  33.      do{
  34.         system("color 2c");
  35.         x=Menu();
  36.              
  37.         }while(x!=0);
  38.                                      
  39.   system("PAUSE");
  40. }
  41. // menu di scelta multipla
  42. int Menu()
  43. {      
  44.        int y=0;
  45.        
  46.        printf("\nPREMERE:\n\t[1] Inserisci nuovo contatto\n\n\t[2] Cerca contatto\n\n\t[3] Elimina contatto\n\n\t[4] Visualizza tutti i contatti\n\n\t[5] Esci \n");
  47.        scanf("%d",&y);      
  48.        switch(y){
  49.                  case 1: insertContatto(); return 1;
  50.                  case 2: root = inputFile(); stampaContatti(root,1); return 1;
  51.                  case 3: root = inputFile(); deleteContatto(root); return 1;
  52.                  case 4: root = inputFile(); stampaContatti(root,0); return 1;
  53.                  case 5: return 0;
  54.                  };  
  55. }
  56. //
  57. void update(list L){
  58.      
  59.      element_type EL;
  60.          
  61.      if((fp = fopen("MyContatti.dat","wb")) == NULL){    //apro il file in modalità scrittura cosi riscritta l'intera
  62.          printf("Errore durante l'apertura del file...");//rubrica tranne il contatto eliminato
  63.      }else{
  64.         system("CLS");
  65.         printf("\n\tUpdate in corso.......\n");
  66.          rewind(fp);
  67.          while(L != NULL){
  68.                EL.n = L->value.n;
  69.                strcpy(EL.nome,L->value.nome);
  70.                fwrite(&EL,sizeof(element_type),1,fp);  
  71.                L = L->next;
  72.          }
  73.          fclose(fp);
  74.         system("CLS");
  75.         stampaContatti(root,0);
  76.         printf("\n\tUpdate seseguito con successo\n");
  77.        
  78.         }
  79.      
  80. }
  81. // elimina un contatto dalla rubrica
  82. void deleteContatto(list L){
  83.          
  84.         list prov,cur,temp;        
  85.         char N[10];
  86.         system("CLS");
  87.         printf("\nInserisci il nome del contatto da eliminare:\t");
  88.         scanf("%s",&N);
  89.        
  90.         if(!empty(L)){
  91.              if(strcmp(N,L->value.nome) == 0){//elimina il primo nodo
  92.                  temp = L;//memorizza il nodo che sta per essere rimosso
  93.                  L = L->next;//sfila il nodo
  94.                  free(temp);// libera memoria
  95.                  update(L);      
  96.              }else{
  97.                    prov = L;
  98.                    cur = L->next;
  99.                    //esegue un ciclo per trivare la posizione corretta
  100.                      while(cur != NULL && strcmp(N,cur->value.nome)){
  101.                                prov = cur;     //passa al....
  102.                                cur = cur->next;//...prossimo nodo
  103.                      }//fine while
  104.                      if(cur != NULL){//elimina il nodo puntato da cur
  105.                        temp = cur;
  106.                        prov->next = cur->next;
  107.                        free(temp);
  108.                        update(L);
  109.                        }else{
  110.                           printf("%s Non contenuto in rubrica",N);
  111.                        }
  112.                    }
  113.         }else printf("\n\tLa rubrica non contiene nessun elemento..\n");
  114.        
  115. }
  116.  
  117. //controllo lista vuota
  118. int empty(list h){        
  119.         if(h == NULL)return 1;
  120.         else return 0;
  121. }
  122. //crea una lista ordinata in ordine crescente in base al numero
  123. list cons_sort(element_type e, list l){
  124.  
  125.     list newp;// puntatore al nuovo nodo
  126.     list prov;// puntatore al nodo precedente della lista
  127.     list cur;// puntatore al nodo corrente della lista
  128.    
  129.     newp = (list)malloc(sizeof(nodo));//crea il nuovo nodo
  130.    
  131.     newp->value.n = e.n;
  132.     strcpy(newp->value.nome,e.nome);//memorizza valore nel nodo
  133.     newp->next = NULL; // il nodo nn è collegato a nessun altro nodo
  134.    
  135.     prov = NULL;
  136.     cur = l;
  137.     //esegue un ciclo per trovare la posizione corretta nella lista
  138.     while(cur != NULL && (strcmp(e.nome, cur->value.nome) > 0)){
  139.              
  140.               prov = cur;     //passa al....
  141.               cur = cur->next;//...prossimo nodo            
  142.               }
  143.               if(prov == NULL){//inserisce il nodo in testa alla lista
  144.                       newp->next = l;
  145.                       l = newp;
  146.               }else{//inserisce il nodo tra prov e curr
  147.              
  148.                    prov->next = newp;
  149.                    newp->next = cur;
  150.               }
  151.    return l;        
  152. }
  153. void insertContatto(){
  154.      
  155.        int c = 0;
  156.        element_type EL;
  157.        
  158.      system("CLS");
  159.      printf("\nIntrodurre nome: \t");
  160.      scanf("%s", EL.nome);    
  161.      printf("\nIntrodurre numero: \t");
  162.      scanf("%d", &EL);
  163.        
  164.         list Templist;
  165.         Templist = inputFile();
  166.    
  167.         while(Templist != NULL){
  168.           if(strcmp(EL.nome, Templist->value.nome) == 0){c = 1;}
  169.            Templist = Templist->next;
  170.           }
  171.         if(c == 0){
  172.             if((fp = fopen("MyContatti.dat","ab")) == NULL){
  173.                 printf("Errore durante l'apertura del file...");
  174.              }else{
  175.                system("CLS");
  176.                printf("\n\tSalvataggio in corso.......\n");
  177.                fwrite(&EL,sizeof(element_type),1,fp);
  178.                rewind(fp);
  179.                fclose(fp);
  180.                system("CLS");
  181.                printf("\n\tDati salvati con successo\n");
  182.               }  
  183.           }else system("CLS");printf("\nImpossibile salvare [ %s ] nome gia presente nella rubrica\nDevi cambiare il nome\n",EL.nome);      
  184. }
  185. list inputFile(){    
  186.      
  187.        list newroot = NULL;
  188.        element_type T;
  189.  
  190.        if((fp = fopen("MyContatti.dat","rb")) == NULL){
  191.             printf("Errore durante l'apertura del file...");
  192.             return NULL;
  193.             }else{
  194.                   rewind(fp);//posiziono fp in testa al file
  195.                   printf("Attendere........");
  196.                   fread(&T, sizeof(element_type), 1, fp);
  197.        
  198.                   while(!feof(fp)){
  199.                
  200.                        newroot = cons_sort(T,newroot);
  201.                        fread(&T, sizeof(element_type), 1, fp);
  202.                
  203.                       }
  204.                    fclose(fp);
  205.                 }
  206.        return newroot;      
  207. }
  208. // stampa lista data
  209. void stampaContatti(list r,int x){
  210.      
  211.          int count = 0;
  212.          system("CLS");
  213.          
  214.          if(!empty(r)){
  215.             if(x == 0){
  216.                 printf("\n------------------------------\n\t| NOME |  | NUMERO |\n------------------------------\n");
  217.                 while(r != NULL){
  218.                    printf("\t%s\t%d\n\n", r->value.nome, r->value.n);
  219.                    count++;
  220.                    r = r->next;
  221.                   }
  222.                  printf("------------------------------\n %d Contatti \n------------------------------\n",count);
  223.             }else if(x == 1){
  224.                  
  225.                 char c;
  226.                 char temp[10];
  227.                 printf("Cerca: ");
  228.                 scanf("%s",&c);
  229.                
  230.                 printf("\n------------------------------\n\t| NOME |  | NUMERO |\n------------------------------\n");
  231.                
  232.                  while(r != NULL){
  233.                    strcpy(temp,r->value.nome);
  234.                      if(c == temp[0]){
  235.                         count++;  
  236.                         printf("\t%s\t%d\n\n", r->value.nome, r->value.n);
  237.                         }
  238.                       r = r->next;                  
  239.                    }
  240.                  if(count == 0)printf("\n\tNessun contatto\n");
  241.                  printf("------------------------------\n");                
  242.             }
  243.          }else printf("\n\tLa rubrica non contiene nessun elemento..\n");
  244. }
 

Creative Commons License
Il layout di questo sito è concesso sotto licenza Creative Commons.
Per maggiori informazioni sulle licenze dei contenuti del sito, clicca.