Algortimi e strutture dati

Messaggioda giacomovicinanza » 26/04/2022, 10:49

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

Immagine
Immagine
giacomovicinanza
Junior Member
Junior Member
 
Messaggio: 109 di 218
Iscritto il: 18/08/2021, 15:55

Re: Algortimi e strutture dati

Messaggioda apatriarca » 27/04/2022, 05:13

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.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5664 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Algortimi e strutture dati

Messaggioda giacomovicinanza » 27/04/2022, 13:56

Codice:
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
giacomovicinanza
Junior Member
Junior Member
 
Messaggio: 110 di 218
Iscritto il: 18/08/2021, 15:55

Re: Algortimi e strutture dati

Messaggioda vict85 » 27/04/2022, 17:03

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:
Codice:
    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 > e < 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:
Codice:
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.
vict85
Moderatore
Moderatore
 
Messaggio: 10608 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: Algortimi e strutture dati

Messaggioda giacomovicinanza » 28/04/2022, 07:48

Capito grazie mille. Più che altro faccio fatica a comprendere :/
giacomovicinanza
Junior Member
Junior Member
 
Messaggio: 112 di 218
Iscritto il: 18/08/2021, 15:55

Re: Algortimi e strutture dati

Messaggioda apatriarca » 28/04/2022, 18:34

Quali difficoltà incontri nella comprensione dei concetti? Forse ti possiamo aiutare.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5666 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Algortimi e strutture dati

Messaggioda giacomovicinanza » 09/05/2022, 17:35

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

Codice:
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]);
    }
}
giacomovicinanza
Junior Member
Junior Member
 
Messaggio: 114 di 218
Iscritto il: 18/08/2021, 15:55

Re: Algortimi e strutture dati

Messaggioda giacomovicinanza » 09/05/2022, 17:36

apatriarca ha scritto: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
giacomovicinanza
Junior Member
Junior Member
 
Messaggio: 115 di 218
Iscritto il: 18/08/2021, 15:55

Re: Algortimi e strutture dati

Messaggioda giacomovicinanza » 09/05/2022, 18:02

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).
Codice:
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;
   
}
giacomovicinanza
Junior Member
Junior Member
 
Messaggio: 117 di 218
Iscritto il: 18/08/2021, 15:55

Re: Algortimi e strutture dati

Messaggioda apatriarca » 10/05/2022, 16:22

L'operatore % 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..
apatriarca
Moderatore
Moderatore
 
Messaggio: 5667 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite