Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    211

    C++ lista von vettore, metodo inslista

    ciao a tutti, sto facendo la lista con vettore e relativo test per controllare se i metodi funzionano correttamente. nel testare la lista ho notato che il metodo inslista non fa quello che dovrebbe fare, cioè spostare in avanti tutti gli elementi che si trovano dopo la posizione indicata dall'argomento del metodo inslista. secondo me il codice è corretto però non riesco a capire dove sta l'errore. posto i codici:

    listav.h
    codice:
    #ifndef listav_h
    #define listav_h
    
    #include<iostream>
    #include<stdlib.h>
    
    using namespace std;
    
    template<class tipoelem>
    class listav
    {
       public:
          typedef int posizione;
       
          listav(int);
       
          void crealista();
          bool listavuota();
          posizione primolista();
          bool finelista(posizione);
          posizione predlista(posizione);
          posizione succlista(posizione);
          tipoelem leggilista(posizione);
          void scrivilista(posizione, tipoelem);
          void inslista(posizione, tipoelem);
          void canclista(posizione);
          
          void stampalista();
       private:
          tipoelem *array;
          int maxdim;
          int lunglista;
    };
    
    #endif
    
    template<class tipoelem>
    listav<tipoelem>::listav(int dimensione)
    {
       maxdim = dimensione;
       crealista();
    }
    
    template<class tipoelem>
    void listav<tipoelem>::crealista()
    {
       array = new tipoelem[maxdim];
       lunglista = 0;
    }
    
    template<class tipoelem>
    bool listav<tipoelem>::listavuota()
    {
       return(lunglista == 0);
    }
    
    template<class tipoelem>
    typename listav<tipoelem>::posizione listav<tipoelem>::primolista()
    {
       if(!this->listavuota())
          return 0;
       else
          cerr << "lista vuota. operatore primolista() non applicabile. ";
    }
    
    template<class tipoelem>
    bool listav<tipoelem>::finelista(typename listav<tipoelem>::posizione pos)
    {
       return(pos == (lunglista - 1));
    }
    
    template<class tipoelem>
    typename listav<tipoelem>::posizione listav<tipoelem>::predlista(typename listav<tipoelem>::posizione pos)
    {
       if(pos == (lunglista - 1))
          return 0;
       else
          return (pos + 1);
    }
    
    template<class tipoelem>
    typename listav<tipoelem>::posizione listav<tipoelem>::succlista(typename listav<tipoelem>::posizione pos)
    {
       if(pos == 0)
          return (lunglista - 1);
       else
          return (pos - 1);
    }
    
    template<class tipoelem>
    tipoelem listav<tipoelem>::leggilista(typename listav<tipoelem>::posizione pos)
    {
       return(array[pos]);
    }
    
    template<class tipoelem>
    void listav<tipoelem>::scrivilista(typename listav<tipoelem>::posizione pos, tipoelem elem)
    {
       array[pos] = elem;
    }
    
    template<class tipoelem>
    void listav<tipoelem>::inslista(typename listav<tipoelem>::posizione pos, tipoelem elem)
    {
       if(lunglista < maxdim) //si può inserire l'elemento?
       {
          if(pos <= (lunglista - 1)) //ci sono elementi da spostare?
          {
             for(int i = (lunglista - 1); i >= pos; i--) //spostamento degli elementi
                array[i + 1] = array[i];
             
             array[pos] = elem;
          }
          else
             array[pos] = elem;
          
          ++lunglista;
       }
       else
          cerr << "lista piena.\n\n";
    }
    
    template<class tipoelem>
    void listav<tipoelem>::canclista(typename listav<tipoelem>::posizione pos)
    {
       if(lunglista > 0) //si può eliminare?
       {
          if(pos < (lunglista - 1))
          {
             for(int i = (pos + 1); i < lunglista; i--)
                array[i - 1] = array[i];
          }
          else
          {
             array[pos] = 0;
          }
          
          lunglista--;
       }
       else
          cerr << "lista vuota.\n\n";
    }
    
    template<class tipoelem>
    void listav<tipoelem>::stampalista()
    {
       typename listav<tipoelem>::posizione p = this->primolista();
       
       cout << "lunglista = " << lunglista << "\n";
       while(p != (lunglista - 1))
       {
          cout << this->leggilista(p) << "\n";
          p = this->succlista(p);
       }
       cout << this->leggilista(p) << "\n";
    }
    in pratica ho notato l'anomalia eseguendo l'inserimento, tramite ciclo, di 10 elementi nella lista (istruzione in rosso).

    testlistav.cpp
    codice:
    #include "listav.h"
    #include<iostream>
    #include<stdlib.h>
    
    using namespace std;
    
    int main()
    {
       listav<int> list(20);
       listav<int>::posizione p;
       cout << "listavuota() = " << list.listavuota() << "\n\n";
       cout << "primolista() = " << list.primolista() << "\n\n";
       list.inslista(0, 10);
       cout << "primolista() = " << list.primolista() << "\n\n";
       cout << "leggilista(primolista()) = " << list.leggilista(list.primolista()) << "\n\n";
       list.scrivilista(list.primolista(), 20);
       cout << "leggilista(primolista()) = " << list.leggilista(list.primolista()) << "\n\n";
       cout << "finelista(primolista()) = " << list.finelista(list.primolista()) << "\n\n";
       for(int i = 0; i < 10; i++)
          list.inslista(list.primolista(), (i * 10));
       cout << "leggilista(primolista()) = " << list.leggilista(list.primolista()) << "\n";
       p = list.succlista(list.primolista());
       cout << "leggilista(p) = " << list.leggilista(p) << "\n";
       
       list.stampalista();
       
       cout << "\n";
       
       system("pause");
       return 0;
    }
    chi mi aiuta a risolvere il problema?

  2. #2

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    211
    non ho capito cosa intendi per sposto in programmazione. :-)

  4. #4
    significa che il Forum ha oltre 50 stanze
    e originariamente avevi postato su XHTML
    quando il tuo problema è di C++

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    211
    ah ok, non me ne sono accorto.

  6. #6
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Questo è il metodo primolista:
    codice:
    template<class tipoelem>
    typename listav<tipoelem>::posizione listav<tipoelem>::primolista()
    {
       if(!this->listavuota())
          return 0;
       else
          cerr << "lista vuota. operatore primolista() non applicabile. ";
    }
    Perchè se la lista non è vuota stampa un errore?
    Tra l' altro se è vuota non ritorna proprio un valore, non dovrebbe comportarsi così.
    Ne risenti quando usi la inslista:
    codice:
    for(int i = 0; i < 10; i++)
          list.inslista(list.primolista(), (i * 10));
    Scommetto che inserisce al massimo un elemento, poi il programma continua a girare ma senza fare niente.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    211
    non penso che sia come dici tu perchè, se ci fai caso, prima del ciclo che inserisce i 10 elementi c'è una prima inslista, quindi nel ciclo la lista non è vuota. cmq provo a togliere l'errore.
    in pratica nelle lista viene inserito il valore 10, poi viene cambiato col valore 20 tramite il metodo scrivilista. dopo di che nel ciclo dovrebbero essere inseriti i valori da 0 a 9 moltiplicati per 10, ma viene fatto correttamente il primo inserimento mentre tutti gli altri vengono sovrascritti nelle prima posizione invece di spostare in avanti i precedenti. quando faccio la visualizzazione a video della lista viene visualizzato solo il valore 90, che è l'ultimo inserito sovrascrivendo i precedenti, e il valore 20 che sarebbe quello inserito nella lista prima del ciclo.

  8. #8
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Prova a cambiare il metodo primolista e compilalo, voglio sapere se funziona.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    211
    già fatto, il problema non è risolto.

  10. #10
    provato a sostituire:
    codice:
    for(int i = (lunglista - 1); i >= pos; i--)
    con:
    codice:
    for(int i = (lunglista - 1); i > pos; i--)
    ?
    Administrator of NAMDesign.Net

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.