Salve a tutti! Ho un problema con una funzione di un programma che riguarda le tabelle hash.
Una tabella hash e' una struttura hash_table che contiene:
- Un vettore di puntatori a lista di interi
- Un valore t_size rappresentante la dimensione del vettore di puntatori
- Un valore n_elem rappresentante il numero di elementi attualmente presenti nella tabella
Tale tabella sara' gestita con liste di trabocco, quindi ogni bucket della tabella e' un puntatore alla testa della lista contenente gli elementi che, secondo la funzione hash utilizzata, sono stati inseriti in quel bucket. Gli elementi inseriti, quindi, saranno memorizzati come elementi di una lista di interi int_list.
Questa funzione che dovrei scrivere dovrebbe eliminare gli elementi di valore x, e questi valori dovrebbero trovarsi in un bucket con indice h(x,ht), e poi dovrei aggiornare n_elem e per ultimo dovrei deallocare la memoria degli elementi rimossi, questo è il codice che ho scritto, ma va in loop e non capisco il perchè, qualcuno può aiutarmi?
codice:
void delete(hash_table *ht, int x){
int_list*p = ht -> h_table[hash(x,ht)];
int_list*q = ht -> h_table[hash(x,ht)]; //puntatori che puntano al primo elemento della lista
if(p == NULL) return; //se la lista è vuota non ho problemi e non devo eliminare niente
while(p -> info == x){
p = p -> next;
ht -> h_table[hash(x,ht)] = p;
free(q);
q = p;
--(ht -> n_elem); //l'idea è che se trovo al primo elemento la x devo deallocare
lo spazio di memoria e spostare il puntatore p al suo successivo
per far scorrere ogni elemeno ed eliminare le x
}
while(p -> info != x){
p = p -> next;
ht -> h_table[hash(x,ht)] = q;
q = p -> next;
free(p);
--(ht -> n_elem); }
}