[c++] Lista inserimento in coda

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Tino-Tom
Prode Principiante
Messaggi: 68
Iscrizione: venerdì 29 agosto 2014, 13:00
Distribuzione: Ubuntu 64bit

[c++] Lista inserimento in coda

Messaggio da Tino-Tom »

Salve a tutti, sto facendo un piccolo programma per iniziare a programmare con le liste usando le classi. Il programma è semplicissimo, vorrei fare i 3 tipi di inserimento, cioè quello normale, quello in coda e quello in testa. Il programma compila ma appena provo a fare l'inserimento in coda mi da errore "Segmentation fault: 11". Potete controllare il mio programma e vedere se c'è qualcosa che non va ? Potete anche spiegarmi cosa sia questo errore ? :cry: :cry: :muro: :muro:

Ecco qui tutto il codice

Codice: Seleziona tutto

#include<iostream>
using namespace std;

class Info{

private:

	int valore;

public:

	Info();
	Info(int);
	int getValore();
	void setValore(int);
	void Stampa();


};

Info::Info(int val){

	this->valore=val;
}

void Info::setValore(int val){

	this->valore=val;
}

int Info::getValore(){

	return this->valore;
}

void Info::Stampa(){

	cout<<" Valore: "<<this->getValore()<<endl;
}

class Nodo{

public:

	Info *info;
	Nodo *next;
	Nodo(Info*);
	void Stampa();
};

Nodo::Nodo(Info *info){

	this->info=info;
	this->next=NULL;
}

void Nodo::Stampa(){

	this->info->Stampa();
}

class Lista{

public:

	Nodo *start;
	Lista();
	void Add(int);
	void InserisciInCoda(int);
	void Stampa();
	Nodo* Ricerca(int);
};

Nodo* Lista::Ricerca(int valore_cercato){

	Nodo *walker= this-> start;

	while(walker != NULL)
	{
		if(walker->info->getValore()==valore_cercato)
		{
			return walker;
		}
		walker=walker->next;
	}
	return NULL;

}

void Lista::Add(int val){

	Info *info= new Info(val);

	if(this->start == NULL)
	{
		start= new Nodo(info);
	}
	else
	{
		Nodo *walker= this->start;
		while(walker->next != NULL)
		{
			walker=walker->next;
		}
		walker->next=new Nodo(info);
	}
}

void Lista::InserisciInCoda(int val){

	Info *info=new Info(val);
	Nodo *walker=this->start;

	if(this->start == NULL)
	{
		info-=val;
		walker->next=NULL;
		this->start=walker;
	}
	else
	{
		
		while(walker->next != NULL)
		{
			walker=walker->next;
		}
		info-=val;
		walker->next=NULL;
		this->start=walker;
	}
}

void Lista::Stampa(){

	Nodo *walker=this->start;

	while(walker != NULL)
	{
		walker->Stampa();
		walker=walker->next;
	}
}

Lista::Lista(){

	this->start=NULL;
}

int main(){

	Lista *lista=new Lista();
	Nodo *nodo=NULL;

	int x, input, n, valore_cercato;
	bool esci= false;
	bool indietro=false;
	
	do{
		cout<<"***MENU'**"<<endl;
		cout<<"1-Scegli inserimento"<<endl;
		cout<<"2-Ricerca valore"<<endl;
		cout<<"3-Stampa"<<endl;
		cout<<"4-Esci"<<endl;
		cin>>input;
		cout<<endl;

		switch(input){

			case 1:

			do{
				cout<<"Scegli inserimento:"<<endl;
				cout<<"\t1-Inserimento normale"<<endl;
				cout<<"\t2-Inserisci in coda"<<endl;
				cout<<"\t3-Inserisci in testa"<<endl;
				cout<<"\t4-Torna indietro"<<endl;
				cin>>input;
				cout<<endl;
				switch(input){
					case 1:

					cout<<"Quanti valori vuoi inserire nella lista ?"<<endl;
					cin>>n;
					cout<<endl;

					for(int i=0; i<n; i++)
					{
						cout<<"Inserisci il "<<i+1<<" valore: ";
						cin>>x;
						cout<<endl;

						nodo= lista->Ricerca(x);

						if(nodo != NULL)
						{
							cout<<nodo->info->getValore()<<" "<<" gia' presente nella lista"<<endl;
						}
						else
						{
							lista->Add(x);
						}	
					}
					break;

					case 2:

					cout<<"Quanti valori vuoi inserire in testa ?"<<endl;
					cin>>n;
					cout<<endl;

					for(int i=0; i<n; i++)
					{
						cout<<"Inserisci il "<<i+1<<" valore: ";
						cin>>x;
						cout<<endl;

						nodo=lista->Ricerca(x);

						if(nodo != NULL)
						{
							cout<<nodo->info->getValore()<<" "<<" già presente nella lista"<<endl;
						}
						else
						{
							lista->InserisciInCoda(x);
						}
					}

					break;

					case 3:

					break;

					case 4:

					indietro=true;

					break;

					default:

					cout<<"Selezione errata"<<endl;
				}
			}while(!indietro);

			
			
			break;

			case 2:

			cout<<"Inserire valore da cercare: ";
			cin>>valore_cercato;
			cout<<endl;


			nodo= lista->Ricerca(valore_cercato);
			if(nodo != NULL)
			{
				cout<<"Il valore "<<nodo->info->getValore()<<" è stato trovato !"<<endl;

			}
			else
			{
				cout<<"Il valore non è presente nella lista !\n"<<endl;
			}

			break;

			case 3:

				lista->Stampa();
				cout<<endl;

			break;

			case 4:

			esci=true;

			break;

			default:

			cout<<"Selezione non valida"<<endl<<endl;

			break;
		}
	}while(!esci);
}
fabio massacci
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 289
Iscrizione: mercoledì 11 giugno 2014, 14:12
Desktop: Lubuntu
Distribuzione: Ubuntu 20.04.3 LTS

Re: [c++] Lista inserimento in coda

Messaggio da fabio massacci »

ciao,
guardando al volo il listato, a me sembra che l'inserimento in coda venga fatto dalla funzione add(), mentre la funzione InserisciInCoda fa delle cose un po' bizzarre tra cui ad esempio

Codice: Seleziona tutto

info-=val;
con questo stai spostando il puntatore info di val posti all'indietro facendolo puntare chi sa dove (e probabilmente è questo che poi ti fa arrivare il Segmentation fault).

Nnon ho guardato altro perchè sono di fretta, ma ti consiglio di rivedere i puntatori in generale
cuccagna
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 423
Iscrizione: giovedì 26 marzo 2009, 15:50

Re: [c++] Lista inserimento in coda

Messaggio da cuccagna »

La semantica del tuo metodo InserisciInCoda (i metodi per prassi dovrebbero iniziare con lettera minuscola) non è chiara.
Cioè cosa vuoi fare con questo metodo? Perchè non è chiaro.
(come ti è stato detto l'inserimento in coda lo fa la funzione Add e sosa fa InserisciInCoda risulta oscuro)
Inoltre stai facendo come ti hanno detto la sottrazione da un puntatore di un intero cosa che se non ricordo male è illecita nell'aritmetica dei puntatori (puoi fare solo la sottrazione tra puntatori quando puntano ad elementi dello stesso array per esempio).
Comunque qualunque cosa volessi fare devi metterci una new Node da qualche parte per inserire un nodo.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti