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.01 / turno1 / parte3.c < prev    next >
C/C++ Source or Header  |  2001-09-04  |  2KB  |  139 lines

  1.  
  2.  
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. #define MAX 20
  8.  
  9. /* definizione dei tipi */
  10.  
  11. typedef  struct stackel * stack;    /* uno stack  e' un puntatore */
  12. typedef  struct stackel{ int el; stack next; } stck;
  13.  
  14. /* operazioni sullo stack */ 
  15.  
  16. stack   empty(void);    /* restituisce uno stack vuoto, cioe' restituisce NULL */
  17. stack push(int,stack);   /* aggiunge in testa        */
  18. void  print(stack);      /* stampa lo stack */
  19. stack makestackel(void);     /* alloca una nuova cella */
  20. stack pop_k(stack*,int); /* genera uno stack con le prime k posizioni dello stack in input */
  21. int pop(stack *);            /* toglie elemento in testa */
  22.  
  23. /* main */  
  24.  
  25. main()
  26. {
  27.   
  28.     FILE * fp;
  29.     char nome[MAX];
  30.     int n;
  31.     stack s;
  32.  
  33.   
  34.     /* creo stack vuoto */
  35.  
  36.     s = empty();
  37.  
  38.     /* leggo il nome del file */
  39.  
  40.     printf("Fornisci il nome del file: ");
  41.     scanf("%s", nome);
  42.  
  43.     /* apro il file in lettura */
  44.  
  45.     fp = fopen(nome,"r");
  46.  
  47.  
  48.     /* carico lo stack con i dati letti da file 
  49.      * (assumendo il file del formato corretto */
  50.  
  51.     while (fscanf(fp,"%d",&n) && n != -1)
  52.         s = push(n,s);
  53.  
  54.     /* stampo lo stack */
  55.  
  56.     print(s);
  57.  
  58.     /* leggo k */
  59.     printf("Fornisci k: ");
  60.     scanf("%d",&n);
  61.     printf("\nEcco il nuovo stack: ");
  62.     print(pop_k(&s,n));
  63.     printf("\nEcco il vecchio stack: ");
  64.     print(s);
  65. }
  66.  
  67.  
  68. /* funzioni */
  69.  
  70.  
  71. stack empty()
  72.  { 
  73.   return NULL;  
  74.  }
  75.  
  76.  
  77.  
  78. stack push(int el, stack s) 
  79.  { 
  80.    stack t;
  81.  
  82.    t=makestackel();      
  83.    t->el=el;
  84.    t->next=s;
  85.    return t; 
  86.  } 
  87.  
  88.  
  89.  
  90.  
  91.  
  92. stack makestackel(){ return (stack)malloc(sizeof(stck)); }
  93.  
  94.  
  95. void print(stack s) 
  96. {  
  97.     for(; s !=NULL ; s = s -> next)
  98.        printf(" %d",s->el);
  99.     printf("\n\n");
  100.  } 
  101.  
  102.  
  103. int pop(stack* s) 
  104.  { 
  105.    stack t;
  106.    int i;
  107.    if (*s == NULL) return -1;  
  108.    else 
  109.     {
  110.       t=*s;
  111.       i = (*s) ->el;    
  112.       *s=(*s)->next;
  113.       free(t);
  114.       return i; 
  115.     } 
  116.  } 
  117.  
  118.  
  119.  
  120.  
  121.  
  122. stack pop_k(stack* s,int k)
  123. {
  124.     int n = 0;
  125.     stack w = empty(), corr=*s;
  126.  
  127.     /* calcolo lunghezza stack*/
  128.  
  129.     for (; corr!= NULL; corr = corr -> next,n++);
  130.  
  131.     if (n>=k)
  132.     {    for (n=0;n < k; n++)
  133.             w= push(pop(s),w);
  134.         return w;
  135.     }
  136.     else 
  137.         return empty();
  138. }
  139.