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++ - Aiuto Liste C++ e Classi
Forum - C/C++ - Aiuto Liste C++ e Classi

Avatar
Miki88 (Normal User)
Newbie


Messaggi: 2
Iscritto: 02/07/2012

Segnala al moderatore
Postato alle 20:57
Lunedì, 02/07/2012
Ciao a tutti,

Sto svolgendo questo esercizio sulle classi con le quali devo creare un oggetto al cui interno ci sia una successione di interi.
Fino a qua niente di complesso (almeno dal mio modo di vedere), il problema sussiste quando devo fare la stampa della lista in senso inverso.
Mi spiego meglio, se all'interno della lista ho 1-2-3-4 con l'altra funzione di stampa deve uscire 4-3-2-1 (secondo la logica LIFO).

Questa è la classe:
Codice sorgente - presumibilmente C++

  1. class SuccessioneNumeri
  2. {
  3. public:
  4.  
  5.         struct Lista
  6.         {
  7.                 int numero;
  8.         Lista *nextElemento;
  9.         };
  10.  
  11.         void inserisciInCoda(int numero);
  12.         int cancellaUltimoElemento();
  13.         int visualizzaUltimoElemento();
  14.         int cancellaElementoFifo();
  15.         int visualizzaElementoFifo();
  16.     int stampaListaElementiFifo();
  17.     int stampaListaElementiLifo();
  18.  
  19. private:
  20.  
  21.         Lista listaNumeri;
  22. };



Queste invece sono le funzioni:
Codice sorgente - presumibilmente C++

  1. // EsercitazioneSuClasse.cpp : definisce il punto di ingresso dell'applicazione console.
  2. //
  3.  
  4. #include <iostream>
  5. #include <iomanip>
  6. #include "ClasseListaNumeri.h"
  7.  
  8. using namespace std;
  9.  
  10. void SuccessioneNumeri::inserisciInCoda(int numero)
  11. {
  12.                 Lista *ptr;
  13.                 ptr = &listaNumeri;
  14.                 if (ptr->nextElemento == NULL)
  15.                 {
  16.                         ptr = new Lista;
  17.                         ptr->numero = numero;
  18.                         ptr->nextElemento = NULL;
  19.                 }
  20.                 else
  21.                 {
  22.                         Lista *ptrAux;
  23.                         ptr = ptr->nextElemento;
  24.                         while (ptr->nextElemento !=NULL)
  25.                                 ptr = ptr->nextElemento;
  26.                         ptrAux = new Lista;
  27.                         ptrAux->numero = numero;
  28.                         ptrAux->nextElemento = NULL;
  29.                         ptr->nextElemento = ptrAux;
  30.                 }
  31. }
  32.  
  33. int SuccessioneNumeri::stampaListaElementiLifo()
  34. {
  35.     Lista *ptr;
  36.     ptr = &listaNumeri;
  37.     if (ptr->nextElemento != NULL)
  38.     {
  39.         return ptr->numero;
  40.         stampaListaElementiLifo();
  41.     }
  42.  
  43. }
  44.    
  45.  
  46. int SuccessioneNumeri::stampaListaElementiFifo()
  47. {
  48.     Lista *ptr;
  49.     Lista *lastPtr;
  50.     ptr = &listaNumeri;
  51.     do
  52.     {
  53.         cout << ptr->numero;
  54.         cout << endl;
  55.         lastPtr = ptr;
  56.         ptr = ptr->nextElemento;
  57.        
  58.     } while (lastPtr->nextElemento != NULL);
  59. }
  60.  
  61. int SuccessioneNumeri::cancellaUltimoElemento()
  62. {
  63.         Lista *ptr;
  64.         Lista *lastPtr;
  65.         ptr = &listaNumeri;
  66.         if (ptr->nextElemento == NULL)
  67.         {
  68.                 return -1;
  69.         }
  70.         //ptr = ptr->nextElemento;
  71.         //lastPtr = lastPtr->nextElemento;
  72.         lastPtr = ptr;
  73.     do
  74.         {
  75.                 if (ptr->nextElemento == NULL)
  76.                 {
  77.                         lastPtr->nextElemento = NULL;
  78.                         return ptr->numero;
  79.                 }
  80.                 lastPtr = ptr;
  81.                 ptr = ptr->nextElemento;
  82.         } while (1);
  83. }
  84.  
  85. int SuccessioneNumeri::visualizzaUltimoElemento()
  86. {
  87.         Lista *ultimoElemento;
  88.         ultimoElemento = &listaNumeri;
  89.         if (ultimoElemento->nextElemento == NULL)
  90.         {
  91.                 return -1;
  92.         }
  93.         do
  94.         {
  95.                 if (ultimoElemento->nextElemento == NULL)
  96.                 {
  97.                         return ultimoElemento->numero;
  98.                 }
  99.                 ultimoElemento = ultimoElemento->nextElemento;
  100.         } while (1);
  101.  
  102. }
  103.  
  104. int SuccessioneNumeri::cancellaElementoFifo()
  105. {
  106.     Lista *ptr;
  107.     ptr = &listaNumeri;
  108.     if (ptr->nextElemento == NULL)
  109.     {
  110.         return -1;
  111.     }
  112.         else
  113.     {
  114.         //ptr = ptr->nextElemento;
  115.     }
  116. }
  117.  
  118.  
  119. int SuccessioneNumeri::visualizzaElementoFifo()
  120. {
  121.     Lista *primoElemento;
  122.     primoElemento = &listaNumeri;
  123.     if (primoElemento->nextElemento == NULL)
  124.     {
  125.         return -1;
  126.     }
  127.         else
  128.     {
  129.         return primoElemento->numero;
  130.     }
  131. }



