Gestione liste e file binari - liste.c
Cerca
 











liste.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. // var globali
  18. list L = NULL;
  19. list root = NULL;
  20. // prototipi
  21. void stampalista(list);
  22. void scrivi(list);
  23. void delete_nodo(list);
  24. int empty(list);
  25. list cons_pila(element_type,list);
  26. list cons_coda(element_type,list);
  27. list cons_sort(element_type,list);
  28. list inputFile();
  29.  
  30. // main principale  
  31.                  
  32. main() {
  33.  
  34.    int scelta;    
  35.    element_type x;
  36.    
  37.    list lista_pila = NULL;
  38.    list lista_coda = NULL;
  39.    list lista_sort = NULL;
  40.    
  41.     while(scelta != 0){
  42.                
  43.            system("CLS");    
  44.            printf("\nIntrodurre numero: \t");
  45.            scanf("%d", &x.n);
  46.             printf("\nIntrodurre nome: \t");
  47.             scanf("%s", x.nome);
  48.            
  49.              lista_pila = cons_pila(x, lista_pila);
  50.              
  51.              lista_coda = cons_coda(x, lista_coda);
  52.              
  53.              lista_sort = cons_sort(x, lista_sort);
  54.              
  55.           system("CLS");
  56.           printf("\t* PREMERE 1 PER CONTINUARE\n\n\t* PREMERE 0 PER USCIRE\n");
  57.           scanf("%d",&scelta);
  58.           system("CLS");
  59.       }
  60.       printf("lista costruita inserendo gli elementi in testa: \n");
  61.       stampalista(lista_pila);//stampa a video gli elementi della lista
  62.      
  63.       printf("\nlista costruita inserendo gli elementi in coda: \n");
  64.       stampalista(lista_coda);
  65.      
  66.       printf("\nlista costruita inserendo gli elementi in ordine crescente in base al numero: \n");
  67.       stampalista(lista_sort);
  68.      
  69.       scrivi(lista_sort);//scrive in un file binario gli elementi della lista, salvo solo lista_sort
  70.                         //perchè non avrebbe senso salvare tutte e tre le liste, contengono gli stessi
  71.                         //elementi però distribuiti in maniera diversa, poi invocando la funzione
  72.                         //inputFile() per costruire una nuova lista con i dati contenuti nel file.
  73.       list new_lista;
  74.      
  75.       new_lista = inputFile();
  76.       //N.B. nella funzione inputFile() basta cambiare la chiamata cons_*** (dentro all'istruzione while)
  77.       //per creare una coda,una pila o una lista ordinata
  78.       printf("\nnuova lista creata con i dati contenuti sul file liste.dat : \n");
  79.       stampalista(new_lista);
  80.                                      
  81. system("PAUSE");
  82. }
  83. // salva gli elementi di una lista data in un file binario
  84. void scrivi(list lista){
  85.      
  86.      element_type tx;
  87.      
  88.      if(!empty(lista)){
  89.        if((fp = fopen("liste.dat","wb")) == NULL){
  90.             printf("Errore durante l'apertura del file...");
  91.             }else{
  92.                    while(lista != NULL){
  93.                                
  94.                      tx.n = lista->value.n;
  95.                      strcpy(tx.nome,lista->value.nome);
  96.                          
  97.                      fwrite(&tx,sizeof(element_type),1,fp);
  98.                  
  99.                      lista = lista->next;
  100.                      }
  101.                     rewind(fp);
  102.                     close(fp);
  103.                   }
  104.        }else printf("\n\tLa lista non contiene nessun elemento..\n");
  105. }
  106.  
  107.  
  108. // stampa lista data
  109. void stampalista(list r){
  110.          
  111.          if(!empty(r)){
  112.                 printf("\t| Numero |  | nome |\n------------------------------\n");
  113.                 while(r != NULL){
  114.                    printf("\t%d\t%s\n", r->value.n, r->value.nome);
  115.                    r = r->next;
  116.                   }
  117.                  printf("------------------------------\n");
  118.          }else printf("\n\tLa lista non contiene nessun elemento..\n");
  119. }
  120.  
  121.  
  122. //controllo lista vuota
  123. int empty(list h){        
  124.         if(h == NULL)return 1;
  125.         else return 0;
  126. }
  127. //crea una lista ordinata in ordine crescente in base al numero
  128. list cons_sort(element_type e, list l){
  129.  
  130.     list newp;// puntatore al nuovo nodo
  131.     list prov;// puntatore al nodo precedente della lista
  132.     list cur;// puntatore al nodo corrente della lista
  133.    
  134.     newp = (list)malloc(sizeof(nodo));//crea il nuovo nodo
  135.    
  136.     newp->value.n = e.n;
  137.     strcpy(newp->value.nome,e.nome);//memorizza valore nel nodo
  138.     newp->next = NULL; // il nodo nn è collegato a nessun altro nodo
  139.    
  140.     prov = NULL;
  141.     cur = l;
  142.     //esegue un ciclo per trovare la posizione corretta nella lista
  143.     while(cur != NULL && e.n > cur->value.n){
  144.              
  145.               prov = cur;     //passa al....
  146.               cur = cur->next;//...prossimo nodo            
  147.               }
  148.               if(prov == NULL){//inserisce il nodo in testa alla lista
  149.                       newp->next = l;
  150.                       l = newp;
  151.               }else{//inserisce il nodo tra prov e curr
  152.              
  153.                    prov->next = newp;
  154.                    newp->next = cur;
  155.               }
  156.    return l;        
  157. }
  158.  
  159. list inputFile(){    
  160.      
  161.        list newroot = NULL;
  162.        element_type T;
  163.  
  164.        if((fp = fopen("liste.dat","rb")) == NULL){
  165.             printf("Errore durante l'apertura del file...");
  166.             return NULL;
  167.             }else{
  168.                   rewind(fp);//posiziono fp in testa al file
  169.                  
  170.                   fread(&T, sizeof(element_type), 1, fp);
  171.        
  172.                   while(!feof(fp)){
  173.                
  174.                        newroot = cons_sort(T,newroot);//////////N.B.
  175.                        fread(&T, sizeof(element_type), 1, fp);
  176.                
  177.                       }
  178.                    close(fp);
  179.                 }
  180.        return newroot;      
  181. }  
  182.  
  183.  
  184.  
  185. //costruisce una nuova lista aggiungento l'elemento in testa alla lista
  186. list cons_pila(element_type EL, list l) {
  187.                                  
  188.       list t;                            
  189.       t = (list)malloc(sizeof(nodo));                          
  190.       t->value.n = EL.n;                            
  191.       strcpy(t->value.nome,EL.nome);                                  
  192.       t->next = l;
  193.                            
  194.    return t;
  195. }
  196.  
  197.  
  198. //costruisce una nuova lista aggiungento l'elemento in coda alla lista
  199. list cons_coda(element_type EL, list l) {
  200.                                  
  201.    list t,prov;
  202.    list curr = l;  
  203.                                                      
  204.    t = (list)malloc(sizeof(nodo));//inserisce elemento nel nuovo nodo                        
  205.    t->value.n = EL.n;                            
  206.    strcpy(t->value.nome,EL.nome);                                  
  207.    t->next = NULL;
  208.                            
  209.    if(empty(curr))return t;//se la lista è vuota inserisce il nodo in testa alla lista
  210.    else{
  211.          while(curr != NULL){
  212.                    prov = curr;
  213.                    curr = curr->next;
  214.                  }
  215.              prov->next = t;//altrimenti inserisce l'elemento in coda
  216.              return l;    
  217.         }                      
  218. }
 

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