PDA

Visualizza la versione completa : [C] Funzione con tabelle hash


Pumpi
02-06-2012, 21:28
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?



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); }
}

Mond0
04-06-2012, 12:18
io il secondo while proprio non l'ho capito O_o
io farei una cosa tipo:


int i = hash(x,ht);
int_list*p = ht -> h_table[i];
int_list*q = ht -> h_table[i];
if(p==NULL) return;
if(p->info == x){
ht->h_table[i] = p->next;
free(p);
return;
}
p=p->next;
for(p; p==NULL; p = p->next){
if(p->info == x){
q->next = p->next;
free(p);
break;
}
q=q->next;
}

Who am I
04-06-2012, 15:39
Ovviamente uno non può capire cosa non va solo da questo codice, serve tutto il codice.Certi errori potrebbero essere causati da altre funzioni, inoltre non so come è fatta la struttura hash_table.

Comunque:



while(p -> info != x){


Sei sicuro che nella lista incontrerai sicuramente un valore di info uguale a x?

Pumpi
05-06-2012, 18:31
Grazie a tutti!!!avevo fatto un disastro con il while, ma effettivamente ne basta uno, anche perchè bastava controllare finchè p->info era uguale a x, ora ho risolto sbattendoci la testa!!!

Loading