Algoritmi e strutture dati

di il
15 risposte

Algoritmi e strutture dati

Salve a tutti. Sto riscontrando alcuni problemi con questo esericizio. In particolare con la funzione void listPrintReverse_exemption(TList list) ed i due warning che ho postato. Qualcuno potrebbe aiutarmi? Grazie mille


Qui c'è l'esercizio con le strutture apposite
https://onlinegdb.com/uYGAjyTQ

/*
 * Una struttura ospedaliera deve riorganizzare alcuni elenchi di pazienti 
 * tra cui elenco1 (un Binary Search Tree) ed elenco2 (una Hash Table).
 * In ciascuna struttura, un paziente
 * e' rappresentato da un ID (campo chiave di tipo TKey, ossia un intero),
 * dal nome e dal cognome (di tipo TValue, ossia due stringhe).
 * In tutte le strutture coinvolte, i pazienti con esenzione dal ticket
 * vengono indicati con uno 0 finale nel loro ID.
 * 
 * Si dovra' realizzare un programma che sposti tutti i pazienti con esenzione
 * (ID la cui ultima cifra sia 0) da elenco2 ad elenco1, rimuovendo gli
 * eventuali duplicati in conseguenza del travaso. Inoltre, si dovranno copiare in elenco3
 * (una lista ordinata) tutti i pazienti di elenco1, eseguendo anche una stampa
 * dei soli pazienti con esenzione considerando gli ID in ordine decrescente.
 * Bisogna, infine, rimuovere da elenco1 il paziente con ID piu' alto.
 *
 * Per realizzare tale programma occorre sviluppare le seguenti funzioni.
 *    
 * 1) HTtoBST_exemption(ht, bst): funzione ITERATIVA che copia da ht a bst tutti
 *    i pazienti con ID la cui ultima cifra sia 0, rimuovendoli da ht.
 *    Nel caso in cui un paziente di ht gia' esiste in bst,
 *    esso non verra' duplicato (ma verra' comunque rimosso da ht).
 * 2) BSTtoList(bst, list): funzione RICORSIVA che copia da bst a list tutti
 *    i pazienti di bst in ordine crescente di ID.
 * 3) listPrintReverse_exemption(list): funzione RICORSIVA che stampa gli elementi di 
 *    list in ordine inverso (in termini di ID).
 * 4) BSTremoveLast(bst): funzione RICORSIVA che rimuove da bst l'ultimo 
 *    elemento in ordine di ID (ossia il paziente con l'ID piu' alto). 
 *    Restituisce il bst aggiornato.
 * 
 */

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

TBST HTtoBST_exemption(THT* ht, TBST bst) {
    for(int i = 0; i < ht->n_bucket; i++)
    for(TNode *node = ht->bucket[i]; node != NULL; node = node->link)
    if(HTtoBST_exemption(ht, bst->info.key)){
        if(BSTsearch(bst, node->info) == NULL)
        bst = BSTinsert(bst, node->info);
        HTdelete(ht, node->info.key);
    }
    
    return bst;
}

TList BSTtoList(TBST bst, TList list) {
    // Caso base: l'albero è vuoto, niente da aggiungere
    if(bst != NULL){
        //Divide e combina: aggiungo il sotto-albero sinistro (elementi minori)
        list = BSTtoList(bst->left, list);
        
        // Aggiungo l'elemento
        list = listInsert(list, bst->info);
        
        // Aggiungo il sotto-albero destro (elementi maggiori)
        list = BSTtoList(bst->right, list);
        
        return list;
    }

}

void listPrintReverse_exemption(TList list) {
    // Caso base
    if(list == NULL)
    return;
    
    // Divide et Impera
    listPrintReverse_exemption(list->link);
    printf("%d\n",list->info);

}

TBST BSTremoveLast(TBST bst) {
    TInfo min, max;
    
    // Caso base
    if(bst == NULL)
    return 0;
    
    // Divide et Impera (+ combina)
    if(!infoGreater(min, bst->info))
    BSTprint(bst->left);
    if (!infoGreater(min, bst->info) && !infoLess(max, bst->info))
        infoPrint(bst->info);
    if (!infoLess(max, bst->info))
        BSTprint(bst->right);
        
    bst = BSTdelete(bst, bst->info);
    
    return bst;
}

/* Logica applicativa */

