PDA

Visualizza la versione completa : [C++] Lista a puntatori: eliminazione nodo


alukard990
08-01-2012, 10:48
Salve a tutti ho un problema con la funzione elimina di una lista a puntatori.Vi spiego il problema cosa richiede in poche parole: realizzare una gerarchia di prodotti in cui quest'ultima è la classe base.Poi realizzare 2 classi lotto1 e lotto2 che derivano la base.Infine realizzare mediante una lista a puntatori delle operazioni da effettuare in un carrello di prodotti(cioè si vogliono effettuare delle operazioni su oggetti della classe base), in particola si realizzino le seguenti funzioni per la classe carrello: aggiungi prodotti nel carrello(l'ho realizzata con una push),elimina che estrae un prodotto dalla lista mediante il codice del prodotto fornito in input,stampa a video dei prodotti rimasti nel carrello e stampa su file di testo dei prodotti rimasti nel carrello. Il problema l'ho riscontrato nella funzione elimina: in particolare dopo che fornisco il codice in input il programma crasha quando invoca la funzione elimina e non riesco a capire il perchè. Vi posto il main ,la specifica della classe carrello e le funzioni ad essa associate...grazie mille in anticipo per chi mi aiuterà




#include <cstdlib>
#include <iostream>
#include "lotto1.h"
#include "lotto2.h"
#include "carrello.h"

using namespace std;

int main(int argc, char *argv[])
{
lotto1 l1("L1","abbigliamento",6,9);
lotto1 l2("L2","abbigliamento",8,9);
lotto1 l3("L3","abbigliamento",12,9);

lotto2 m1("M1","calzature",6,45.6);
lotto2 m2("M2","calzature",9,12.5);
lotto2 m3("M3","calzature",14.5,60.7);

lotto1 L[]={l1,l2,l3};
lotto2 M[]={m1,m2,m3};
carrello lista;
int i=0,j=0;
char c[20];
int scelta;
bool fine=false,ok=false;

do{
do{
cout<<"1)Inserisci prodotto di lotto1 nel carrello\n";
cout<<"2)Inserisci prodotto di lotto2 nel carrello\n";
cout<<"3)Elimina prodotto dal carrello\n";
cout<<"4)Stampa dati a video\n";
cout<<"5)Stampa dati su file\n";
cout<<"6)Esci dal programma\n";
cout<<"Fai la tua scelta ->";
cin>>scelta;
}while(scelta<1 || scelta>6);
switch(scelta){

case 1:
cin.ignore();
if(i<3)
{
lista.aggiungi(L[i]);
i++;
cout<<"Inserimento effettuato!\n";
}
else cout<<"Hai inserito gia' 3 elementi di lotto1\n";
break;

case 2:
if(j<3)
{
lista.aggiungi(M[j]);
j++;
cout<<"Inserimento effettuato!\n";
}
else cout<<"Hai inserito gia' 3 elementi di lotto2\n";
break;

case 3:
cin.ignore();
if(lista.vuoto())
{
cout<<"Carrello vuoto!\n";
break;
}
else{
cout<<"Inserisci codice del prodotto che vuoi eliminare dal carrello\n";
cin.getline(c,19);
i=0;
j=0;
do{
if(lista.elimina(L[i],c)) ok=true;
else {i++;
if(lista.elimina(M[j],c)) ok=true;
else j++;
}
}while((i==2 && j==2) || ok);
}
if(ok) cout<<"Prodotto eliminato!\n";
else cout<<"Prodotto non presente\n";
break;

case 4:
if(lista.vuoto()) cout<<"Carrello vuoto!\n";
else{cout<<"Il carrello ha i seguenti prodotti:\n";
lista.stampa_lista();
}
break;

case 5:
if(lista.vuoto()) cout<<"Carrello vuoto!\n";
else{lista.stampa_dati();
cout<<"Dati stampati in un file di testo!\n";
}

case 6:
fine=true;
break;


}
cout<<"\n\n";
system("PAUSE");
system("CLS");
}while(!fine);


system("PAUSE");
return EXIT_SUCCESS;
}

#ifndef CARRELLO_H_
#define CARRELLO_H_
#include "prodotto.h"
#include <fstream>
#include <string>


using namespace std;

typedef prodotto E;
struct nodo;
typedef nodo* L;
struct nodo{
E elem;
L punt;
};

class carrello{

private:
L l;

public:
carrello(){l=0;}
~carrello();
void aggiungi(const E e);
void stampa_lista();
void stampa_dati();
bool vuoto()const {return l==0;}
bool elimina(E e,const char* cod);


};
#endif

#include "carrello.h"

carrello::~carrello()
{
L p,q;

for(p=l;p!=0;p=q)
{
q=p->punt;
delete p;
}
}

void carrello::aggiungi(const E e)
{
L q=new nodo;
L temp=l;
q->elem=e;
q->punt=temp;
l=q;
}

void carrello::stampa_lista()
{
L temp=l;
while(temp)
{
cout<<temp->elem.get_codice()<<"\n";
cout<<temp->elem.get_descrizione()<<"\n";
cout<<temp->elem.get_prezzo()<<"\n";
cout<<"***************************************\n";
temp=temp->punt;
}
}

void carrello::stampa_dati()
{
cin.ignore();
char namefile[30];
cout<<"Inserisci nome del file su cui vuoi stampare la lista: ";
cin.getline(namefile,29);
ofstream outfile(namefile,ios::out|ios::app);
L temp=l;
while(temp){
outfile<<temp->elem.get_codice()<<"\n";
outfile<<temp->elem.get_descrizione()<<"\n";
outfile<<temp->elem.get_prezzo()<<"\n";
outfile<<"***************************************\n";
temp=temp->punt;
}
outfile.close();
}

bool carrello::elimina(E e,const char* cod)
{
bool trovato=false;
L temp=l;

while(!trovato && temp)
{

if(strcmp(cod,temp->elem.get_codice())==0)
{
trovato=true;
L t=temp;
if(t->punt==temp->punt)
{

e=temp->elem;
temp=temp->punt;
delete t;
}//fine if estrazione primo elem
}//fine if primario

else if(strcmp(cod,temp->punt->elem.get_codice())==0)
{
trovato=true;
if(temp->punt->punt==0)
{
e=temp->punt->elem;
L q=temp->punt;
temp->punt=0;
delete q;
}//fine if estrazione ultimo elem
else{
e=temp->punt->elem;
L p=temp->punt;
temp->punt=temp->punt->punt;
delete p;
}//altrimenti in mezzo
}//fine if di eliminazione in coda o in un punto qualsiasi

else temp=temp->punt->punt; //se non si trova nemmeno alla casella successiva
}//fine while
return trovato;
}

Loading