Problema lista doppiamente linkata

di il
3 risposte

Problema lista doppiamente linkata

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;
		}
		
		
};

3 Risposte

  • Re: Problema lista doppiamente linkata

    Ma perche hai l'abbitudine di usare puntatore + spostamento invece di []

    Non solo rendi il codice + incasinato ma puoi anche fare degli errori.

    Cmq l'unica modifica che ho fatto è quella di cancellare contatti dopo l'assegnazione e cioè
    void aggiungicontatto(tipo_contatto t,char* num)
    	{
    		numero_contatti++;
    		struct contatto* contatti2;
    		contatti2=new struct contatto[ numero_contatti];
    		for(int i=0; i < numero_contatti-1 ;i++)
    		{
    			contatti2[i]= contatti[i];
    		}
    		delete [] contatti;
    		this->contatti=contatti2;
    		struct contatto contatto3(t,num);
    		contatti[numero_contatti-1] = contatto3;
    	}
  • Re: Problema lista doppiamente linkata

    Ti stimiamo a bestia!!!
  • Re: Problema lista doppiamente linkata

    Grazie fratello.
Devi accedere o registrarti per scrivere nel forum
3 risposte