Algortimi e strutture dati

di il
5 risposte

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/_2YtSxup

In allegato ci sono anche gli errori
/* 
 *  Una biblioteca deve riorganizzare alcuni elenchi di libri tra cui elenco1 
 * (un BST), elenco2 (una HT) ed elenco3 (una lista).
 * In ciascuna struttura un libro e' rappresentato da
 * un codice ISBN numerico (campo chiave) e da un titolo. 
 * 
 * Si dovra' realizzare un programma che individui tutti i libri presenti in 
 * entrambi gli elenchi, li stampi in ordine crescente di ISBN (completare nella
 * funzione main) e che sostituisca in elenco2
 * il codice ISBN di un libro in base al titolo.
 * Infine, da elenco3 verranno rimossi tutti i libri con ISBN pari e anche l'elemento
 * con ISBN piu' piccolo.
 * Per realizzare tale programma occorre sviluppare le seguenti funzioni.
 * 
 * 1) BSTHTdupList(bst, ht, list): funzione RICORSIVA che copia in list (lista 
 *    ordinata) tutti i libri che sono presenti contemporaneamente sia in bst che 
 *    in ht (fa fede il codice ISBN).
 * 
 * 2) HTchangeKey(ht, value, newKey): funzione ITERATIVA che sostituisce in ht
 *    la chiave associata a value con la nuova chiave newKey.
 *    Se value non e' presente in ht allora non fa nulla.
 *    Se value compare piu' di una volta in ht allora alle fine ci sara' una sola
 *    coppia (newKey, value). Se newKey e' gia' presente in ht allora il vecchio valore
 *    viene rimosso e poi viene inserito il nuovo valore.
 *
 * 3) listDeleteEven(list): funzione RICORSIVA che elimina da list tutti i 
 *    libri con ISBN pari. Restituisce la lista aggiornata.
 *
 * 4) deleteMinList(list): funzione che elimina il libro con ISBN piu' basso.
 */

#include <stdio.h>
#include <string.h>
#include "THT.h"
#include "TBST.h"
#include "TArray.h"
#include "TList.h"

TList BSTHTdupList(TBST bst, THT *ht, TList list) {
    //CASO BASE: l'albero è vuoto, niente da aggiungere
    if(bst != NULL) {
        //DIVIDE E COMBINA: aggiungo il sotto-albero sinistro (elementi minori)
        list = BSTHTdupList(bst->left, ht, list);
        bst->left = BSTHTdupList(bst->left, ht, list);
        //Aggiungo l'elemento
        list = listInsert(list, bst->info);
        //Aggiungo il sotto-albero destro (elementi maggiori)
        list = BSTHTdupList(bst->right, ht, list);
        bst->right = BSTHTdupList(bst->right, ht, list); 
    }
    return list;
}

void HTchangeKey(THT* ht, TValue value, TKey newKey) {
     TList list = listCreate();
        TNode* node = nodeCreate(list->info);
    if (list == NULL)
        return;
        for (int i = 0; i < ht->n_bucket; i++)
        for (TNode *node = ht->bucket[i]; node != NULL; node = node->link)
                if (HTsearch(ht, list->info.key) == NULL)
                HTinsert(ht, list->info.value, list->info.key);
                list = listInsert(list,node->info);

}

TList listDeleteEven(TList list) {
        /* Caso Base */
    if(list == NULL) {
        return list;
    }
    
    /* Divide et Impera */
    TList tail = listDeleteEven(list->link);
    
    if(listDeleteEven(list->info))
    list->link = tail;
    else {
        nodeDestroy(list);
        list = tail;
    }
    /* Combina */
    return list;
}

TList deleteMinList(TList list) {
    TNode* curr = list;
    TNode* prev;
    
    /* Ricerca degli elementi da cancellare */
    while(curr != NULL) {
        if(infoGreater(curr->info, min) && infoLess(curr->info, max)) {
            prev = curr;
            list = listDelete(list, curr->info);
            curr = prev->link;
        } else curr = curr->link;
    }
    return list;

}

int main() {
    TBST elenco1 = BSTcreate();
    elenco1 = BSTinsert(elenco1, (TInfo) {1321, "Le mille e una notte"});
    elenco1 = BSTinsert(elenco1, (TInfo) {2372, "Orgoglio e pregiudizio"});
    elenco1 = BSTinsert(elenco1, (TInfo) {3432, "Finzioni"});
    elenco1 = BSTinsert(elenco1, (TInfo) {4223, "Delitto e castigo"});
    elenco1 = BSTinsert(elenco1, (TInfo) {1445, "Il processo"});
    elenco1 = BSTinsert(elenco1, (TInfo) {2234, "Madame Bovary"});
    elenco1 = BSTinsert(elenco1, (TInfo) {1238, "L'amore ai tempi del colera"});
    elenco1 = BSTinsert(elenco1, (TInfo) {6643, "Il vecchio e il mare"});
    elenco1 = BSTinsert(elenco1, (TInfo) {1111, "Anna Karenina"});

    THT* elenco2 = HTcreate(5);
    HTinsert(elenco2, 3357, (TValue) {"Il rosso e il nero"});
    HTinsert(elenco2, 7675, (TValue) {"Alla ricerca del tempo perduto"});
    HTinsert(elenco2, 4222, (TValue) {"Moby-Dick"});
    HTinsert(elenco2, 1445, (TValue) {"Il processo"});
    HTinsert(elenco2, 3233, (TValue) {"Pippi Calzelunghe"});
    HTinsert(elenco2, 3321, (TValue) {"L'uomo senza qualita'"});
    HTinsert(elenco2, 1111, (TValue) {"Anna Karenina"});
    HTinsert(elenco2, 9090, (TValue) {"Le metamorfosi"});
    HTinsert(elenco2, 3432, (TValue) {"Finzioni"});

    printf("Libri in elenco1 (BST):\n");
    BSTprint(elenco1);
    printf("\nLibri in elenco2 (HT):\n");
    HTprint(elenco2);

    TList elenco3 = listCreate();
    printf("\nCopio in elenco3 (lista) i libri contenuti sia in elenco1 che elenco2.");
    elenco3 = BSTHTdupList (elenco1, elenco2, elenco3);
    printf("\nLibri in elenco3 in ordine crescente di ISBN:\n");
    
    /* Completare con la chiamata a funzione corretta */
    listPrint(elenco3);

    TValue titolo = (TValue) {"Il processo"};
    TKey nuovoISBN = 1000;
    printf("\nCambio in elenco2 (HT) il codice di '%s' in %d", titolo.titolo, nuovoISBN);
    HTchangeKey(elenco2, titolo, nuovoISBN);
    printf("\nLibri in elenco2 dopo la modifica:\n");
    HTprint(elenco2);

    elenco3 = listDeleteEven(elenco3);
    printf("\nStudenti in elenco3 (Lista)\n(dopo aver rimosso gli ISBN pari)\n");
    listPrint(elenco3);
    
    elenco3 = deleteMinList(elenco3);
    printf("\nLibri in elenco3 (Lista)\n(tutti quelli di elenco3 tranne ISBN piu' basso)\n");
    listPrint(elenco3);

    BSTdestroy(elenco1);
    HTdestroy(elenco2);
    listDestroy(elenco3);
    return 0;
}

Allegati:
31884_eb6272faa9bf220137aef7d7fb3189f2.png
31884_eb6272faa9bf220137aef7d7fb3189f2.png

31884_c0dfaa0d5b88649ee17c58c821426dc6.png
31884_c0dfaa0d5b88649ee17c58c821426dc6.png