Ricapitolando i problemi sono sostanzialmente due:
1) Come faccio a stampare una lista secondo la logica LIFO?! Io pensavo ad una ricorsione però visto che in tutte le funzioni che ho fatto non passo alcun parametro non saprei come fare

2) Per quanto riguarda la funzione cancellaElementoFifo esiste un problema simile, come faccio a riassegnare a &listaNumeri la nuova testa della lista?!!

Please Help Me!!

Grazie per l'attenzione!!!

PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 12:12
Martedì, 03/07/2012
Ciao,

penso che puoi agevolmente risolvere il problema inserendo ( e gestendo adeguatamente ) nel nodo della lista anche un campo precElemento in questo modo:

Codice sorgente - presumibilmente C/C++

  1. public:
  2.      
  3.             struct Lista
  4.             {
  5.                     int numero;
  6.             Lista *nextElemento;
  7.             Lista *precElemento;
  8.             };



in modo da poter scorrere la lista anche in senso inverso.

Ciao. :k:

PM Quote
Avatar
Miki88 (Normal User)
Newbie


Messaggi: 2
Iscritto: 02/07/2012

Segnala al moderatore
Postato alle 15:11
Martedì, 03/07/2012
Già ho sbattuto la testa parecchie volte prima di riuscire a capire i puntatori figurati adesso.....le mie poche certezze stanno pian piano svanendo! Riesci ad essere più chiaro con un esempio pratico?! Non frequentando l'università mi viene veramente difficile capire un concetto come il ritorno all'indietro....

PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 18:15
Martedì, 03/07/2012
Testo quotato

Postato originariamente da Miki88:

Già ho sbattuto la testa parecchie volte prima di riuscire a capire i puntatori figurati adesso.....le mie poche certezze stanno pian piano svanendo! Riesci ad essere più chiaro con un esempio pratico?! Non frequentando l'università mi viene veramente difficile capire un concetto come il ritorno all'indietro....




semplice, se per ogni nodo tieni memoria del nodo successivo usando il puntatore nextElemento, che ti permette di percorrere la lista in un verso,
analogamente puoi tenere memoria del nodo precedente usando il puntatore precElemento che ti permettera' di percorrerla nel verso opposto.

Ciao. :k:

PM Quote