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.97
/
hash.txt
next >
Wrap
Text File
|
1999-03-11
|
3KB
|
133 lines
Prova di Laboratorio: Martedi' 17 Giugno
- Tabelle Hash -
Lo scopo dell'esercizio e' rappresentare mediante una tabella hash
un sottoinsieme I di numeri naturali.
Fissiamo la funzione di hashing h: Nat --> 0..M-1, con M stabilito a priori,
definita come h(x)=x modulo M (cioe' il resto della divisione di x per M).
In questo caso per tabella hash si intende un array T con indici 0...M
di liste di naturali (cioe' le chiavi coincidono con gli elementi
da rappresentare) tale che la lista in posizione T[i] contenga tutti gli
elementi x di I con h(x)=i.
Svolgimento dell'esercizio:
Considerate un file di input contenente i seguenti dati:
- Un intero N che denota la cardinalita' dell'insieme da rappresentare
con la tabella hash (cioe` quanti numeri leggere...);
- La sequenza di numeri (interi positivi) dell'insieme.
Allora:
1) Definite la struttura dati in C per rappresentare una tabella hash
utilizzando un array di LISTE, fissando M=8.
2) Leggete il nome del file di input (questo per poter provare con file
diversi).
3) Leggete i dati dal file di cui al passo 2) ed inserite gli elementi nella
tabella (senza ripetizioni) sulla base della funzione di hashing 'h'
definita qui sopra (in C il resto della divisione si ha con
l'operatore %).
4) Stampate la tabella di hash bucket per bucket.
Ad esempio, dato il file:
12
23 45 8 12 46 8 1 100 2 67 11 98
L'output deve contenere le seguenti informazioni:
Tabella:
0 ->8
1 ->1
2 ->98 2
3 ->11 67
4 ->100 12
5 ->45
6 ->46
7 ->23
%%%%%% Una possibile soluzione %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#include <stdio.h>
#include <string.h>
#define M 8
#define h(x) x%M
/* liste di adiacenza */
typedef struct cella* lista;
struct cella
{ int x;
lista next;
};
/* tabella di hashing: */
lista Tabella[M];
/* Tutto nel programma principale */
main()
{
FILE *in;
int E,N;
int v,w,V,W;
lista aux;
in=fopen("input","r");
fscanf(in,"%d",&N);
for (v=0;v<=N;v++) /* Inizializzo la tabella */
Tabella[v]=NULL;
/* Lettura e inserimento (nella tabella) degli archi */
if (in==stdin) printf("Elementi\n");
for (v=0;v<N;v++)
{
fscanf(in,"%d",&V);
aux=Tabella[h(V)];
/* Controllo se l'elemento esiste gia */
while (aux!=NULL && aux->x != V) aux=aux->next;
/* Se non c'e' lo aggiungo alla lista di V */
if (aux==NULL)
{
aux=(lista)malloc(sizeof(struct cella));
aux->x=V;
aux->next=NULL;
aux->next=Tabella[h(V)];
Tabella[h(V)]=aux;
E++;
}
}
/* Stampa della tabella */
printf("\nTabella:\n");
for (v=0;v<M;v++)
{
printf("%d ->",v);
aux=Tabella[v];
while(aux!=NULL)
{
printf("%d ",aux->x);
aux=aux->next;
}
printf("\n");
}
printf("\nNo. elementi:%d\n",E);
}