home *** CD-ROM | disk | FTP | other *** search
/ ftp.disi.unige.it / 2015-02-11.ftp.disi.unige.it.tar / ftp.disi.unige.it / pub / .person / CataniaB / teach-act / testi-esami / labo-6.98 / turno1 / parte2.c < prev    next >
C/C++ Source or Header  |  1999-03-11  |  2KB  |  111 lines

  1. /* Esame 18 giugno '98 - turno 1 - parte 2 */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. #define MAX 30
  7.  
  8. typedef struct link *list;
  9.  
  10. struct link
  11. {
  12.   int el;
  13.   list next;
  14. };
  15.  
  16. void insert(int i, list *l)
  17. {
  18.   list current, previous, new;
  19.  
  20.   /* creazione nuova cella */
  21.   /* nota bene: posso farlo subito perche` voglio le ripetizioni */
  22.   new=(list) malloc(sizeof(struct link)); 
  23.   new->el=i;
  24.   /* new->next deve essere ancora determinato */
  25.   
  26.   /* ricerca punto di inserimento */
  27.   current=*l;                           
  28.   previous=NULL; /* nessuna posizione precedente a quella di testa! */
  29.   while (current!=NULL && i>current->el) /* attenzione all'ordine dell'and! */
  30.     {
  31.       previous=current;
  32.       current=current->next;
  33.     }
  34.   /* inserimento tra previous e current */
  35.   if (previous==NULL) /* inserimento in testa */
  36.     *l=new;
  37.   else                /* inserimento in mezzo od in coda */
  38.     previous->next=new;
  39.   new->next=current;  /* stessa istruzione per entrambi i casi */
  40. }
  41.  
  42. void print(list l)
  43. {
  44.   for(;l!=NULL;l=l->next)
  45.     printf("%d ",l->el);
  46.   printf("\n");
  47. }
  48.  
  49. /* dispose: versione ricorsiva */
  50.  
  51. void dispose(list *l)
  52. {
  53.   if (*l!=NULL)
  54.     {
  55.       dispose(&((*l)->next));
  56.       *l=NULL;
  57.     }
  58. }
  59.  
  60.  
  61. /* dispose: versione iterativa
  62.  
  63. void dispose(list *l)
  64. {
  65.   list temp,current;
  66.  
  67.   current=*l;
  68.   
  69.   while (current!=NULL)
  70.     {
  71.       temp=current;
  72.       current=current->next;
  73.       free(temp);
  74.     }
  75.   *l=NULL;
  76. }
  77.  
  78. fine versione iterativa */
  79.  
  80. int main(void)
  81. {
  82.   char fname[MAX];
  83.   list l=NULL;
  84.   FILE *fd=NULL;
  85.   int i;
  86.  
  87.   printf("Enter file name: ");
  88.   scanf("%s",fname);
  89.   if (fd=fopen(fname,"r"))
  90.     {
  91.       while (fscanf(fd,"%d",&i)==1 && i!=-1)
  92.       insert(i,&l);
  93.       printf("List from file %s: ",fname);
  94.       print(l);
  95.       dispose(&l);
  96.       printf("List after the deallocation: ");
  97.       print(l);
  98.     }
  99.   else
  100.     printf("Error opening file %s\n",fname);
  101. }
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.