Algortimi e strutture dati
Salve a tutti. Sto riscontrando alcuni problemi con questo esercizio. Non riesco a risolvere gli errori che si presentano. Qualcuno potrebbe aiutarmi dandomi alcuni suggerimenti? Ringrazio chi mi aiuterà
Nel link che ho postato ci sono le Struct necessiare
https://onlinegdb.com/QR3W9nCz_
In allegato ci sono anche gli errori

Nel link che ho postato ci sono le Struct necessiare
https://onlinegdb.com/QR3W9nCz_
In allegato ci sono anche gli errori


Risposte
Gli errori mi sembrano abbastanza chiari, che cosa non capisci esattamente? Il codice è di una certa lunghezza per cui la sua risoluzione richiede un po' di tempo. Avere qualche indicazione in più su quali sono le tue difficoltà potrebbe probabilmente velocizzare la cosa.
void HTtoArray_range(THT* ht, TArray* array, TKey min, TKey max) { TList list = listCreate(); TInfo imin = {min}, imax = {max}; for (int i = 0; i < ht->n_bucket; i++) for (TNode *node = ht->bucket[i]; node != NULL; node = node->link) if (!infoLess(node->info, imin) && !infoGreater(node->info, imax)) arraySet(ht, array->info.key, array->info.value); ht = HTdelete(ht, ht->info); }
E' questa funzione che mi crea problemi il arrayset non capisco come risolverlo
Ti complichi un po' la vita. Dovresti cercare di capire quel che fanno le varie funzioni del professore, ogni tanto sembri andare a caso.
Per aggiungere gli elementi puoi fare qualcosa come:
Alternativamente puoi anche fare qualcosa come:
È difficile dire quale sia il migliore a priori, dipende un po' da quanto sono distanti min e max e da quanti elementi ci sono nella tabella.
Per aggiungere gli elementi puoi fare qualcosa come:
for (int i = 0; i < ht->n_bucket; i++) { for (TNode *node = ht->bucket[i]; node != NULL; node = node->link) { if (node->info.key >= min && node->info.key <= max) { arrayAdd(array, node->info); } } }o con [inline]>[/inline] e [inline]<[/inline] se i limiti vanno esclusi. Poi basta che iteri sull'array ed elimini dentro la hash table usando le key.
Alternativamente puoi anche fare qualcosa come:
void HTtoArray_range2(THT *ht, TArray *array, TKey min, TKey max) { for( TKey key = min; key <= max; key++ ) { TValue* value = HTsearch (ht, min); if( value ) { TInfo info; info.key = key; info.value = *value; arrayAdd(array, info); HTdelete(ht, key); } } }
È difficile dire quale sia il migliore a priori, dipende un po' da quanto sono distanti min e max e da quanti elementi ci sono nella tabella.
Capito grazie mille. Più che altro faccio fatica a comprendere :/
Quali difficoltà incontri nella comprensione dei concetti? Forse ti possiamo aiutare.
Https://onlinegdb.com/evG7QTqb2 Qui è il codice aggiornato
L'unico intoppo è che non stampa i pazienti con esenzione in elenco 3 a causa della funzione ma non capisco come posso migliorarla affinchè possa funzionare
L'unico intoppo è che non stampa i pazienti con esenzione in elenco 3 a causa della funzione ma non capisco come posso migliorarla affinchè possa funzionare
void printOrderedArray_exemptions(TArray* array) { int i; TList list_ord = listCreate(); for(i=0; i<array->length; i++){ list_ord = listInsert(list_ord, array->items[i]); } }
"apatriarca":
Quali difficoltà incontri nella comprensione dei concetti? Forse ti possiamo aiutare.
Sicuramente dovrò ristudiare i puntatori ed le funzioni perchè capita che molte volte mi blocco dato che non so come procedere
Comunque ho notato che questa funzione sposta tutti i pazienti con ID pari forse perchè ho inserito la divisione per 2 però il problema è non so come verificare l'ultima cifra
BSTtoHT_exemption(bst, ht): funzione RICORSIVA che copia da bst a ht tutti i
* pazienti con ID la cui ultima cifra sia 0, rimuovendoli da bst.
* Considerando l'ID, se un paziente di bst gia' esiste in ht esso non verra'
* duplicato (ma verra' comunque rimosso da bst).
BSTtoHT_exemption(bst, ht): funzione RICORSIVA che copia da bst a ht tutti i
* pazienti con ID la cui ultima cifra sia 0, rimuovendoli da bst.
* Considerando l'ID, se un paziente di bst gia' esiste in ht esso non verra'
* duplicato (ma verra' comunque rimosso da bst).
TBST BSTtoHT_exemption(TBST bst, THT* ht) { if (bst != NULL) { bst->left = BSTtoHT_exemption(bst->left, ht); bst->right = BSTtoHT_exemption(bst->right, ht); if ((bst->info.key%2) == 0) { HTinsert(ht, bst->info.key, bst->info.value); bst = BSTdelete(bst, bst->info); } } return bst; }
L'operatore [tt]%[/tt] non è una divisione! Calcola il RESTO della divisione, cioè qualcosa di simile al modulo (le due operazioni differiscono quando almeno uno dei numeri è negativo). L'esercizio ti chiede di considerare l'ultima cifra di un numero e l'idea di usare l'operazione di resto per farlo è corretta. Tuttavia non mi è chiaro perché hai deciso di usare 2 invece di 10. Non ti chiede se il numero è pari o l'ultima cifra binaria, ti chiede l'ultima cifra DECIMALE e quindi devi usare 10..