Lista ordinata

di il
16 risposte

Lista ordinata

Salve sono uno studente e vorrei un aiuto su questo programma riguardante la creazione di una lista ordinata di interi
Le tre variabili del costruttore vengono viste come inutilizzate nello stesso ma nel main quelle stesse variabili non vengono riconosciute
Ecco il main

#include <iostream>
#include <stddef.h>
#include "Lista.h"

using namespace std;

int main() {
	Lista l;
	l.insert();
	return 0;
}
Questo è l'header della classe
#ifndef LISTA_H_
#define LISTA_H_
#include <stddef.h>
namespace std{
class Lista{
public:
	struct nodo{
		struct nodo *next ; /* puntatore nodo successivo */
		int num ; /* Dati contenuti nel nodo */
	};
Lista(){
	nodo *temp = NULL;
	nodo *testa = NULL;
	nodo *inserimento = NULL;}
void insert();
};
}
#endif /* LISTA_H_ */
Questo il cpp della stessa classe


#include <iostream>
#include <stddef.h>
#include "Lista.h"

using namespace std;

void Lista::insert(){
	inserimento->next = NULL;
	cout<<"inserisci elemento"<<"\n";
	cin>>inserimento->num;
	if(testa==NULL){
	inserimento->next=NULL;
	testa=inserimento;
	}
	else
	{
	if(testa->num > inserimento->num) //inserimento in testa
	{
	inserimento->next = testa;
	testa = inserimento;
	}
	else
	{
	temp = testa;
	while(temp->next != NULL && temp->next->num < inserimento->num)
	temp = temp->next;
	if(temp->next == NULL) //inserimento in fondo 
	{
	temp->next = inserimento;
	}
	else //inserimento in mezzo
	{
	inserimento->next = temp->next;
	temp->next = inserimento;
	}
	}
	}
}
Grazie anticipatamente per l'aiuto