5 Risposte

  • Re: Algortimi e strutture dati

    Nella chiamata di HTinsert devi invertire l'ordine degli argomenti value e key.
    La funzione listDeleteEven vuole un argomento di tipo TList, ma tu gli hai passato un TInfo.
    Le variabili min e max non sono dichiarate.
    TValue non ha un membro "titolo".

    Quando hai errori di questo tipo devi vedere le dichiarazioni dei tipi e delle funzioni se corrispondono.
  • Re: Algortimi e strutture dati

    /* 
     *  Una biblioteca deve riorganizzare alcuni elenchi di libri tra cui elenco1 
     * (un BST), elenco2 (una HT) ed elenco3 (una lista).
     * In ciascuna struttura un libro e' rappresentato da
     * un codice ISBN numerico (campo chiave) e da un titolo. 
     * 
     * Si dovra' realizzare un programma che individui tutti i libri presenti in 
     * entrambi gli elenchi, li stampi in ordine crescente di ISBN (completare nella
     * funzione main) e che sostituisca in elenco2
     * il codice ISBN di un libro in base al titolo.
     * Infine, da elenco3 verranno rimossi tutti i libri con ISBN pari e anche l'elemento
     * con ISBN piu' piccolo.
     * Per realizzare tale programma occorre sviluppare le seguenti funzioni.
     * 
     * 1) BSTHTdupList(bst, ht, list): funzione RICORSIVA che copia in list (lista 
     *    ordinata) tutti i libri che sono presenti contemporaneamente sia in bst che 
     *    in ht (fa fede il codice ISBN).
     * 
     * 2) HTchangeKey(ht, value, newKey): funzione ITERATIVA che sostituisce in ht
     *    la chiave associata a value con la nuova chiave newKey.
     *    Se value non e' presente in ht allora non fa nulla.
     *    Se value compare piu' di una volta in ht allora alle fine ci sara' una sola
     *    coppia (newKey, value). Se newKey e' gia' presente in ht allora il vecchio valore
     *    viene rimosso e poi viene inserito il nuovo valore.
     *
     * 3) listDeleteEven(list): funzione RICORSIVA che elimina da list tutti i 
     *    libri con ISBN pari. Restituisce la lista aggiornata.
     *
     * 4) deleteMinList(list): funzione che elimina il libro con ISBN piu' basso.
     */
    
    #include <stdio.h>
    #include <string.h>
    #include "THT.h"
    #include "TBST.h"
    #include "TArray.h"
    #include "TList.h"
    
    TList BSTHTdupList(TBST bst, THT *ht, TList list) {
        //CASO BASE: l'albero è vuoto, niente da aggiungere
        if(bst != NULL) {
            //DIVIDE E COMBINA: aggiungo il sotto-albero sinistro (elementi minori)
            list = BSTHTdupList(bst->left, ht, list);
            bst->left = BSTHTdupList(bst->left, ht, list);
            //Aggiungo l'elemento
            list = listInsert(list, bst->info);
            //Aggiungo il sotto-albero destro (elementi maggiori)
            list = BSTHTdupList(bst->right, ht, list);
            bst->right = BSTHTdupList(bst->right, ht, list); 
        }
        return list;
    }
    
    void HTchangeKey(THT* ht, TValue value, TKey newKey) {
         TList list = listCreate();
            TNode* node = nodeCreate(list->info);
        if (list == NULL)
            return;
            for (int i = 0; i < ht->n_bucket; i++)
            for (TNode *node = ht->bucket[i]; node != NULL; node = node->link)
                    if (HTsearch(ht, list->info.key) == NULL)
                    HTinsert(ht, list->info.key, list->info.value);
                    list = listInsert(list,node->info);
    
    }
    
    TList listDeleteEven(TList list) {
            /* Caso Base */
        if(list == NULL) {
            return list;
        }
        
        /* Divide et Impera */
        TList tail = listDeleteEven(list->link);
        
        if(listDeleteEven(list->link))
        list->link = tail;
        else {
            nodeDestroy(list);
            list = tail;
        }
        /* Combina */
        return list;
    }
    
    TList deleteMinList(TList list) {
        TNode* curr = list;
        TNode* prev;
        TInfo min, max;
        
        /* Ricerca degli elementi da cancellare */
        while(curr != NULL) {
            if(infoGreater(curr->info, min) && infoLess(curr->info, max)) {
                prev = curr;
                list = listDelete(list, curr->info);
                curr = prev->link;
            } else curr = curr->link;
        }
        return list;
    
    }
    
    int main() {
        TBST elenco1 = BSTcreate();
        elenco1 = BSTinsert(elenco1, (TInfo) {1321, "Le mille e una notte"});
        elenco1 = BSTinsert(elenco1, (TInfo) {2372, "Orgoglio e pregiudizio"});
        elenco1 = BSTinsert(elenco1, (TInfo) {3432, "Finzioni"});
        elenco1 = BSTinsert(elenco1, (TInfo) {4223, "Delitto e castigo"});
        elenco1 = BSTinsert(elenco1, (TInfo) {1445, "Il processo"});
        elenco1 = BSTinsert(elenco1, (TInfo) {2234, "Madame Bovary"});
        elenco1 = BSTinsert(elenco1, (TInfo) {1238, "L'amore ai tempi del colera"});
        elenco1 = BSTinsert(elenco1, (TInfo) {6643, "Il vecchio e il mare"});
        elenco1 = BSTinsert(elenco1, (TInfo) {1111, "Anna Karenina"});
    
        THT* elenco2 = HTcreate(5);
        HTinsert(elenco2, 3357, (TValue) {"Il rosso e il nero"});
        HTinsert(elenco2, 7675, (TValue) {"Alla ricerca del tempo perduto"});
        HTinsert(elenco2, 4222, (TValue) {"Moby-Dick"});
        HTinsert(elenco2, 1445, (TValue) {"Il processo"});
        HTinsert(elenco2, 3233, (TValue) {"Pippi Calzelunghe"});
        HTinsert(elenco2, 3321, (TValue) {"L'uomo senza qualita'"});
        HTinsert(elenco2, 1111, (TValue) {"Anna Karenina"});
        HTinsert(elenco2, 9090, (TValue) {"Le metamorfosi"});
        HTinsert(elenco2, 3432, (TValue) {"Finzioni"});
    
        printf("Libri in elenco1 (BST):\n");
        BSTprint(elenco1);
        printf("\nLibri in elenco2 (HT):\n");
        HTprint(elenco2);
    
        TList elenco3 = listCreate();
        printf("\nCopio in elenco3 (lista) i libri contenuti sia in elenco1 che elenco2.");
        elenco3 = BSTHTdupList (elenco1, elenco2, elenco3);
        printf("\nLibri in elenco3 in ordine crescente di ISBN:\n");
        
        /* Completare con la chiamata a funzione corretta */
        listPrint(elenco3);
    
        TValue titolo = (TValue) {"Il processo"};
        TKey nuovoISBN = 1000;
        printf("\nCambio in elenco2 (HT) il codice di '%s' in %d", titolo, nuovoISBN);
        HTchangeKey(elenco2, titolo, nuovoISBN);
        printf("\nLibri in elenco2 dopo la modifica:\n");
        HTprint(elenco2);
    
        elenco3 = listDeleteEven(elenco3);
        printf("\nStudenti in elenco3 (Lista)\n(dopo aver rimosso gli ISBN pari)\n");
        listPrint(elenco3);
        
        elenco3 = deleteMinList(elenco3);
        printf("\nLibri in elenco3 (Lista)\n(tutti quelli di elenco3 tranne ISBN piu' basso)\n");
        listPrint(elenco3);
    
        BSTdestroy(elenco1);
        HTdestroy(elenco2);
        listDestroy(elenco3);
        return 0;
    }
  • Re: Algortimi e strutture dati

    Questo è il codice aggiornato
  • Re: Algortimi e strutture dati

    Devo soltanto capire come risolvere i warning
    Allegati:
    31884_a95d1566ab0e4385838d0ff24f60dfec.png
    31884_a95d1566ab0e4385838d0ff24f60dfec.png

    31884_338c8a9c615c813f7960aceeb071c55c.png
    31884_338c8a9c615c813f7960aceeb071c55c.png
  • Re: Algortimi e strutture dati

    I warning riguardano il fatto che hai assegnato puntatori a tipi diversi fra loro (vedere cosa ritorna la funzione e il tipo di left e right) e stringhe troppo lunghe rispetto al massimo dichiarato.
Devi accedere o registrarti per scrivere nel forum
5 risposte