Problema tabelle hash

di il
20 risposte

20 Risposte - Pagina 2

  • Re: Problema tabelle hash

    void hashtable_delete (THashTable* ht, TKey key) {
        unsigned h = keyHash(key) % ht->bucket_number;
            TInfo info = {key};
                ht->bucket[h] = list_delete(ht->bucket[h], info);
                }
  • Re: Problema tabelle hash

    Prima ho postato le funzioni hashtable delete e search 

  • Re: Problema tabelle hash

    30/12/2023 - mario_243 ha scritto:


    Ho provato il codice ma mi elimina sempre tutti tranne 13:12 e 11:14 che sono nella lista 

    tu hai

    THashTable *ht = 10:10 - 16:16 - 14:14 - 11:14 - 23:25 - 13:12 

    e gli dici di eliminare 

    TList listkey        = 10:10 - 16:16 - 14:14              - 23:25

    giustamente rimane 11:14 e 13:12

  • Re: Problema tabelle hash

    E' corretto quello che ti ho detto nell'ultima cosa che ho postato? 

  • Re: Problema tabelle hash

    Quello che hai detto e giusto però se gli ordinassi di eliminare pure 11:14 e 13:12  dalla hashtable perché ipotizziamo che stanno pure nella Tlistkey?

  • Re: Problema tabelle hash

    Se quello che ho detto è corretto significa che tramile la lista TList listkey si comunica alla tabella THashTable *ht cosa  eliminare 

    rivedendo quel poco di codice che mi hai spedito ho trovato un bug, hashtable_delete(ht,listkey->info.key); e listkey=listkey->link;

    vanno messi dentro l'if , per il semplice motivo che setti TList listkey con dei valori che non sono presenti nella tabella THashTable *ht

    la funzione hashtable_search restituisce null con la conseguenza che vai a richiamare hashtable_delete con una coppia di chiavi che non esiste.

    non avendo il codice di list_delete non so' se quì dentro passandogli delle chiavi inesistenti ti esplode.

    CON BUG:

    void HTsplitList(THashTable *ht,TList listkey,TList *listOdd,TList *listEven){
       *listEven=list_create();
       *listOdd=list_create();
       while(listkey!=NULL){
         if(hashtable_search(ht,listkey->info.key)!=NULL){
             if(listkey->info.value %2==0)
             *listEven=list_insert(*listEven,listkey->info);
             else 
             *listOdd=list_insert(*listOdd,listkey->info);
         }    
         hashtable_delete(ht,listkey->info.key);
         listkey=listkey->link;
       }
       return;
    }

    CORRETTO:

    void HTsplitList(THashTable *ht,TList listkey,TList *listOdd,TList *listEven){
    	*listEven=list_create();
    	*listOdd=list_create();
    	while(listkey!=NULL){
    		if(hashtable_search(ht,listkey->info.key)!=NULL){
    			if(listkey->info.value %2==0)
    				*listEven=list_insert(*listEven,listkey->info);
    			else
    				*listOdd=list_insert(*listOdd,listkey->info);
    	
    			hashtable_delete(ht,listkey->info.key);
    			listkey=listkey->link;
    		}
    	}
    	return;
    }

    dalla descrizione che mi hai dato non ci dovrebbereo essere altre modifiche.

    Hai scritto tu questo codice ?

Devi accedere o registrarti per scrivere nel forum
20 risposte