Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    21

    [C++] Chiarimento puntatori liste

    Salve gente, stavo implementando una semplice classe lista giusto per capirne il funzionamento e mi sono imbattuto in un dubbio causato dalla grande confusione che faccio prendendo appunti a lezione.

    Volevo semplicemente capire se il ragionamento che faccio è corretto, sostanzialmente ho una classe Elemento che contiene un valore e un puntatore all'elemento successivo, e ho una classe Lista che contiene due puntatori testa/coda ad Elemento.

    Ho pensato di implementare un metodo aggiungiInCoda, vi riporto il codice

    codice:
    void Lista::aggiungiInCoda (int v)
    {
    	Elemento* tmp = new Elemento (v);
    
    	if (coda)
    		coda->succ = tmp;
    	else
    		testa = tmp;
    
    	coda = tmp;
    }
    sostanzialmente crea un nuovo elemento, se la lista contiene già altri elementi sposta il successivo dell'ultimo elemento a tmp facendolo diventare l'ultimo elemento, il dubbio mi viene perché guardando il quaderno il mio coda = temp alla fine del metodo viene riportato nell'else dal professore, la domanda è: non devo comunque spostare la coda su tmp indipendentemente se la lista di partenza è vuota o contiene già qualche elemento?

    Grazie in anticipo per il chiarimento!

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Va fuori dall' else perché:

    -Se la lista contiene elementi, l' elemento creato viene aggiunto all' elemento che era in coda, e diventa la nuova coda;
    -Se la lista non contiene elementi, l' elemento creato diventa la coda, ma anche la testa.

    Direi che è corretto il codice che hai scritto.Ma prova sempre a debuggarlo, che è il miglior metodo per capire se funziona.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    21
    L'avevo immaginato, ti ringrazio.

    Visto che ci sono ti faccio un'altra domanda un po' ingenua ma almeno mi chiarisco tutti i dubbi, essendo coda un puntatore ad elemento, scrivendo coda->succ io mi riferisco al dato membro succ dell'elemento a cui punta coda, giusto? Almeno me l'ero pensata così..

  4. #4
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Esatto.

  5. #5
    Utente di HTML.it L'avatar di drudox
    Registrato dal
    Sep 2011
    Messaggi
    93
    io farei una cosa un po` diversa .. nel senso se la lista e` vuota devi collegare sia il puntatore al primo nodo che il puntatore di coda all'nuovo nodo ..

    quindi tipo

    codice:
    void Lista::aggiungiInCoda (int v)
    {
            Elemento * tmp = new  Elemento(v) ;
            if( empty )                       // empty funzione che controlla se uno dei ptr della lista e` un puntatore nullo
                      
                       testaPtr = codaPtr = tmp;
            else
            {
                    codaPtr->succ = tmp ;
                    codaPtr = tmp ;
                    codaPtr->succ = 0 ;    // l'ultimo elemento deve essere un puntatore nullo 
            }
    C
    C Saluti .. Il DrudoX
    C
    STOP
    END

  6. #6
    Utente di HTML.it L'avatar di drudox
    Registrato dal
    Sep 2011
    Messaggi
    93
    che po alla fine e` la stessa cosa .. tranne che a mio parere e` piu` "leggibile"
    C
    C Saluti .. Il DrudoX
    C
    STOP
    END

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    21
    Si può sempre scrivere tanto codice diverso che sostanzialmente fa la stessa cosa, a me interessava più che altro come scopo didattico prima di cominciare a sfruttare le funzioni di libreria.

    Anche se la funzione per controllare se la lista è vuota mi sembra una cosa un po' forzata, forse sì, migliora la leggibilità, ma alla fine basta fare un controllo che la coda o la testa puntino a NULL, almeno ti ripeto, per ciò che serviva a me.

    Per quanto riguarda questo "codaPtr->succ = 0 ;" avevo pensato ad un valore di default nel costruttore della classe Elemento del tipo "Elemento (int v, Elemento* succ = 0)" in modo che ogni elemento venga creato con il puntatore al successivo a NULL di default, senza andarlo ad impostare ogni volta.

    Grazie comunque per l'interessamento!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.