Advertisement
Guest User

Untitled

a guest
Jan 27th, 2015
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.64 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. struct ElementoDiLista
  5. {
  6.     int info;
  7.     struct ElementoDiLista *next;
  8. };
  9.  
  10. typedef struct ElementoDiLista *lista;
  11.  
  12. void add_coda(lista *l,int x);
  13. void add_cima(lista *l,int x);
  14. void canc_el(lista *l,int x);
  15. void stampa_lista(lista l);
  16.  
  17. int main()
  18. {
  19.     int x;
  20.     lista l=NULL;
  21.     scanf("%d",&x);
  22.  
  23.     while(x!=0)
  24.     {
  25.         scanf("%d",&x);
  26.         if(x<0)
  27.         {
  28.             canc_el(&l,-x);
  29.         }
  30.         else if(x>0 && x%2==0)
  31.         {
  32.             add_cima(&l,x);
  33.         }
  34.         else if(x>0 && x%2!=0)
  35.         {
  36.             add_coda(&l,x);    
  37.         }
  38.     }
  39.  
  40.     scanf("%d",&x);
  41.     if(x==0)
  42.     {
  43.         stampa_lista(l);
  44.     }
  45.  
  46.     return 0;
  47.     free(l);
  48. }
  49.  
  50. void add_coda(lista *l,int x)
  51. {
  52.     lista new=malloc(sizeof(struct ElementoDiLista));
  53.     new->info=x;    //assegno alla nuova variabile il valore dell'elemento da aggiungere
  54.     new->next=NULL; //new è l'ultimo elemento della lista
  55.     if(*l==NULL)
  56.     *l=new;
  57.     else
  58.     {
  59.         lista aus=*l;   //uso una lista ausiliaria per scorrere la lista
  60.         while(aus->next!=NULL)  //finchè non arrivo all'ultimo elemento della lista ausiliaria...
  61.         {
  62.             aus=aus->next;      //...scorro la lista
  63.         }
  64.         aus->next=new;  //siamo fuori dal while, quindi aus è l'ultimo elemento e aus->next prende il valore di a
  65.         free(aus);
  66.     }
  67. }
  68.  
  69. void add_cima(lista *l,int x)
  70. {
  71.     lista new=malloc(sizeof(struct ElementoDiLista));
  72.     new->info=x;    //nuova variabile con il valore dell'intero da aggiungere
  73.     new->next=*l;   //vedo che new è il primo elemento infatti new->next è il primo valore della lista data
  74.     *l=new;
  75. }
  76.  
  77. void canc_el(lista *l,int x)
  78. {
  79.     if(*l!=NULL)
  80.     {
  81.         if((*l)->info==x)   //se l'elemento puntato contiene x...
  82.         {      
  83.             lista aus=*l;   //...inizializzo una variabile aus che mi permette di eliminare l'elemento senza modificare la lista
  84.             *l=(*l)->next;  //scorro all'elemento successivo
  85.             free(aus);  //libero l'elemento voluto nella lista ausiliaria non modificando l'altra
  86.         }
  87.         else    //altrimenti
  88.         {
  89.             lista prec=*l;  //elemento precedente
  90.             lista corr=(*l)->next;  //elemento corrente
  91.             int trovato=0;
  92.         while(corr!=NULL && trovato==0) //finchè l'elemento corrente non è NULL e trovato=0...
  93.         if(prec->info==x)   //se l'elemento precedente contiene x
  94.             {
  95.                 trovato=1;
  96.             }
  97.         else    //altrimenti
  98.         {
  99.             prec=corr;  //l'elemento precedente diventa quello corrente...
  100.             corr=corr->next;    //...quello corrente diventa il successivo
  101.         }
  102.  
  103.         if(trovato==1)  //se trovato =1...
  104.         {
  105.             prec->next=corr->next;  //il precedente diventa corrente e il corrente diventa il successivo   
  106.             free(corr); //si libera l'elemento corrente
  107.         }
  108.         }
  109.     }
  110. }
  111.  
  112. void stampa_lista(lista l)
  113. {
  114.     if(l!=0)
  115.     {  
  116.         while(l!=NULL)
  117.         {
  118.             printf("%d\n",l->info);
  119.             l=l->next;
  120.         }
  121.     }
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement