Classi contenenti liste

di il
10 risposte

Classi contenenti liste

Salve. Chiedo scusa se per molti può sembrare stupida ma sono davvero scarso in programmazione, la mia domanda è questa, ma è possibile in c++ implementare una classe contenente una o più liste dinamiche cui oggetti della lista sono istanze di altre classi, che oltretutto sono classi derivate?...esempio banale una classe facolta che contiene una lista dinamica di biblioteche, nella quale ogni biblioteca contiene una lista di libri...magari qualkuno di buon cuore può darmi una piccola bozza per darmi un idea di come fare?se si puo fare ovviamente....ringrazio chiunque mi dia una mano

10 Risposte

  • Re: Classi contenenti liste

    Certo che si puo' fare.

    Il problema e' : come lo vuoi fare?

    Soluizione 1: implementazione manuale della lista. Ma questo richiede la conoscenza di come si implementa una lista, il concetto di puntatore, il concetto di allocazione dinamica della menoria, eccc.

    Soluizione 2: utilizzo delle Standard Template Library (dette anche STL). Ma questo richiede sapere cosa sono le STL, che cosa sono i Template, e come si usano (i Template e le STL !)

    Se cerchi una soluzione ancora piu' semplice, non c'e'!
  • Re: Classi contenenti liste

    Grazie della risposta...con i template ed stl sto a zero...con le liste alquanto con qualke difficolta potrei farcela pero se magari mi dai un piccolo esempio da cui partire per dichiarare una lista dinamica di oggetti in una classe mi faresti un favore...ho cercato sul web ma non ho trovato nnt al riguardo per questo mi e venuto il dubbio non fosse fattibile......cmq ho cercato di abbozzare fare qualkosa con le mie poche conoscenze....intanto mi da un errore riferito ad una funzione per la costruzione della classe nodo della lista....l'errore mi dice che non e corretto scrivere
    typedef char E [80]; e poi definire una funzione per recuperare il valore dell'elemento cosi scritta:
    E elemento(){return Cognome;} //funzione per recuperare il valore di Cognome
    dove ovviamente Cognome e definita prima con: E Cognome;
    l'errore che mi da è:
    [Error] incompatible types in assignment of 'char*' to 'E {aka char [80]}'

    ovviamente se volete posso postare tutto il codice....thanks
  • Re: Classi contenenti liste

    ESEMPIO BANALE:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    class NUMERO
    {
    private:
        int n;
    
    public:
        NUMERO(){};
        NUMERO(int num){ n=num; };
    
        void setN(int num){ n=num; } ;
        int getN(){ return n; } ;
    };
    
    
    struct LISTA_NUM
    {
        NUMERO elem;
        LISTA_NUM* next;
    };
    
    
    class LISTA
    {
    private:
        LISTA_NUM* n;
    
    public:
        LISTA(){ n=NULL; };
    
        LISTA(NUMERO num){
            n=new LISTA_NUM;
            n->elem= num;
            n->next= NULL;
        }
    
        NUMERO getFirst(){ return n->elem; }
    
        void deleteFirst(){
            LISTA_NUM* t= n;
            n=n->next;
            delete t;
        };
    
        void addFirst(NUMERO num){
            LISTA_NUM* t= n;
            n=new LISTA_NUM;
            n->elem= num;
            n->next= t;
        }
    
    };
    
    
    int main()
    {
        LISTA l;
        NUMERO n;
    
        n.setN(1);
        l.addFirst(n);
        n.setN(2);
        l.addFirst(n);
        n.setN(3);
        l.addFirst(n);
        n.setN(4);
        l.addFirst(n);
        n.setN(5);
        l.addFirst(n);
    
        NUMERO nr;
    
        nr=l.getFirst();
        l.deleteFirst();
        printf("%d\n", nr.getN());
        nr=l.getFirst();
        l.deleteFirst();
        printf("%d\n", nr.getN());
        nr=l.getFirst();
        l.deleteFirst();
        printf("%d\n", nr.getN());
        nr=l.getFirst();
        l.deleteFirst();
        printf("%d\n", nr.getN());
        nr=l.getFirst();
        l.deleteFirst();
        printf("%d\n", nr.getN());
    
    
        return 0;
    }
  • Re: Classi contenenti liste

    ale99 ha scritto:


    ESEMPIO BANALE:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    class NUMERO
    {
    private:
        int n;
    
    public:
        NUMERO(){};
        NUMERO(int num){ n=num; };
    
        void setN(int num){ n=num; } ;
        int getN(){ return n; } ;
    };
    
    
    struct LISTA_NUM
    {
        NUMERO elem;
        LISTA_NUM* next;
    };
    
    
    class LISTA
    {
    private:
        LISTA_NUM* n;
    
    public:
        LISTA(){ n=NULL; };
    
        LISTA(NUMERO num){
            n=new LISTA_NUM;
            n->elem= num;
            n->next= NULL;
        }
    
        NUMERO getFirst(){ return n->elem; }
    
        void deleteFirst(){
            LISTA_NUM* t= n;
            n=n->next;
            delete t;
        };
    
        void addFirst(NUMERO num){
            LISTA_NUM* t= n;
            n=new LISTA_NUM;
            n->elem= num;
            n->next= t;
        }
    
    };
    
    
    int main()
    {
        LISTA l;
        NUMERO n;
    
        n.setN(1);
        l.addFirst(n);
        n.setN(2);
        l.addFirst(n);
        n.setN(3);
        l.addFirst(n);
        n.setN(4);
        l.addFirst(n);
        n.setN(5);
        l.addFirst(n);
    
        NUMERO nr;
    
        nr=l.getFirst();
        l.deleteFirst();
        printf("%d\n", nr.getN());
        nr=l.getFirst();
        l.deleteFirst();
        printf("%d\n", nr.getN());
        nr=l.getFirst();
        l.deleteFirst();
        printf("%d\n", nr.getN());
        nr=l.getFirst();
        l.deleteFirst();
        printf("%d\n", nr.getN());
        nr=l.getFirst();
        l.deleteFirst();
        printf("%d\n", nr.getN());
    
    
        return 0;
    }
    Ciao,
    faccio una domanda perché la tua risposta mi ha incuriosito: come mai usi le inclusioni del C, le chiamate del C (come printf) ma poi il file è un sorgente di C++ (si vede ad esempio dalla keyword "class")? Non si poteva fare tutto in C++?
    Sicuramente funziona anche così ma ero curioso...
  • Re: Classi contenenti liste

    Beh, non c'è un motivo...

    Semplicemente io non uso o c o c++ (sinceramente non so neanche quale siano le differenze ) ma uso la funzione che al momento mi sembra migliore

    Ad esempio preferisco printf() a cout perché con printf posso formattare come voglio l'output ( es: stampare il valore numerico di un char, stampare il valore esadecimale di un int )
  • Re: Classi contenenti liste

    Tutto chiaro.
    Il dubbio mi era venuto perché per definire una classe vera e propria hai bisogno di un linguaggio di OOP, quindi non il C. Però poi vedevo le inclusioni e le funzioni del C...

  • Re: Classi contenenti liste

    Comunque compilo sempre in c++, così non ho problemi.
    L'unica cosa del c da non usare sono le funzioni deprecated
  • Re: Classi contenenti liste

    Ale99 ti ringrazio della risposta mi ha aiutato molto....h solo un ultimo problema ...se invece di una valore intero volevo una stringa perchè lo stesso codice leggermente modificato non compila?....ti invio il codice e grazie ancora..
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    typedef char N[80];
    class Parola
    {
        
    
    public:
    	N Nome;
        Parola();
        Parola(N  n) {
    	strcpy(Nome,n);
    }
        void setN(N num){strcpy(Nome,num); } ;
        N getN(){ return Nome; } ;
    };
    
    
    struct LISTA_PAR
    {
        Parola elem;
        LISTA_NUM* next;
    };
    
    
    class LISTA
    {
    private:
        LISTA_PAR* n;
    
    public:
        LISTA(){ n=NULL; };
    
        LISTA(NUMERO num){
            n=new LISTA_PAR;
            n->elem= num;
            n->next= NULL;
        }
    
        Parola getFirst(){ return n->elem; }
    
        void deleteFirst(){
            LISTA_PAR* t= n;
            n=n->next;
            delete t;
        };
    
        void addFirst(Parola num){
            LISTA_PAR* t= n;
            n=new LISTA_PAR;
            n->elem= num;
            n->next= t;
        }
    
    };
    
    
    int main()
    {
        LISTA l;
        Parola n;
    
        n.setN("A");
        l.addFirst(n);
        n.setN("ff");
        l.addFirst(n);
        n.setN("cdd");
        l.addFirst(n);
        n.setN("dfdg");
        l.addFirst(n);
        n.setN("defe");
        l.addFirst(n);
    
        NUMERO nr;
    
        nr=l.getFirst();
        l.deleteFirst();
        printf("%d\n", nr.getN());
        nr=l.getFirst();
        l.deleteFirst();
        printf("%d\n", nr.getN());
        nr=l.getFirst();
        l.deleteFirst();
        printf("%d\n", nr.getN());
        nr=l.getFirst();
        l.deleteFirst();
        printf("%d\n", nr.getN());
        nr=l.getFirst();
        l.deleteFirst();
        printf("%d\n", nr.getN());
    
    
        return 0;
    }
  • Re: Classi contenenti liste

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    typedef char N[80];
    
    class Parola
    {
    public:
       N Nome;
        Parola() { } ;          // anche se non c'è alcuna istruzione, devi comunque definire una funzione   undefined reference to `Parola::Parola()'
        Parola(N  n) {
            strncpy(Nome,n,80);     // strncpy() e' più sicura di strcpy()
        }
    
        void setN(N num){strncpy(Nome,num,80); } ;
        char* getN(){ return Nome; } ;                //le funzioni ritornano puntatori e valori, ma non array   error: 'getN' declared as function returning an array
    };
    
    
    struct LISTA_PAR
    {
        Parola elem;
        LISTA_PAR* next;     // ti sei dimenticato di cambiare nome - error: 'LISTA_NUM' does not name a type
    };
    
    
    class LISTA
    {
    private:
        LISTA_PAR* n;
    
    public:
        LISTA(){ n=NULL; };
    
        LISTA(Parola num){         //ti sei dimenticato di cambiare tipo di dato    error: expected ')' before 'num'
            n=new LISTA_PAR;
            n->elem= num;
            n->next= NULL;
        }
    
        Parola getFirst(){ return n->elem; }
    
        void deleteFirst(){
            LISTA_PAR* t= n;
            n=n->next;
            delete t;
        };
    
        void addFirst(Parola num){
            LISTA_PAR* t= n;
            n=new LISTA_PAR;
            n->elem= num;
            n->next= t;
        }
    
    };
    
    
    int main()
    {
        LISTA l;
        Parola n;
    
        n.setN("A");
        l.addFirst(n);
        n.setN("ff");
        l.addFirst(n);
        n.setN("cdd");
        l.addFirst(n);
        n.setN("dfdg");
        l.addFirst(n);
        n.setN("defe");
        l.addFirst(n);
    
        Parola nr;      // dimenticato dinuovo di cambiare nome  'NUMERO' was not declared in this scope
    
        nr=l.getFirst();
        l.deleteFirst();
        printf("%s\n", nr.getN());     // printf necessita di %s per stampare una stringa  warning: format '%d' expects argument of type 'int', but argument 2 has type 'char*' [-Wformat]
        nr=l.getFirst();
        l.deleteFirst();
        printf("%s\n", nr.getN());
        nr=l.getFirst();
        l.deleteFirst();
        printf("%s\n", nr.getN());
        nr=l.getFirst();
        l.deleteFirst();
        printf("%s\n", nr.getN());
        nr=l.getFirst();
        l.deleteFirst();
        printf("%s\n", nr.getN());
    
    
        return 0;
    }
    
  • Re: Classi contenenti liste

    Gentilissimo e velocissimo...thanks .......scusami ma continuo ad approfittare della tua disponibilità per un ultima volta...ho aggiunto 3 funzioni al codice...che poi fondamentalmente sono quelle che mi interessano alla lista...cioe stampa, elimina elemento ed inserisci in coda, ma mi danno errori che proprio non riesco a risolvere, credo siano errori nel non saper maneggiare benissimo i puntatori quando chiamo le variabili...se puoi dargli un ultima occhiata te ne sono grato....ps: ho rivisto un po di errori sui puntatori, viene compilato ma la funzione di ricerca find e quella di elimina elemento non riesco a farle funzionare correttamente lista
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    typedef char N[80];
    using namespace std;
    class Parola
    {
    public:
       N Nome;
       int nu;
        Parola() { } ;          // anche se non c'è alcuna istruzione, devi comunque definire una funzione   undefined reference to `Parola::Parola()'
        Parola(N  n, int num) {
            strncpy(Nome,n,80); 
    		nu=num;    // strncpy() e' più sicura di strcpy()
        }
    
        void setN(N num, int nume){strncpy(Nome,num,80);
        nu=nume;
    	 } ;
        char* getN(){ return Nome; } ;   
    	int getnu(){  return nu;};           //le funzioni ritornano puntatori e valori, ma non array   error: 'getN' declared as function returning an array
    };
    
    
    struct LISTA_PAR
    {
        Parola elem;
        LISTA_PAR* next;     // ti sei dimenticato di cambiare nome - error: 'LISTA_NUM' does not name a type
    };
    
    
    class LISTA
    {
    private:
        LISTA_PAR* n;
    
    public:
        LISTA(){ n=NULL; };
    
        LISTA(Parola num){         //ti sei dimenticato di cambiare tipo di dato    error: expected ')' before 'num'
            n=new LISTA_PAR;
            n->elem= num;
            n->next= NULL;
        }
    
        Parola getFirst(){ return n->elem; }
    
        void deleteFirst(){
            LISTA_PAR* t= n;
            n=n->next;
            delete t;
        };
    
        void addFirst(Parola num){
            LISTA_PAR* t= n;
            n=new LISTA_PAR;
            n->elem= num;
            n->next= t;
        }
    void addcoda(Parola num) {
     
    LISTA_PAR* t;
    			/* caso lista inizialmente vuota */
     if(n==NULL){
     	 n=new LISTA_PAR;
     	n->elem= num;
            n->next= NULL;
     }
      		 	/* caso lista con almeno un elemento */
    t= n;
    
    	/* vado avanti fino alla fine della lista */
      while(t->next!=NULL)
        t=t->next;
    
    	/* qui t punta all'ultima struttura della lista: ne
    	creo una nuova e sposto il puntatore in avanti */
      t->next=new LISTA_PAR;
      t=t->next;
    
    	/* metto i valori nell'ultima struttura */
      t->elem=num;
      t->next=NULL;
    };
    
    void StampaLista() {
       LISTA_PAR* t;
    
      t=n;
      while(t!=NULL) {
       cout<<t->elem.Nome<<endl;
        t=t->next;
      }
    
      printf("\n");
    }
    
    bool find(const N e)const{
    	bool trovato=false;
    	
    	LISTA_PAR* t=n;
    	while (t && !trovato) {
    		if (strncmp(t->elem.Nome,e,80)==0) {
    			trovato=true;
    			cout<<"trovato"<<endl;
    		}else {
    			t=t->next;
    			
    		}
    	}
    	return trovato;	
    };
    
    bool findposition(const N e,LISTA_PAR * pos)const{
    	bool trovato=false;
    	LISTA_PAR* t=n;
    	
    	while (t && !trovato) {
    		if (strncmp(t->elem.Nome,e,80)) {
    			trovato=true;
    			pos=t;
    		}else {
    			t=t->next;
    			pos=t;
    		}
    	}
    	return trovato;
    };
    bool elimina_dato(const N e){
    	LISTA_PAR* t=n;
    	
    	if (findposition(e, t)) {
    		LISTA_PAR* temp1=t->next;
    		strcpy(t->next->elem.Nome,"");
    		t->next=t->next->next;
    		delete temp1;
    		return true;
    	}else {
    		return false;
    	}
    
    };
    
    
    int main()
    {
        LISTA l;
        Parola n;
    
        n.setN("A", 3);
        l.addFirst(n);
        n.setN("fjjf",5);
        l.addcoda(n);
        n.setN("cdd",5);
        l.addcoda(n);
        n.setN("dfdg",6);
        l.addcoda(n);
        n.setN("defe",7);
        l.addcoda(n);
         l.find("ff");
        Parola nr;      // dimenticato dinuovo di cambiare nome  'NUMERO' was not declared in this scope
    
        l.StampaLista();
        l.elimina_dato("ff");
       l.StampaLista();
       l.find("ff");
    
        return 0;
    }
Devi accedere o registrarti per scrivere nel forum
10 risposte