Newsgroup: it.comp.lang.c++
Titolo: Problema con TDA con classe.

Ho un lista dinamica implementata tramite classe.
Non riesco proprio a capire quale sia il problema.
Inserisco qui il codice, se qualcuno ha la voglia e la pazienza di
leggerselo...
/************************************************************
lista.h*************************************************/
#ifndef _ListaORD_H
#define _ListaORD_H
#include <string>
using namespace std;
struct Record;
typedef Record* L;
struct Record{
       string nome;
       string matricola;
       int esami;
       L succ;
};
class Lista{
      private:
         L l;
         void elimina_in_testa(L& l);
         void inserisciric(L& p,const string NOME,const string
MATRICOLA,const int ESAMI);
         void eliminaric(L& p,const string NOME);
         bool inlistric(const L p,const string NOME);
      public:
         Lista() {l=0;};
         ~Lista();
         bool empty() const{return(l==0);}
         bool full() const{return false;}
         void push(const string NOME,const string MATRICOLA,const int
ESAMI);
         void pop();
         void inserisci(const string NOME,const string MATRICOLA,const int
ESAMI){
              inserisciric(l,NOME,MATRICOLA,ESAMI);}
         void elimina(const string NOME) {
              eliminaric(l,NOME);}
         void stampa() const;
         bool inlist(const string NOME) const{ return inlistric(l,NOME);}
};
#endif
/********************************************************** lista.cpp
************************************************************/
#include "ListaORD.h"
#include <iostream>
using namespace std;
Lista::~Lista(){
       L p, q;
          for(p=l;p!=0;p=q){
              q=p->succ;
              delete p;
          }
}
void Lista::elimina_in_testa(L& l){
     L temp=l->succ;
     delete l;
     l=temp;
}
void Lista::inserisciric(L& p,const string NOME,const string MATRICOLA,const
int ESAMI){
     if((p==0) || (NOME<p->nome))
         p.push(NOME,MATRICOLA,ESAMI);
     else inserisciric(p->succ,NOME,MATRICOLA,ESAMI);
}
void Lista::eliminaric(L& p,const string NOME){
     if(p!=0){
              if(NOME==p->nome) elimina_in_testa(p);
              else eliminaric(p->succ,NOME);
     }
}
bool Lista::inlistric(const L p,const string NOME){
     if(p==0) return false;
     else{
          if(NOME==p->nome) return true;
          else return inlistric(p->succ,NOME);
     }
}
void Lista::push(const string NOME,const string MATRICOLA,const int ESAMI){
     L q=new Record;
     q->nome=NOME;
     q->matricola=MATRICOLA;
     q->esami=ESAMI;
     q->succ=l;
     l=q;
}
void Lista::pop(){
     if(l!=0){
              L temp=l;
              l=l->succ;
              delete temp;
     }
}
void Lista::stampa() const{
     if(l!=0){
   L temp;
   cout << endl;
   for(temp=l;temp;temp=temp->succ){
    cout << "NOME: " << temp->nome << " "
                  << "MATRICOLA: " << temp->matricola << " "
                  << "ESAMI: " << temp->esami << endl;
   }
     }
     else cout << "\nImpossibile eseguire. Lista vuota.";
}
/**********************************************************************
usalista.cpp *******************************************************/
#include <iostream>
#include <string>
#include <stdlib.h>
#include "ListaORD.h"
using namespace std;
int main(){
 Lista lista;
 string NOME,MATRICOLA; int ESAMI;
 int scelta=0;
 while(scelta!=100){
  cout << "\nCosa si desidera fare?";
        cout << "\n1) Inserimento ordinato.";
  cout << "\n2) Inserimento in testa.";
  cout << "\n3) Eliminazione ordinata.";
  cout << "\n4) Eliminazione in testa.";
  cout << "\n5) Ricerca di un elemento.";
  cout << "\n6) Stampa della lista.";
  cout << "\n100) Uscire dal programma.";
  cout << "\n-->";
  cin >> scelta;
        switch(scelta){
      case 1:
    cout << "\nInserire il nome:";
    cin >> NOME;
             cout << "\nInserire matricola:";
             cin >> MATRICOLA;
             cout << "\nInserire numero esami:";
             cin >> ESAMI;
    lista.inserisci(NOME,MATRICOLA,ESAMI);
    break;
      case 2:
   cout << "\nInserire il nome:";
    cin >> NOME;
             cout << "\nInserire matricola:";
             cin >> MATRICOLA;
             cout << "\nInserire numero esami:";
             cin >> ESAMI;
             lista.push(NOME,MATRICOLA,ESAMI);
    break;
      case 3:
    cout << "\nInserire il nome da eliminare:";
             cin >> NOME;
    lista.elimina(NOME);
    break;
      case 4:
    cout << "\nEliminazione in testa...";
    lista.pop();
    break;
      case 5:
    cout << "\nInserire il nome da cercare:";
    cin >> NOME;
    if(lista.inlist(NOME) cout << "\nElemento presente";
    else cout << "\nElemento non presente";
    break;
      case 6:
    cout << "\nStampa della lista..." << endl;
    lista.stampa();
    break;
      case 100:
    cout << "\nArrivederci!"<<endl;
    system("PAUSE");
    return 0;
            default:
             cout << "\nScelta errata!" <<endl;
  }
 }
 return 1;
}
GRAZIE

 #define _ListaORD_H
non hai postato gli errori ma ho notato questa incongruenza (forse è solo un
errore di battitura)
il file si chiama lista.h ma tu includi ListaORD.h
ciao

)' discards qualifiers
d:\università\programmazione\programmi\classe lista
ordinata\usalistaord.cpp: In function `int main()':
d:\università\programmazione\programmi\classe lista
ordinata\usalistaord.cpp:56: parse error before `<'
d:\università\programmazione\programmi\classe lista
ordinata\usalistaord.cpp:72: confused by earlier errors, bailing out


No...no...l'ho scritto cosi' per semplicita'....

 >> leggerselo...
c'erano un pò di errori sparsi qua e là...nulla di grave cmq...errori di
distrazione (parentesi e qualche chiamata a oggetto superflua):
ecco il codice corretto:
****lista.h
#ifndef LISTA_H
#define LISTA_H
#include <string>
using namespace std;
struct Record{
       string nome;
       string matricola;
       int esami;
       Record* succ;
};
typedef Record* L;
class Lista{
      private:
         L l;
         void elimina_in_testa(L& l);
         void inserisciric(L& p,const string NOME,const string
MATRICOLA,const int ESAMI);
         void eliminaric(L& p,const string NOME);
         bool inlistric(const L p,const string NOME);
      public:
         Lista() {l=0;};
         ~Lista();
         bool empty() const{return(l==0);}
         bool full() const{return false;}
         void push(const string NOME,const string MATRICOLA,const int
ESAMI);
         void pop();
         void inserisci(const string NOME,const string MATRICOLA,const int
ESAMI){inserisciric(l,NOME,MATRICOLA,ESAMI);}
         void elimina(const string NOME) {eliminaric(l,NOME);}
         void stampa() const;
         bool inlist(const string NOME) { inlistric(l,NOME);}
};
#endif
****lista.cpp
#include "lista.h"
#include <iostream>
using namespace std;
Lista::~Lista(){
       L p, q;
          for(p=l;p!=0;p=q){
              q=p->succ;
              delete p;
          }
}
void Lista::elimina_in_testa(L& l){
     L temp=l->succ;
     delete l;
     l=temp;
}
void Lista::inserisciric(L& p,const string NOME,const string MATRICOLA,const
int ESAMI){
     if((p==0) || (NOME<p->nome))
         push(NOME,MATRICOLA,ESAMI);
     else inserisciric(p->succ,NOME,MATRICOLA,ESAMI);
}




****usalista.cpp
#include <iostream>
#include <string>
#include <stdlib.h>
#include "lista.h"
using namespace std;
int main(){
 Lista l;
 string NOME,MATRICOLA; int ESAMI;
 int scelta=0;
 while(scelta!=100){
  cout << "\nCosa si desidera fare?";
        cout << "\n1) Inserimento ordinato.";
  cout << "\n2) Inserimento in testa.";
  cout << "\n3) Eliminazione ordinata.";
  cout << "\n4) Eliminazione in testa.";
  cout << "\n5) Ricerca di un elemento.";
  cout << "\n6) Stampa della lista.";
  cout << "\n100) Uscire dal programma.";
  cout << "\n-->";
  cin >> scelta;
        switch(scelta){
      case 1:
    cout << "\nInserire il nome:";
    cin >> NOME;
             cout << "\nInserire matricola:";
             cin >> MATRICOLA;
             cout << "\nInserire numero esami:";
             cin >> ESAMI;
    l.inserisci(NOME,MATRICOLA,ESAMI);
    break;
      case 2:
   cout << "\nInserire il nome:";
    cin >> NOME;
             cout << "\nInserire matricola:";
             cin >> MATRICOLA;
             cout << "\nInserire numero esami:";
             cin >> ESAMI;
             l.push(NOME,MATRICOLA,ESAMI);
    break;
      case 3:
    cout << "\nInserire il nome da eliminare:";
             cin >> NOME;
    l.elimina(NOME);
    break;
      case 4:
    cout << "\nEliminazione in testa...";
    l.pop();
    break;
      case 5:
    cout << "\nInserire il nome da cercare:";
    cin >> NOME;
    if(l.inlist(NOME)) cout << "\nElemento presente";
    else cout << "\nElemento non presente";
    break;
      case 6:
    cout << "\nStampa della lista..." << endl;
    l.stampa();
    break;
      case 100:
    cout << "\nArrivederci!"<<endl;
    system("PAUSE");
    return 0;
            default:
             cout << "\nScelta errata!" <<endl;
  }
 }
 return 1;
}
ciao!

          push(NOME,MATRICOLA,ESAMI);
Perche' solo push, e non p.push?
Cosi' compila, ma mette sempre in testa...

 Cosi' compila, ma mette sempre in testa...
Capisco quale e' il problema... Ci sarebbe da guardare e capire tutto il
programma.... putroppo come ti ho detto non ho tempo. Speriamo lo facciano
altri (anche se francamente e' un lavoro noioso!).
Sicuro non ti convenga riniziare da capo?!? A volte e' la cosa migliore!
Tommy

"Lancer" <pepp...@TOGLIEREtiscali.it> ha scritto nel messaggio
news:baiuad$fcp$1...@lacerta.tiscalinet.it...

ma sei sicuro??? la lista dovrebbe restare cmq ordinata...
fammi sapere

 migliore!
Sara', ma il bello e' che sto programma l'ho copiato dal libro di testo...
Cio' vuol dire che sto prog lo ha scritto l'autore del libro "Da C++ a UML",
Savy....

 ma sei sicuro??? la lista dovrebbe restare cmq ordinata...
Certo che ho provato, schumy....
Prova anche tu e vedrai...

"Lancer" <pepp...@TOGLIEREtiscali.it> ha scritto nel messaggio
news:baivli$gat$1...@lacerta.tiscalinet.it...

azz, è l'ennesima prova che il libro di testo fa schifo...:-((

 Savy....
esatto. io pensavo ad un errore di copia e incolla dell'autore (ce ne sono
moltissimi) e non c'avevo fatto caso...
...cmq se trovi una soluzione fammi sapere.
ciao!