Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C++] Lista linkata - Come collegare due box?

    Salve! Ho implementato questa semplice lista linkata, in cui devo collegare tra loro due o più box tramite l'utilizzo di puntatori, ma la funzione che ho utilizzato nel mio programma, point_at_next() non fa bene il suo compito. Qualcuno può gentilmente suggerirmi dove sbaglio? E' da troppo tempo che ci provo ormai..
    Ecco qui il mio codice :

    codice:
    #include <iostream.h>
    using namespace std;
    
    class BOX {
      private:
        int a;
        BOX *next;
        
      public:
        BOX(void) { a = 0; next = NULL; }
        void set(int n) { a = n; }
        void point_at_next(BOX *last, BOX *nuovo_scat) { last->next = nuovo_scat; last = nuovo_scat; }
        int leggiDato(void) { return a; }
        void stampa(BOX *start);
    };
    
    void BOX::stampa(BOX *start)
    {
       BOX *p;
       
       p = start;
       
       if (p == NULL)
         cout << "Lista vuota!\n";
         else {
                 cout << "Gli elementi della lista sono : " << p->a;  
                 p = p->next;
         }                             
    }
    
    
    main()
    {
       BOX *st = NULL; 
       BOX *ultimo, *nuovo;
       int num = 0;
       BOX *box;
       int scelta = 0;
       
       BOX();
       
       do {
             cout << "--------------------------------------------------------------------------------\n";
             cout << "                                  LISTA LINKATA                                 \n";
             cout << "--------------------------------------------------------------------------------\n\n";
             cout << "Digita '0' per aggiungere un nuovo elemento alla lista; '1' per collegare \n";
             cout << "l'ultimo elemento della lista col nuovo; '2' per stampare la lista; '99' per \n";
             cout << "uscire dal programma.\n\n";
             cout << "Effettua una scelta: ";
             
             cin >> scelta;
             
             switch (scelta) {
               case 0 :
                 cout << "Inserisci il numero da aggiungere alla lista : ";
                 cin >> num;
                 box = new BOX;
                 box->set(num);
                 break;
                 
               case 1 : 
                 box->point_at_next(ultimo, nuovo);
                 break;
                 
               case 2 :
                 box->stampa(st);
                 break;
                 
               case 99 :
                 cout << "Uscita dal programma!\n\n";
                 break;
                 
               default :
                 cout << "Sorry! Bad menu selection!\n\n";
                 break;
             }
       } while (scelta != 99);
    
    system("pause");
    return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    ps: la stampa è sbagliata.. dovrebbe esserci un while non un if..

    cmq la funzione non fa il suo dovere perchè la chiami in modo sbagliato.. tipo gli passi 2 puntatori che puntato al nulla.. ultimo e nuovo non sono usati nel main..

  3. #3
    ultimo e nuovo non sono usati nel main..
    Ciao, Stoicenko! Che cosa intendi con "non sono usati", non li devo usare? Perchè sono gli argomenti attuali della funzione point_at_next()..

  4. #4
    Già eliminare i seguenti potrebbe servire:
    codice:
    $ g++ -Wall -ansi -pedantic -Wextra -Wconversion main.cpp 
    In file included from /usr/include/c++/4.0.0/backward/iostream.h:31,
                     from main.cpp:1:
    /usr/include/c++/4.0.0/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
    main.cpp:32: error: ISO C++ forbids declaration of 'main' with no type
    se il tuo compilatore non ti evidenzia i problemi sopra elencati, allora cambialo (il compilatore).

    dato che ci sei elimina (non è portabile e puoi ottenere lo stesso effetto senza alcuna istruzione, semplicemente cambiando il modo con cui esegui il tuo programma, ad esempio invocandolo direttamente da terminal, o settando opportunamente un breakpoint nel debugger):
    codice:
    system ("pause");
    In ogni modo come ti ha già detto Stoicenko, i puntatori "ultimo e "nuovo" hanno dei valori indefiniti quando chiami:
    codice:
    box->point_at_next(ultimo, nuovo);
    il che significa che il tuo programma ha un comportamento indefinito

  5. #5
    Ho praticamente riscritto tutto il programma, perchè effettivamente non aveva molto senso. La funzione stampa(), però, presenta tuttora delle imprecisioni; dopo aver fatto l'apposito debug, come giustamente consigliato da MacApp, gli errori sono di sicuro nelle righe 48 e 51. Visualizzo in output dei numeri a caso, anzichè i numeri da me inseriti..
    Questo è il codice ora:
    codice:
    #include <iostream.h>
    
    class BOX {
      public:
        int a;           // Numero inserito dall'utente nella lista
        BOX *next;   // Puntatore al prossimo elemento
        BOX *start;
        BOX *last;
    
        BOX(void) { int a = 0; next = NULL; start = NULL; last = NULL; }   // Costruttore
        void setDato(int);
        void stampa(void);
        ~BOX(void);
    };
    
    void BOX::setDato(int a)
    {
       BOX *temp;
         
       if (start == NULL) {
         temp = new BOX;
         start = temp;
         last = temp;
       } else {
                 temp = new BOX;
                 last->next = temp;
                 last = temp;
         }
    }
    
    void BOX::stampa(void)
    {
       BOX *temp = start;
         
       if (temp == NULL)
         cout << "La lista e' vuota!\n\n";
         else {
                 cout << "Gli elementi della lista sono : \n";
                 while (temp->next != NULL) {
                   cout << temp << "\n";
                   temp = temp->next;
                   cout << temp->a << "\n";
                 }
         }
    }
    
    BOX::~BOX(void)
    {
       cout << "BOX destructor speaking : \n\n";
       start = NULL;
       last = NULL;
    
       if (start != NULL && next != NULL)
         cerr << "Error: Trying to destroy a non-empty BOX!\n\n";
    }
    
    main()
    {
       int n = 0;
       BOX box;
       int choice = 0;
    
       BOX();
    
       do {
             cout << "--------------------------------------------------------------------------\n";
             cout << "                               LISTA LINKATA                              \n";
             cout << "--------------------------------------------------------------------------\n\n";
             cout << "Digita : 1) per inserire un elemento nella lista;\n";
             cout << "2) Stampare la lista;\n"; 
             cout << "0) Uscire dal programma.\n\n";
             cout << "Effettua una scelta: ";
             cin >> choice;
    
             switch (choice) {
               case 1 :
                 cout << "Inserisci un numero da aggiungere alla lista : ";
                 cin >> n;
                 cout << "\n\n";
                 box.setDato(n);
                 break;
    
               case 2 :
                 box.stampa();
                 break;
    
               case 0 :
                 cout << "Exiting program!\n\n";
                 break;
    
               default :
                 cout << "Sorry! Bad menu selection!\n\n";
                 break;
             }
       } while (choice != 0);
    return 0;
    }

  6. #6

  7. #7
    Nessuno può darmi qualche piccolo suggerimento??

  8. #8

  9. #9
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    che cos'è quel BOX(); in mezzo al codice?

    cmq la stampa è sempre sbagliata.. parti stampando il primo ma quando arrivi alla fine non stampi di sicuro l'ultimo..

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 © 2025 vBulletin Solutions, Inc. All rights reserved.