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-7.99
/
turno1
/
parte1.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-07-14
|
2KB
|
142 lines
/* Esame 8 luglio '99 - turno 1 - parte 1 */
#include <stdio.h>
#include <stdlib.h>
#define MAX 30
typedef struct cell *list ;
struct cell
{
float el;
list next;
};
static int h(float,int);
void insert(float,list*,int);
void print(list*,int);
list* empty(int);
static int h(float i, int n)
{
int m;
m = i;
return m % n;
}
list * empty(int n)
{
return (list *) calloc(n,sizeof(list));
}
void insert(float i, list t[],int n)
{
int b=h(i,n);
list l=t[b],aux, prec=NULL;
// alloco la nuova cella la nuova cella
aux=(list) malloc(sizeof(struct cell));
aux->el=i;
// scandisco la lista per trovare la posizione in cui inserire la nuova cella
while (l!=NULL && l->el<i)
{
prec=l;
l=l->next;
}
if (prec == NULL && (l == NULL || l ->el !=i)) // inserimento in testa
{
aux->next=t[b];
t[b]=aux;
return;
}
if (l == NULL) // inserimento in fondo
{
prec ->next = aux;
aux ->next = NULL;
return;
}
/* se le prime due condizioni non sono verificate, l'inserimento
deve essere effettuato nel mezzo della lista */
if (l->el !=i) /* l'elemento non e` gia` presente */
{
prec ->next = aux;
aux ->next = l;
}
}
void print(list t[],int n)
{
int i;
list l;
for (i=0;i<n;i++)
{
printf("\n%d: ",i);
for(l=t[i];l!=NULL;l=l->next)
printf("%f ",l->el);
printf("\n");
}
}
void main(void)
{
char fname[MAX];
list *t;
FILE *fd=NULL;
float i;
int n;
printf("\nFornisci la dimensione della tabella: ");
scanf("%d",&n);
// inizializzo tabella
t = empty(n);
printf("\n\nFornisci il nome del file: ");
scanf("%s",fname);
if (fd=fopen(fname,"r"))
{
while (fscanf(fd,"%f",&i)==1 && i!=0)
insert(i,t,n);
print(t,n);
fclose(fd);
}
else
printf("Error opening file %s\n",fname);
}