Re: Algoritmi e strutture dati

Messaggioda giacomovicinanza » 14/07/2022, 14:37

Funziona perfettamente. Grazie mille per avermi aiutato a capire :lol:

https://onlinegdb.com/5BKiNUjEI -> codice aggiornato

Codice:
/*
 * La segreteria di una Universita' deve riorganizzare alcuni elenchi di studenti
 * tra cui elenco1 (un BST) ed elenco2 (una HT). In ciascuna struttura uno studente
 * è rappresentato dalla matricola (campo chiave), dal nome e dal cognome.
 *
 * Si dovrà realizzare un programma che sposti tutti gli studenti con matricola
 * dispari in elenco1 e tutti gli studenti con matricola pari in elenco2 rimuovendo
 * gli eventuali duplicati. Inoltre, si dovranno copiare in elenco3 (una lista)
 * tutti gli studenti di elenco2 (dopo le operazioni suddette).
 * Infine, bisognera' eliminare lo studente con la matricola piu' bassa in elenco3
 * e stampare lo studente con la matricola piu' alta.
 *
 * Per realizzare tale programma occorre sviluppare le seguenti funzioni.
 *
 * 1) HTtoBSTodd(ht, bst): funzione ITERATIVA che copia da ht a bst tutti gli studenti
 *    con matricola dispari, rimuovendoli da ht.
 *    Se uno studente di ht gia' esiste in bst esso non verra'
 *    duplicato (ma verra' comunque rimosso da ht).
 *   
 * 2) BSTtoHTeven(bst, ht): funzione RICORSIVA che copia da bst a ht tutti gli
 *    studenti con matricola pari rimuovendoli da bst. Se uno studente di bst
 *    gia' esiste in ht esso non verrà duplicato (ma verra' comunque rimosso da bst).
 *
 * 3) HTtoList(ht, list): funzione ITERATIVA che copia tutti gli studenti
 *    di ht in list.
 *
 * 4) deleteMinList(list): funzione che elimina lo studente con la matricola piu' bassa.
 *
 * 5) listLastNode(list): funzione RICORSIVA che restituisce il riferimento (puntatore)
 *    all'ultimo elemento della lista (per poi stamparne il contenuto nella funzione main).
 */

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

int isEven(TKey num){
    if(num%2==0)
    return 1;
    else
    return 0;
}

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

TBST BSTtoHTeven(TBST bst, THT* ht) {
   if (bst != NULL) {
        bst->left = BSTtoHTeven(bst->left, ht);
        bst->right = BSTtoHTeven(bst->right, ht);
        if (isEven(bst->info.key) == 1) {
            HTinsert(ht, bst->info.key, bst->info.value);
                bst = BSTdelete(bst, bst->info);
        }
    }

    return bst;
}

TList HTtoList(THT* ht, TList list) {
    for (int i = 0; i < ht->n_bucket; ++i)
    {
        for (TNode* node = ht->bucket[i]; node != NULL;)
        {
            TNode* temp = node;
            node = node->link;
                if (listSearch(list, temp->info) == NULL) {
                    list = listInsert(list, temp->info);
                    HTdelete(ht, temp->info.key);
                }
        }
    }
    return list;
}

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

   
}

TNode* listLastNode(TList l){
    if(l == NULL || l->link == NULL) {
        return l;
    }
    return listLastNode(l->link);
}

