PDA

Visualizza la versione completa : [C++] Chiarimento puntatori liste


AyFrank
06-04-2012, 19:05
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



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! :D

Who am I
06-04-2012, 20:54
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.

AyFrank
07-04-2012, 10:38
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ì..

Who am I
07-04-2012, 22:15
Esatto.

drudox
12-04-2012, 13:44
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



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
}

drudox
12-04-2012, 13:48
che po alla fine e` la stessa cosa .. tranne che a mio parere e` piu` "leggibile"

AyFrank
13-04-2012, 17:55
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!

Loading