[RISOLTO] Problema creazione di una lista al ritorno

di il
8 risposte

[RISOLTO] Problema creazione di una lista al ritorno

Ciao a tutti, non riesco a venirne fuori con il problema seguente, quindi chiedo un vostro aiuto.
Dato un albero e un intero k, devo creare una nuova struttura dati (FIFO) contenente i valori dell'albero, solo se il nodo di quest'ultimo è un multiplo di k e visitando l'albero in ordine infisso, ovvero prima il nodo a sinistra, poi la radice e infine il nodo a destra. Ad esempio l'albero

              4
            /   \
          2     6
       /    \    /
     1      3 5 
sarebbe visitato in modo infisso in ordine 1 2 3 4 5 6.
Ho queste strutture già definite:

struct nodo { int info; nodo* next; nodo(int a=0, nodo* b=0) {info=a; next=b;}};                                          //nodo lista 
struct FIFO { nodo* primo, *ultimo; FIFO(nodo*a=0, nodo*b=0) {primo=a; ultimo=b;}};                 //primo punta al primo nodo della lista, ultimo all'ultimo
struct nodot { int info; nodot* left, *right; nodot(int a=0, nodot* b=0, nodot* c=0) {info=a; left=b; right=c;}};  //nodo albero
La funzione che fa quanto richiesto ha il seguente prototipo

FIFO crea_lista (nodot *R, int &n, int k)          //R punta al nodo dell'albero, n mi serve per vedere se sono arrivato al nodo k-esimo ed è inizializzato a 1
Quindi la lista la devo creare al ritorno delle chiamate ricorsive. E quello che non ho capito è proprio questo, come faccio a "visitare" l'albero all'andata delle chiamate di funzione e costruire la struttura al ritorno? Aggiungo, così magari può esservi più chiaro, una funzione simile che però invece di creare la lista con i nodi "giusti", semplicemente li stampa

void stampa(nodot *R, int &n, int k){
    if(R){
        stampa(R->left, n, k);
        if(n==k){
            n=0;
            cout<<R->info<<" ";
        }
        n=n+1;
        stampa(R->right, n, k);
    }
}
Spero siate riusciti a capire il problema nonostante la mia spiegazione un po' confusa

8 Risposte

  • Re: [RISOLTO] Problema creazione di una lista al ritorno

    Non ho letto nulla, sto andando a cena (che poi si dice pranzo, vabbè).
    hai una funzione che fa tutto giusto, e il tuo "dramma" è banalmente memorizzarli?
  • Re: [RISOLTO] Problema creazione di una lista al ritorno

    +m2+ ha scritto:


    hai una funzione che fa tutto giusto, e il tuo "dramma" è banalmente memorizzarli?
    Praticamente si. Se avessi quella struttura passata per riferimento sinceramente non avrei nessun problema, però il fatto che la lista devo costruirla al ritorno mi dà qualche grattacapo
  • Re: [RISOLTO] Problema creazione di una lista al ritorno

    E chi lo ha detto che devi costruirla al ritorno (qualsiasi cosa ciò significhi)
  • Re: [RISOLTO] Problema creazione di una lista al ritorno

    Quel che intendo è che, non avendo il parametro della struttura FIFO (contenente appunto la lista che devo creare) passato alla funzione, che ha prototipo
    FIFO crea_lista (nodot *R, int &n, int k
    , devo utilizzare il return per "creare" la mia struttura (con ritorno intendevo utilizzando il return). Spero di essermi spiegato decentemente
  • Re: [RISOLTO] Problema creazione di una lista al ritorno

    Cambialo
  • Re: [RISOLTO] Problema creazione di una lista al ritorno

    È il testo di un esame e quindi volevo capire come fare la funzione così come richiesta
  • Re: [RISOLTO] Problema creazione di una lista al ritorno

    Sono un po' confuso.
    cosa ti impedisce di aggiungere alla funzione "stampa" la lista, e farle aggiungere gli elementi, anzichè stamparli a video?
    altrimenti puoi sempre fare una versione iterativa, con gestione manuale dello stack (direi molto superiore al livello dell'esame)
  • Re: [RISOLTO] Problema creazione di una lista al ritorno

    Il mio problema era principalmente quello di unire le due liste, quella creata dai nodi del ramo sinistro dell'albero e quella del ramo destro.
    Alla fine sono riuscito a trovare una soluzione al mio problema:
    
    FIFO crea_lista(nodot *R, int &n, int k){
        FIFO a,b;
        if(R){
            a=crea_lista(R->left, n, k);                      //lista dei rami a sx
            if(n==k){
                n=0;
                if(!a.primo){                                       //lista vuota, creo il primo elemento della lista
                    a.primo=new nodo(R->info);
                    a.ultimo=a.primo;
                }
                else{                                                //ho già almeno un elemento, aggiungo il nuovo al fondo della lista
                    a.ultimo->next=new nodo(R->info);
                    a.ultimo=a.ultimo->next;
                }
            }
            n=n+1;
            b=crea_lista(R->right, n, k);                    //lista dei rami a dx
            if(a.primo&&b.primo){                             //unisco le liste dei rami a sx e dx, solo se entrambe sono non vuote
                a.ultimo->next=b.primo;
                a.ultimo=b.ultimo;
            }
            if(a.primo)                                     //ritorno la nuova lista (che è invariata nel caso b vuoto, altrimenti è l'unione delle due liste)
                return a;
            return b;                                       //altrimenti a è vuoto e ritorno b
        }
        return 0;
    }
    
    Se hai qualche consiglio a riguardo o avresti fatto in altro modo (sempre in modo ricorsivo però), mi farebbe piacere ascoltarti
Devi accedere o registrarti per scrivere nel forum
8 risposte