int main() {
    TBST elenco1 = BSTcreate();
    elenco1 = BSTinsert(elenco1, (TInfo) {1320, "Mario", "Rossi"});
    elenco1 = BSTinsert(elenco1, (TInfo) {2370, "Antonio", "Bianchi"});
    elenco1 = BSTinsert(elenco1, (TInfo) {3432, "Lucia", "Verdi"});
    elenco1 = BSTinsert(elenco1, (TInfo) {4223, "Camilla", "Neri"});
    elenco1 = BSTinsert(elenco1, (TInfo) {4443, "Aldo", "Giallini"});
    elenco1 = BSTinsert(elenco1, (TInfo) {4230, "Carlo", "Aranci"});
    elenco1 = BSTinsert(elenco1, (TInfo) {1238, "Maria", "Scarlatti"});
    elenco1 = BSTinsert(elenco1, (TInfo) {2644, "Luigi", "Turchesi"});
    elenco1 = BSTinsert(elenco1, (TInfo) {1110, "Giovanni", "Argento"});

    THT *elenco2 = HTcreate(3);
    HTinsert(elenco2, 3351, (TValue) {"Nicola", "Grigetti"});
    HTinsert(elenco2, 7675, (TValue) {"Costanza", "Violetti"});
    HTinsert(elenco2, 4260, (TValue) {"Filippa", "Azzurri"});
    HTinsert(elenco2, 4443, (TValue) {"Aldo", "Giallini"});
    HTinsert(elenco2, 3233, (TValue) {"Anna", "Indaco"});
    HTinsert(elenco2, 6320, (TValue) {"Luigi", "Rosi"});
    HTinsert(elenco2, 1110, (TValue) {"Giovanni", "Argento"});
    HTinsert(elenco2, 5430, (TValue) {"Lucio", "Rossetti"});
    HTinsert(elenco2, 1238, (TValue) {"Maria", "Scarlatti"});
    HTinsert(elenco2, 3450, (TValue) {"Biagio", "Verdini"});

    printf("Pazienti in elenco1 (BST):\n");
    BSTprint(elenco1);
    printf("\nPazienti in elenco2 (HT):\n");
    HTprint(elenco2);

    elenco1 = HTtoBST_exemption(elenco2, elenco1);

    printf("\nPazienti in elenco1 (BST) dopo lo spostamento:\n");
    BSTprint(elenco1);
    printf("\nPazienti in elenco2 (HT) dopo lo spostamento:\n");
    HTprint(elenco2);

    TList elenco3 = listCreate();
    printf("\nRiverso in elenco3 i pazienti di elenco1...");
    printf("\nPazienti in elenco3 (Lista):\n");
    elenco3 = BSTtoList(elenco1, elenco3);
    listPrint(elenco3);
    
    printf("\nPazienti con esenzione presenti in elenco3 (Lista)\n(in ordine decrescente)\n");
    listPrintReverse_exemption(elenco3);
    
    printf("\nPazienti in elenco1 (BST dopo aver rimosso l'elemento con ID massimo):\n");
    elenco1 = BSTremoveLast(elenco1);
    BSTprint(elenco1);
    

    BSTdestroy(elenco1);
    HTdestroy(elenco2);
    listDestroy(elenco3);

    return 0;
}

15 Risposte

  • Re: Algoritmi e strutture dati

    Sono warning molto chiari. Vedi le dichiarazioni delle funzioni e vedi il tipo dei dati che gli stai passando.
  • Re: Algoritmi e strutture dati

    Sono bloccato non riesco a capire :/
  • Re: Algoritmi e strutture dati

    Scusa, ad esempio, nella printf vuoi visualizzare un numero ma info è una struttura di tipo TInfo. E' un errore chiaro.
  • Re: Algoritmi e strutture dati

    void listPrintReverse_exemption(TList list) {
        // Caso base
        if(list == NULL)
        return;
        
        // Divide et Impera
        listPrintReverse_exemption(list->link);
        printf("%d\n", list->info.key);
    
    }
    
    Continua a non stampare :/
  • Re: Algoritmi e strutture dati

    Non stampa ma non hai l'errore di compilazione (i warning per cui hai aperto questo thread). Sono cose diverse.

    Non è che eliminando un errore di compilazione, questo fatto, da solo, fa funzionare il tuo codice se il tuo codice ha errori logici.

    E comunque aggiorna il progetto online.
  • Re: Algoritmi e strutture dati

    Https://onlinegdb.com/jAWDzl5C Qui il codice è aggiornato. Comunque no, non compare nessun tipo di errore. Noto soltanto che l'elenco 3 in ordine decrescente non viene stampato
    Allegati:
    31884_307f16ba9ddf4c990025849ead6d6203.png
    31884_307f16ba9ddf4c990025849ead6d6203.png

    31884_a24096ed6856282b5cff4995d8c56696.png
    31884_a24096ed6856282b5cff4995d8c56696.png
  • Re: Algoritmi e strutture dati

        // Caso base
        if (list == NULL)
            return;
           
        // Divide et Impera
        TNode *first = list;
        (first->link)->link = first;
        first->link = NULL;
        listPrintReverse_exemption(list->link);
        printf("%d\n", list->info.key);
    
    }
    
    Continuo ad avere problemi con questa funzione
  • Re: Algoritmi e strutture dati

    Quella funzione modifica la lista, quando la dovrebbe solo esplorare.
  • Re: Algoritmi e strutture dati

    Void listPrintReverse_exemption(TList list) {
        // Caso base
        if(list == NULL)
        return;
        
        // Divide et Impera
        listPrintReverse_exemption(list->link);
        printf("%d\n", list->info.key);
    
    }
    Però neanche con questa alternativa funziona.Sarà un problema del compilatore?
  • Re: Algoritmi e strutture dati

    No. Sembra che abbia un problema solo con me liste. Puoi mettere nel progetto anche il file TList.h?
  • Re: Algoritmi e strutture dati

    TList è stato inserito di default
  • Re: Algoritmi e strutture dati

    giacomovicinanza ha scritto:


    TList è stato inserito di default
    Ah scusa da smartphone si vede male quel sito. Nella funzione BSTtoList prova ad aggiungere dopo l'if
    
    else return NULL;
    
    Poi cerco di vederlo bene appena posso.
  • Re: Algoritmi e strutture dati

    Sempre il solito problema
  • Re: Algoritmi e strutture dati

    Hai fatto bene a mettere return list, però va fuori dall'if. Adesso dovrebbe funzionare, ma vedi tu se le stampe sono corrette.
    
    TList BSTtoList(TBST bst, TList list) {
        // Caso base: l'albero è vuoto, niente da aggiungere
        if(bst != NULL){
            //Divide e combina: aggiungo il sotto-albero sinistro (elementi minori)
            list = BSTtoList(bst->left, list);
            
            // Aggiungo l'elemento
            list = listInsert(list, bst->info);
            
            // Aggiungo il sotto-albero destro (elementi maggiori)
            list = BSTtoList(bst->right, list);
        }
        return list;
    }
    
Devi accedere o registrarti per scrivere nel forum
15 risposte