Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema ad interpretare alcune righe di codice
Forum - C/C++ - Problema ad interpretare alcune righe di codice

Avatar
elio_2he (Normal User)
Newbie


Messaggi: 6
Iscritto: 25/05/2015

Segnala al moderatore
Postato alle 16:21
Giovedì, 18/06/2015
Salve a tutti

ho qualche problema a capire questa parte di codice
Codice sorgente - presumibilmente C++

  1. //nella dichiarazione ho:
  2. struct record{
  3. int element;
  4. record * next;
  5. }
  6.  
  7. class lista{
  8. private:
  9.            record * testa;
  10. public:
  11.           lista(){testa=0;}
  12.           void insert_in_coda(const int &);
  13. };
  14.  
  15. //ora arrivano i problemi! è nell'implementazione che non riesco a capire il codice
  16.  
  17. void lista::insert_in_coda (const int & a)
  18. {
  19. record * p;
  20. record * temp=testa;
  21. p=new record;
  22. p->element=a;//nel campo element di p inserisco il valore "a"
  23. p->next=0;//nel campo next di p inserisco " 0"
  24. while(temp->next) temp=temp->next;// qui non capisco cosa fa e cosa vuole fare
  25. temp->next=p;//neanche qui capisco
  26.  
  27. }



il problema è praticamente nelle ultime righe di codice ( il resto l'ho messo per specificare i tipi di variabile) e poi sapreste indicarmi a cosa serve l'operatore freccia (->;) e la sua differenza con l'operatore punto(.)?
grazie per l'attenzione!
:)

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 16:40
Giovedì, 18/06/2015
Codice sorgente - presumibilmente Plain Text

  1. while(temp->next) temp=temp->next;// qui non capisco cosa fa e cosa vuole fare



Assegna a temp il puntatore all'ultimo elemento della lista.

Partendo dalla testa, temp viene riassegnato fino a che "next" è NULL (zero). Siccome in C/C++ 0 viene trattato come un falso, si può scrivere:

Codice sorgente - presumibilmente C/C++

  1. if (0){
  2.    // non viene eseguito
  3. }



Un valore diverso da zero (un puntatore valido) esegue il while loop fino a che un elemento next esiste.

Codice sorgente - presumibilmente Plain Text

  1. temp->next=p;//neanche qui capisco



Dopo aver trovato l'ultimo elemento, assegna il puntatore next a p, che effettivamente aggiunge un nuovo elemento al termine della lista.

Il -> è semplicemente un'abbreviazione per:

Codice sorgente - presumibilmente Plain Text

  1. // queste due istruzioni sono equivalenti
  2.  
  3. temp->next
  4. (*temp).next



Siccome tratti con un puntatore, prima di poter accedere alle sue proprietà bisogna dereferenziarlo.

Ultima modifica effettuata da pierotofy il 18/06/2015 alle 16:41


Il mio blog: https://piero.dev
PM Quote
Avatar
elio_2he (Normal User)
Newbie


Messaggi: 6
Iscritto: 25/05/2015

Segnala al moderatore
Postato alle 17:46
Giovedì, 18/06/2015
Grazie mille per la risposta !:)
però non ho capito una cosa

Codice sorgente - presumibilmente Plain Text

  1. while(temp->next){//operazione} // è sinonimo di
  2.  while((*temp).next){//operazione}


giusto? e quindi cosa significa?
fino a quando c'è un valore diverso da 0 fai {//operazione}?

e poi quando scrivo :
record * temp=testa;
sto assegnando l'indirizzo di testa a temp giusto?

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 18:29
Giovedì, 18/06/2015
NULL è definito con 0 quindi significa mentre next punta a qualcosa diverso da 0 quindi NULL il puntatore è valido, quindi faccio....

No, assegni a temp l'indirizzo puntato da testa, non l'indirizzo di testa  

Ultima modifica effettuata da TheDarkJuster il 18/06/2015 alle 18:33
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:56
Giovedì, 18/06/2015
Testo quotato


fino a quando c'è un valore diverso da 0 fai {//operazione}?



Si. https://en.wikipedia.org/wiki/While_loop

Consiglio di leggere più a fondo le basi del linguaggio C/C++. Prendi un manuale e studialo, ti aiuterà enormemente.

Ultima modifica effettuata da pierotofy il 18/06/2015 alle 19:59


Il mio blog: https://piero.dev
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:58
Giovedì, 18/06/2015
Testo quotato


record * temp=testa;
sto assegnando l'indirizzo di testa a temp giusto?



Giusto. temp punta allo stesso valore di testa.

Testo quotato


No, assegni a temp l'indirizzo puntato da testa, non l'indirizzo di testa  



Uh?


Il mio blog: https://piero.dev
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 23:35
Giovedì, 18/06/2015
Testa contiene un indirizzo di memoria, se fai temp = testa temp contiene lo stesso indirizzo di memoria, non l'indirizzo di memoria di testa, perché non hai fatto temp = & testa; chiaro?

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 0:24
Venerdì, 19/06/2015
Ah, questo intendevi. Si, giusto.


Il mio blog: https://piero.dev
PM Quote