16 Risposte

  • Re: Lista ordinata

    Ciao,

    direi che questo non ha senso:
    
    Lista::insert();
    
    Il metodo insert lo devi chiamare sull'oggetto di tipo Lista, quindi
    
    l.insert();
    
    Inoltre, se non hai buoni motivi per fare diversamente, i campi delle classi andrebbero tenuti "private", mentre andrebbero esposti ("public") solamente i costruttori e i metodi.
  • Re: Lista ordinata

    Grazie della risposta ma ho già corretto con l.insert(); ma non cambia nulla
  • Re: Lista ordinata

    Non ho capito cosa non cambia ... hai un errore?
  • Re: Lista ordinata

    Questi sono i 3 errori preceduti da 3 warning

    "Lista.h:19:9: warning: unused variable 'temp' [-Wunused-variable]
    Lista.h:20:9: warning: unused variable 'testa' [-Wunused-variable]
    Lista.h:21:9: warning: unused variable 'inserimento' [-Wunused-variable]
    Lista.cpp:14:2: error: 'inserimento' was not declared in this scope
    Lista.cpp:17:5: error: 'testa' was not declared in this scope
    Lista.cpp:30:2: error: 'temp' was not declared in this scope"
  • Re: Lista ordinata

    In effetti inserimento, testa e tmp li inizializzi nel costruttore ma... muoiono lì! Non sono campi della classe, quindi non sono visibili agli altri metodi.
  • Re: Lista ordinata

    E come devo renderli visibili esternamente? metterli fuori fa compilare ma con il programma che va in crash al'avvio
  • Re: Lista ordinata

    Secondo me ci sono alcune cose che non hai ben chiare...

    Le classi possono avere dei campi, che definisci nell'header file. Ad esempio una classe Persona può avere come campi Nome, Cognome, Indirizzo, ecc. Questi sono gli attributi di un generico oggetto di tipo Persona.

    Tu vuoi realizzare una classe Lista, che potrebbe essere benissimo mantenuta come un array di nodi, un vector di nodi, ecc. Oppure nel modo classico: un nodo che contiene il valore e il puntatore al nodo successivo. Queste sono le informazioni che devi mettere nell'header. Tutte le altre cose, come variabili di appoggio, locali, ecc. le metti direttamente nell'implementazione dei metodi (nel file .cpp), ricordando però che sono visibili solo all'interno del metodo in cui vengono dichiarate.
  • Re: Lista ordinata

    Grazie della risposta molto chiara ma forse allora mi sfugge anche il senso del costruttore se attributi della classe non posso inizializzarli lì perchè poi i metodi non li vedono...
    se provo ad inizializzare le variabili nodo dai metodi non viene riconosciuto il tipo nodo ed inoltre vorrei che testa e temp fossero strutture che fanno parte della lista stessa( e globalmente visibili) per quello le vorrei inserire nel costruttore così che vengano create assieme ad ogni nuova lista
  • Re: Lista ordinata

    Enrico.95 ha scritto:


    mi sfugge anche il senso del costruttore se attributi della classe non posso inizializzarli lì perchè poi i metodi non li vedono...
    Il problema è che tu li DICHIARI dentro al costruttore! Invece li devi dichiarare FUORI dal costruttore, nel file .h, e poi INIZIALIZZARE nel costruttore.

    Attenzione alla differenza tra dichiarazione e inizializzazione di una variabile: spesso si fanno insieme con
    int n = 1;
    ma sono due operazioni diverse, che si possono benissimo spezzare:
    
    int n;    // dichiaro che ci sarà una variabile n
    n = 1;    // inizializzo il suo valore a 1
    
  • Re: Lista ordinata

    Facendo così
    #ifndef LISTA_H_
    #define LISTA_H_
    #include <stddef.h>
    namespace std{
    class Lista{
    private:
    	struct nodo{
    		struct nodo *next ; /* puntatore nodo successivo */
    		int num ; /* Dati contenuti nel nodo */
    	};
    public:
    	nodo *temp;
    	nodo *testa;
    	nodo *inserimento;
    
    	Lista(){
    		*temp = NULL;
    		*testa = NULL;
    		*inserimento = NULL;
    		}
    void insert();
    };
    }
    #endif /* LISTA_H_ */
    per ognuna delle 3 inizializzazioni ho l'errore:
    error: no match for 'operator=' (operand types are 'std::Lista::nodo' and 'int')
  • Re: Lista ordinata

    
        #ifndef LISTA_H_
        #define LISTA_H_
        #include <stddef.h>
        namespace std{
        class Lista{
        public:
           struct nodo{
              struct nodo *next ; /* puntatore nodo successivo */
              int num ; /* Dati contenuti nel nodo */
           };
           struct nodo *temp;
           struct nodo *testa;
           struct nodo *inserimento;
    
           Lista(){
              temp = NULL;
              testa = NULL;
              inserimento = NULL;
              }
        void insert();
        };
        }
        #endif /* LISTA_H_ */
    
    Non ci volevano gli asterischi davanti ai nomi. L'asterisco fa parte del tipo di dato e vuol dire "puntatore a ...". Il nome della variabile è solo ciò che viene dopo.
  • Re: Lista ordinata

    Grazie non sapevo di non dover inserire l'asterisco nell'inizializzazione; adesso non ci sono ne erorri ne warning ma il programma va in crash ("ListaOrdinata.exe ha smesso di funzionare")
  • Re: Lista ordinata

    Enrico.95 ha scritto:


    grazie non sapevo di non dover inserire l'asterisco nell'inizializzazione; adesso non ci sono ne erorri ne warning ma il programma va in crash ("ListaOrdinata.exe ha smesso di funzionare")
    Questo è un altro problema, probabilmente dovuto a una errata allocazione della memoria. In sintesi, potrebbe essere che tu tenti di scrivere in aree della memoria che non ti appartengono.

    Se posti il codice completo e aggiornato, proviamo a dare un'occhiata.
  • Re: Lista ordinata

    Grazie della disponibilità
    ecco il codice(il programma non è finito c'è solo l'inserimento ma non credo sia questo il problema)

    questo l'agoniato header:
    #ifndef LISTA_H_
    #define LISTA_H_
    #include <stddef.h>
    namespace std{
    class Lista{
    private:
    	struct nodo{
    		struct nodo *next ; /* puntatore nodo successivo */
    		int num ; /* Dati contenuti nel nodo */
    	};
    public:
    	struct nodo *temp;
    	struct nodo *testa;
    	struct nodo *inserimento;
    
    	Lista(){
    		temp = NULL;
    		testa = NULL;
    		inserimento = NULL;
    		}
    void insert();
    };
    }
    #endif /* LISTA_H_ */
    il cpp della classe
    #include "Lista.h"
    
    using namespace std;
    
    void Lista::insert(){
    	inserimento->next = NULL;
    	cout<<"inserisci elemento"<<"\n";
    	cin>>inserimento->num;
    	if(testa==NULL){
    	inserimento->next=NULL;
    	testa=inserimento;
    	}
    	else
    	{
    	if(testa->num > inserimento->num) //inserimento in testa
    	{
    	inserimento->next = testa;
    	testa = inserimento;
    	}
    	else
    	{
    	temp = testa;
    	while(temp->next != NULL && temp->next->num < inserimento->num)
    	temp = temp->next;
    	if(temp->next == NULL) //inserimento in fondo 
    	{
    	temp->next = inserimento;
    	}
    	else //inserimento in mezzo
    	{
    	inserimento->next = temp->next;
    	temp->next = inserimento;
    	}
    	}
    	}
    }
    
    ed infine il main:
    #include <iostream>
    #include <stddef.h>
    #include "Lista.h"
    
    using namespace std;
    
    int main() {
    	Lista l;
    	l.insert();
    	return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
16 risposte