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.99
/
turno2
/
parte4.c
< prev
Wrap
C/C++ Source or Header
|
1999-06-16
|
3KB
|
159 lines
/* Una possibile soluzione Esame di Laboratorio di Algoritmi 15 giugno 1999
* Turno 2 */
/* Tipo di dato coda implementato in modo molto semplice ed inefficiente: liste,
la testa della coda e' in fondo alla lista, quindi per cancellare devo scandire
la coda. Questa implementazione era comunque accettabile e confrontabile come
complessita' all'esercizio del turno 1
Implementazioni alternative: puntatore al primo e ultimo elemento della coda,
liste linkate.
Provare per esercizio */
#include <stdio.h>
#include <stdlib.h>
#define MAX 20
/* definizione dei tipi */
typedef struct codael * coda; /* una coda e' un puntatore */
typedef struct codael{ int el; coda next; } cdl;
/* operazioni sulla coda */
coda empty(void); /* restituisce una coda vuota, cioe' restituisce NULL
*/
coda in_coda(int,coda); /* aggiunge in coda */
void print(coda); /* stampa la coda */
coda makecodael(void); /* alloca una nuova cella */
void pos_neg(coda s, coda * s1, coda * s2);
/* main */
main()
{
FILE * fp;
char nome[MAX];
int n;
coda s,s1=empty(),s2=empty();
/* creo coda vuota */
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 la coda con i dati letti da file
* (assumendo il file del formato corretto */
while (fscanf(fp,"%d",&n) && n != 0)
s = in_coda(n,s);
/* stampo la coda */
print(s);
/* creo le nuove code */
pos_neg(s,&s1,&s2);
/* stampo le nuove code */
print(s1);
print(s2);
}
/* funzioni */
coda empty()
{
return NULL;
}
coda in_coda(int el, coda s)
{
coda t;
t=makecodael();
t->el=el;
t->next=s;
return t;
}
coda makecodael(){ return (coda)malloc(sizeof(cdl)); }
void print(coda s)
{
printf("\nLa coda ha il seguente contenuto: ");
for(; s !=NULL ; s = s -> next)
printf(" %d",s->el);
printf("\n\n");
}
void pos_neg(coda s, coda * s1, coda * s2)
{
coda aux1=empty(),aux2=empty();
for (; s != empty(); s = s-> next)
{
if (s->el > 0) /* elemento positivo */
if (aux1 == empty()) /*primo elemento */
{
*s1 = s;
aux1 = s;
}
else /* elementi successivi */
{
aux1 -> next = s;
aux1 = s;
}
else /* elemento negativo */
if (aux2 == empty()) /*primo elemento */
{
*s2 = s;
aux2 = s;
}
else /* elementi successivi */
{
aux2 -> next = s;
aux2 = s;
}
}
if (aux1 != empty())
aux1->next = empty();
if (aux2 != empty())
aux2 -> next = empty();
}