Salve a tutti!
Avrei bisogno di un aiuto, in quanto in teoria mi è tutto chiaro dallo studio, ma in pratica ho grosse difficoltà a scrivere correttamente alcune brevi funzioni di qualche riga di codice riguardanti gli argomenti nel titolo.
typedef struct int_list{
int info;
struct int_list *next;
} int_list;
//Definizione della struttura hast_table - NON MODIFICARE
typedef struct hash_table{
//vettore di puntatori a lista di interi
int_list **h_table;
//dimensione del vettore di puntatori h_table
int t_size;
//numero di elementi contenuti nella tabella
int n_elem;
} hash_table;
Questo di sopra è la parte del programma che riguarda la definizione delle strutture in input alle funzioni, queste di sotto sono le funzioni.
/*
Funzione di creazione ed inizializzazione di una tabella hash.
La funzione prende in input la dimensione del vettore di puntatori della tabella da creare e restituisce
il puntatore alla struttura hash_table allocata.
La funzione deve:
- Allocare la zona di memoria per la struttura hash_table
- Allocare il vettore di puntatori a int_list della hash_table
- Inizializzare i puntatori del vettore a NULL
- Inizializzare t_size a size e n_elem a 0.
*/
hash_table * create_hash_table(int size){
hash_table* ht = (hash_table*)malloc(sizeof(hash_table));
ht->h_table = (int_list **)malloc(sizeof(int_list *) * size);
int i;
for (i = 0; i < size; i++)
ht->h_table[i]=NULL;
ht->t_size=size;
ht->n_elem=0;
}
/*
Funzione di inserimento nella tabella hash.
La funzione prende ininput la hash_table ed il valore intero da inserire.
La funzione deve:
- Allocare una zona di memoria per il nuovo elemento della lista
- Porre il valore info dell'elemento allocato ad x
- Inserire l'elemento IN TESTA alla lista con indice hash(x,ht)
- Aggiornare n_elem
*/
void insert(hash_table *ht, int x){
int i = hash(x, ht);
int_list *new_element = malloc(sizeof(int_list));
new_element->info = x;
new_element->next = ht->h_table[i];
ht->h_table[i] = new_element;
ht->n_elem++;
}
/*
Funzione di eliminazione delle occorrenze di un valore
La funzione prende in input la tabella hash ed il valore da eliminare
La funzione deve:
- Rimuovere tutti gli elementi con valore x dalla tabella. Tali elementi, se esistono, si troveranno nel bucket con indice h(x,ht)
- Aggiornare n_elem
Ricordarsi di deallocare la memoria degli elementi rimossi.
*/
void delete(hash_table *ht, int x){
int i,j;
for (i=0; i< ht->n_elem;i++) {
if (ht->h_table==x) {
for (j = i +1; i < ht->n_elem; i++)
{ht->h_table[j-1] = ht->h_table[j];}
ht->n_elem--;
}
}
/*
Funzione di individuazione del bucket piu' pieno
La funzione prende in input la tabella hash e ritorna l'indice del bucket che
contiene il maggior numero di elementi.
Nel caso in cui vi siano piu'bucket con lo stesso numero di elementi, si deve ritornare l'indice del bucket
con indice minore tra quelli aventi il numero massimo di elementi.
*/
int index_max_bucket(hash_table *ht){
}
Per l'ultima funzione purtroppo non capisco come riferirmi in linguaggio praticamente al bucket.
Vi prego di dare un occhiata e spiegarmi gli errori che commetto e come posso porvi rimedio, grazie mille a tutti per la disponibilità.
In allegato, inserisco il file in *.c
Grazie a tutti di nuovo,
ciao!