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 >
Wrap
C/C++ Source or Header
|
2001-09-04
|
2KB
|
139 lines
#include <stdio.h>
#include <stdlib.h>
#define MAX 20
/* definizione dei tipi */
typedef struct stackel * stack; /* uno stack e' un puntatore */
typedef struct stackel{ int el; stack next; } stck;
/* operazioni sullo stack */
stack empty(void); /* restituisce uno stack vuoto, cioe' restituisce NULL */
stack push(int,stack); /* aggiunge in testa */
void print(stack); /* stampa lo stack */
stack makestackel(void); /* alloca una nuova cella */
stack pop_k(stack*,int); /* genera uno stack con le prime k posizioni dello stack in input */
int pop(stack *); /* toglie elemento in testa */
/* main */
main()
{
FILE * fp;
char nome[MAX];
int n;
stack s;
/* creo stack vuoto */
s = empty();
/* leggo il nome del file */
printf("Fornisci il nome del file: ");
scanf("%s", nome);
/* apro il file in lettura */
fp = fopen(nome,"r");
/* carico lo stack con i dati letti da file
* (assumendo il file del formato corretto */
while (fscanf(fp,"%d",&n) && n != -1)
s = push(n,s);
/* stampo lo stack */
print(s);
/* leggo k */
printf("Fornisci k: ");
scanf("%d",&n);
printf("\nEcco il nuovo stack: ");
print(pop_k(&s,n));
printf("\nEcco il vecchio stack: ");
print(s);
}
/* funzioni */
stack empty()
{
return NULL;
}
stack push(int el, stack s)
{
stack t;
t=makestackel();
t->el=el;
t->next=s;
return t;
}
stack makestackel(){ return (stack)malloc(sizeof(stck)); }
void print(stack s)
{
for(; s !=NULL ; s = s -> next)
printf(" %d",s->el);
printf("\n\n");
}
int pop(stack* s)
{
stack t;
int i;
if (*s == NULL) return -1;
else
{
t=*s;
i = (*s) ->el;
*s=(*s)->next;
free(t);
return i;
}
}
stack pop_k(stack* s,int k)
{
int n = 0;
stack w = empty(), corr=*s;
/* calcolo lunghezza stack*/
for (; corr!= NULL; corr = corr -> next,n++);
if (n>=k)
{ for (n=0;n < k; n++)
w= push(pop(s),w);
return w;
}
else
return empty();
}