Advertisement
Guest User

gestioneLista

a guest
Feb 12th, 2016
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.58 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct casella{
  5.     int proprietario;
  6.     struct casella* next;
  7. };
  8. typedef struct casella Casella;
  9. /*Dichiarazione funzioni e procedure*/
  10. Casella* inserimentoTesta(Casella*,int);
  11. Casella* inserimentoCoda (Casella*,int);
  12. Casella* cancellaTesta (Casella*);
  13. Casella* cancellaCoda (Casella*);
  14. void stampaRicorsiva(Casella*);
  15. void stampaIterativa(Casella*);
  16. void cancellaTuttoIterativa(Casella*);
  17. Casella* cancellaTuttoRicorsiva(Casella*);
  18. void aggiungiOrdinato(Casella*, int);//Aggiunge l'intero inserito prima del suo successivo.
  19.  
  20. int main()
  21. {
  22.     int num, scelta=0;
  23.     Casella *lista = NULL;
  24.  
  25.     do{
  26.         printf("\nProgramma per gestire una lista concatenata di interi.\n");
  27.         printf("\nCosa vuoi fare?\n1. Aggiungi in testa\n2. Aggiungi in coda\n3. Cancella testa\n4. Cancella coda"
  28.                 "\n5. Stampa ricorsiva\n6. Stampa iterativa\n7. Cancella tutto iterativamente "
  29.                 "\n8. Cancella tutto ricorsivamente\n9. Aggiungi ordinato\n0. Exit\n");
  30.         scanf("%d", &scelta);
  31.         switch(scelta){
  32.             case 1:
  33.                 do{
  34.                     printf("\nInserisci numero: ");
  35.                     scanf("%d", &num);
  36.                     if(num)
  37.                         lista = inserimentoTesta(lista,num);
  38.                 }while (num);
  39.                 break;
  40.             case 2:
  41.                 do{
  42.                     printf("\nInserisci numero: ");
  43.                     scanf("%d", &num);
  44.                     if(num)
  45.                         lista = inserimentoCoda(lista,num);
  46.                 }while (num);
  47.                 break;
  48.             case 3:
  49.                 lista = cancellaTesta(lista);
  50.                 break;
  51.             case 4:
  52.                 lista = cancellaCoda(lista);
  53.                 break;
  54.             case 5:
  55.                 stampaRicorsiva(lista);
  56.                 break;
  57.             case 6:
  58.                 stampaIterativa(lista);
  59.                 break;
  60.             case 7:
  61.                 cancellaTuttoIterativa(lista);
  62.                 break;
  63.             case 8:
  64.                 lista = cancellaTuttoRicorsiva(lista);
  65.                 break;
  66.             case 9:
  67.                 do{
  68.                     printf("\nInserisci numero: ");
  69.                     scanf("%d", &num);
  70.                     if(num)
  71.                         aggiungiOrdinato(lista, num);
  72.                 }while (num);
  73.                 break;
  74.  
  75.                 break;
  76.         }
  77.     }while(scelta);
  78.  
  79.     return 0;
  80. }
  81.  
  82. Casella* inserimentoTesta(Casella *lista, int num){    ///Inserimento in testa
  83.     Casella *nuovaCasella = NULL;
  84.     nuovaCasella = (Casella*)malloc(sizeof(Casella));
  85.     if (nuovaCasella==NULL){
  86.         printf("memoria non allocata");
  87.         exit(0);
  88.     }
  89.     nuovaCasella->proprietario=num;
  90.     nuovaCasella->next=lista;
  91.     return nuovaCasella;
  92. }
  93.  
  94. void stampaRicorsiva(Casella *lista){
  95.     if (lista!=NULL){
  96.         printf("\n%d ", lista->proprietario);
  97.         stampaRicorsiva(lista->next);
  98.     }
  99. }
  100.  
  101. void stampaIterativa(Casella *lista){
  102.     while (lista!=NULL){
  103.         printf("\n%d ", lista->proprietario);
  104.         lista=lista->next;
  105.     }
  106. }
  107.  
  108. Casella* inserimentoCoda (Casella* lista,int num){
  109.     Casella* aux = lista;
  110.     if(lista==NULL){
  111.         aux = inserimentoTesta(lista, num);
  112.     }
  113.     else{
  114.         while (lista->next != NULL)
  115.             lista = lista->next;
  116.         lista->next=inserimentoTesta(lista->next, num);
  117.     }
  118.     return aux;
  119. }
  120.  
  121. Casella* cancellaTesta(Casella* lista){
  122.     if (lista==NULL)
  123.         return lista;
  124.     Casella* aux = lista;
  125.     lista = aux->next;
  126.     free(aux);
  127.     return lista;
  128. }
  129.  
  130. Casella* cancellaCoda(Casella* lista){
  131.     Casella *aux = NULL;
  132.     while (lista != NULL){
  133.             aux=lista;
  134.             lista = lista->next;
  135.     }
  136.     free(aux);
  137.     return aux;
  138. }
  139.  
  140. void cancellaTuttoIterativa(Casella* lista){///da sistemare
  141.     Casella* aux=NULL;
  142.     while (lista!=NULL){
  143.         aux=lista;
  144.         lista=lista->next;
  145.         free(aux);
  146.     }
  147. }
  148.  
  149. Casella* cancellaTuttoRicorsiva(Casella* lista){
  150.     Casella* aux = NULL;
  151.     if (lista==NULL)
  152.         return NULL;
  153.     if (lista->next!=NULL){
  154.         lista->next=cancellaTuttoRicorsiva(lista->next);
  155.         }
  156.     aux=lista->next;
  157.     free(lista);
  158.     return aux;
  159. }
  160.  
  161. void aggiungiOrdinato(Casella* l, int num){
  162.     //passo come parametri: il puntatore alla lista ed il valore da inserire
  163.     Casella *prec, *corr, *nuovo;// dichiaro 3 puntatori per gli elementi precedente, corrente e nuovo.
  164.     nuovo = (Casella*)malloc(sizeof(Casella)); //alloco la memoria al nuovo elemento
  165.     if (nuovo!=NULL){//se l'allocazione va a buon fine...
  166.         nuovo->proprietario = num;//assegno il valore al nuovo elemento
  167.         nuovo->next = NULL;//e pongo a null il suo successore (superfluo?)
  168.         prec = NULL; //inizializzo il puntatore di supporto (superfluo?)
  169.         corr = l; //creo un alias del puntatore alla lista
  170.         while (corr != NULL && num > corr->proprietario){
  171.         //scorro la lista verificando se l'elemento è più grande
  172.                 prec = corr;//passo il valore dell'elemento corrente al supporto
  173.                 corr = corr->next;//e avanzo nella lista
  174.         }
  175.         if(prec==NULL){//se la lista e' vuota...
  176.             nuovo->next = l;
  177.             l = nuovo; //inserisco l'elemento in testa
  178.         }
  179.         else{//altrimenti inserisco l'elemento tra il precedente ed il successivo
  180.             prec->next=nuovo;
  181.             nuovo->next=corr;
  182.         }
  183.     }
  184.     else
  185.         printf("\nMemoria insufficiente!");
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement