Salve a tutti,
sto scrivendo in c++ una lista doppiamente linkata e dopo aver aggiunto i contatti (email,cellulare,casa,eccc) mi da errore al distruttore dell'oggetto a...solo che nn riesco a capire xchè...c'è qualcuno che mi da una mano?grazie
dblinked.h
#include <iostream>
using namespace std;
template<class T>
class DbLinked
{
//dato: è la variabile che contiene l'informazione di un certo record
struct Elemento{
T dato;
struct Elemento* next;
struct Elemento* prev;
};
struct Elemento* start;
public:
DbLinked()
{
this->start=0;
}
DbLinked(T& elem)
{
this->start=new struct Elemento();
(this->start)->next=0;
(this->start)->prev=0;
(this->start)->dato=elem;
}
~DbLinked()
{
struct Elemento* iterator=start;
struct Elemento* punt;
while(iterator!=0)
{
punt=iterator->next;
delete(iterator);
iterator=punt;
}
cout<<"lista eliminata";
}
bool remove(T& elem)
{
struct Elemento* iterator;
if((this->start)->dato==elem)
{
iterator=this->start;
this->start=(this->start)->next;
if(this->start!=0)
(this->start)->prev=0;
delete(iterator);
return true;
}
iterator=start->next;
while(iterator!=0)
{ //se il successivo al nodo puntato è uguale ad element
if(iterator->dato==elem)
{
(iterator->prev)->next=iterator->next;
if(iterator->next!=0)
(iterator->next)->prev=iterator->prev;
delete(iterator);
return true;
}
iterator=iterator->next;
}
return false;
}
bool add(T& elem )
{
struct Elemento* iterator;
if(this->start==0)
{
this->start=new struct Elemento();
(this->start)->dato=elem;
(this->start)->prev=0;
(this->start)->next=0;
return true;
}
iterator=this->start;
while(iterator!=0)
{
if(iterator->dato==elem) return false; //non ammessi duplicati
if(iterator->next==0)
{
iterator->next=new struct Elemento();
(iterator->next)->dato=elem;
(iterator->next)->prev=iterator;
(iterator->next)->next=0;
return true;
}
iterator=iterator->next;
}
return false;
}
friend ostream& operator<<(ostream& output,DbLinked& lista)
{
int i=0;
struct Elemento* iterator;
iterator=lista.start;
while(iterator!=0)
{
output << "\nelemento "<<i<<":\n"<< iterator->dato;
i++;
iterator=iterator->next;
}
if(i==0) output << "non ci sono elementi nella lista";
}
};
main:
#include<iostream>
#include "dbLinked.h"
#include "Persona.h"
#include<conio.h>
using namespace std;
int main()
{
Persona a("Simone","Clementi","padre");
a.aggiungicontatto(CASA,"355533");
a.aggiungicontatto(CELLULARE,"3493392928");
a.aggiungicontatto(EMAIL,"simone@clementi.it");
Persona b("Gianluca","Maraschio","matteotti");
Persona c("Greta","Affricani","delmare");
a.rimuovicontatto(1);;
DbLinked<Persona>lista(a);
lista.add(b);
lista.add(c);
cout <<"\n lista di persone:\n" << lista;
getch();
return 0;
}
Persona.h
#include<cstring>
#include<iostream>
using namespace std;
enum tipo_contatto{CELLULARE,CASA,UFFICIO,FAX,EMAIL};
class Persona
{
char* nome;
char* cognome;
char* indirizzo;
int numero_contatti;
struct contatto{
tipo_contatto tipo;
char* numero;
contatto(){
tipo=CELLULARE;
numero=0;
}
contatto(tipo_contatto t,char* num)
{
tipo=t;
numero=new char[strlen(num)+1];
strcpy(numero,num);
}
~contatto()
{
if(numero!=0)
delete[](numero);
}
struct contatto& operator =( const struct contatto& altro)
{
this->tipo=altro.tipo;
if(this->numero!=0)
delete[](this->numero);
this->numero=new char[strlen(altro.numero)+1];
strcpy(this->numero,altro.numero);
return *this;
}
friend ostream& operator <<(ostream& output,struct contatto& stampare)
{
switch(stampare.tipo)
{
case CASA: output <<"CASA:";
break;
case CELLULARE: output<<"CELLULARE:";
break;
case UFFICIO: output<<"UFFICIO:";
break;
case EMAIL: output<<"EMAIL:";
break;
default: output<<"unidefined:";
}
output<< stampare.numero;
return output;
}
}* contatti;
public:
Persona()
{
nome=0;
cognome=0;
contatti=0;
indirizzo=0;
numero_contatti=0;
}
Persona(char* n,char* c,char* ind)
{
this->nome=new char[strlen(n)+1];
this->cognome=new char[strlen(c)+1];
this->indirizzo=new char[strlen(ind)+1];
strcpy(this->nome,n);
strcpy(this->cognome,c);
strcpy(this->indirizzo,ind);
this->contatti=0;
this->numero_contatti=0;
}
~Persona()
{
delete[](nome);
delete[](cognome);
if(this->contatti!=0)
delete[](this->contatti);
cout<< this->indirizzo;
delete[](indirizzo);
cout<<"persona eliminata";
}
void aggiungicontatto(tipo_contatto t,char* num)
{
this->numero_contatti+=1;
struct contatto* contatti2;
contatti2=new struct contatto[this->numero_contatti];
for(int i=0;i<this->numero_contatti-1;i++)
{
*(contatti2+i)=*(contatti+i);
delete(contatti+i);
}
this->contatti=contatti2;
struct contatto contatto3(t,num);
*(this->contatti+((this->numero_contatti)-1))=contatto3;
}
void aggiungicontatto(struct contatto contact)
{
this->aggiungicontatto(contact.tipo,contact.numero);
}
void rimuovicontatto(int pos)
{
int k;
k=0;
this->numero_contatti-=1;
struct contatto* contatti2;
contatti2=new struct contatto[this->numero_contatti];
for(int i=0;i<this->numero_contatti+1;i++)
{
if(i!=pos)
{
*(contatti2+k)=*(this->contatti+i);
k++;
}
}
delete[](this->contatti);
this->contatti=contatti2;
}
Persona& operator = (const Persona& altro)
{
delete[](this->nome);
delete[](this->cognome);
if(this->contatti!=0)
delete[](this->contatti);
delete[](this->indirizzo);
this->nome=new char[strlen(altro.nome)+1];
this->cognome=new char[strlen(altro.cognome)+1];
this->indirizzo=new char[strlen(altro.indirizzo)+1];
strcpy(this->nome,altro.nome);
strcpy(this->cognome,altro.cognome);
strcpy(this->indirizzo,altro.indirizzo);
this->numero_contatti=0;
for(int i=0;i<altro.numero_contatti;i++)
this->aggiungicontatto(*(altro.contatti+i));
return *this;
}
bool operator == (const Persona& altro)
{
return (!strcmp(this->nome,altro.nome)&&!strcmp(this->cognome,altro.cognome)&&!strcmp(this->indirizzo,altro.indirizzo));
}
friend ostream& operator <<(ostream& output,const Persona& persona)
{
output<<"Nome: "<< persona.nome<<"\nCognome: "<< persona.cognome<<"\nIndirizzo: "<<persona.indirizzo << "\nContatti:";
for(int i=0;i<persona.numero_contatti;i++)
{
output<<"\n"<<*(persona.contatti+i);
}
return output;
}
};