Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    23

    Problema con tabella hash in [C]

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

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    20
    io il secondo while proprio non l'ho capito O_o
    io farei una cosa tipo:
    codice:
    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;
    }

  3. #3
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    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:

    codice:
    while(p -> info != x){
    Sei sicuro che nella lista incontrerai sicuramente un valore di info uguale a x?

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    23
    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!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.