int main() {
    TBST elenco1 = BSTcreate();
    elenco1 = BSTinsert(elenco1, (TInfo) {1321, "Mario", "Rossi"});
    elenco1 = BSTinsert(elenco1, (TInfo) {2372, "Antonio", "Bianchi"});
    elenco1 = BSTinsert(elenco1, (TInfo) {3432, "Lucia", "Verdi"});
    elenco1 = BSTinsert(elenco1, (TInfo) {4223, "Camilla", "Neri"});
    elenco1 = BSTinsert(elenco1, (TInfo) {1445, "Aldo", "Giallini"});
    elenco1 = BSTinsert(elenco1, (TInfo) {2234, "Carlo", "Aranci"});
    elenco1 = BSTinsert(elenco1, (TInfo) {1238, "Maria", "Scarlatti"});
    elenco1 = BSTinsert(elenco1, (TInfo) {6643, "Luigi", "Turchesi"});
    elenco1 = BSTinsert(elenco1, (TInfo) {1111, "Giovanni", "Argento"});

    THT *elenco2 = HTcreate(5);
    HTinsert(elenco2, 3357, (TValue) {"Nicola", "Grigetti"});
    HTinsert(elenco2, 7675, (TValue) {"Costanza", "Violetti"});
    HTinsert(elenco2, 4222, (TValue) {"Filippa", "Azzurri"});
    HTinsert(elenco2, 1445, (TValue) {"Aldo", "Giallini"});
    HTinsert(elenco2, 3233, (TValue) {"Anna", "Indaco"});
    HTinsert(elenco2, 3321, (TValue) {"Luigi", "Rosi"});
    HTinsert(elenco2, 1111, (TValue) {"Giovanni", "Argento"});
    HTinsert(elenco2, 3432, (TValue) {"Lucia", "Verdi"});
    HTinsert(elenco2, 1238, (TValue) {"Maria", "Scarlatti"});

    printf("Studenti in elenco1 (BST):\n");
    BSTprint(elenco1);
    printf("\nStudenti in elenco2 (HT):\n");
    HTprint(elenco2);

    elenco1 = HTtoBSTodd(elenco2, elenco1);
    elenco1 = BSTtoHTeven(elenco1, elenco2);

    printf("\nStudenti in elenco1 (BST) dopo lo spostamento\n(solo matricole dispari senza duplicati):\n");
    BSTprint(elenco1);
    printf("\nStudenti in elenco2 (HT) dopo lo spostamento\n(solo matricole pari senza duplicati):\n");
    HTprint(elenco2);

    TList elenco3 = listCreate();
    elenco3 = HTtoList(elenco2, elenco3);
   
    printf("\nStudenti in elenco3 (Lista)\n");
    listPrint(elenco3);
   
    elenco3 = deleteMinList(elenco3);
    printf("\nStudenti in elenco3 (Lista)\n(tutti quelli di elenco2 tranne la matricola piu' bassa)\n");
    listPrint(elenco3);
   
    printf("\nUltimo studente in elenco3 (Lista)\n(matricola piu' alta):\n");
    TNode* last_node = listLastNode(elenco3);
    infoPrint(last_node->info);

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

    return 0;
}
giacomovicinanza
Junior Member
Junior Member
 
Messaggio: 144 di 218
Iscritto il: 18/08/2021, 15:55

Re: Algoritmi e strutture dati

Messaggioda vict85 » 15/07/2022, 11:09

La mia impressione è che tu stia scrivendo i programmi copiando e incollando soluzioni qua e là, invece dovresti farlo come se stessi scrivendo la ricetta di un ciambellone. Insomma ti devi chiarire i passaggi e poi scriverli nel linguaggio appropriato.

In questo codice usi min senza averla inizializzata.
Codice:
TList deleteMinList(TList list) {
    TNode* curr = list;
    TNode* prev;
    TInfo min;
   
    /* Ricerca degli elementi da cancellare */
    while(curr != NULL) {
        if(infoGreater(curr->info, min)) {
            prev = curr;
            list = listDelete(list, curr->info);
            curr = prev->link;
        } else curr = curr->link;
    }
    return list; 
}
tra l'altro, non hai ascoltato il mio consiglio: TList è una lista ordinata. Quindi ti sarebbe bastato scrivere:
Codice:
TList deleteMinList(TList list) {
    if ( list != NULL )
    {
        list = listDelete(list, list->info);
    }
    return list;
}

o anche
Codice:
TList deleteMinList(TList list) {
    if ( list != NULL )
    {
        TList temp = list;
        list = list->link;
        nodeDestroy(temp);
    }
    return list;
}
vict85
Moderatore
Moderatore
 
Messaggio: 10622 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Precedente

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite