Oppure

Loading
23/08/17 10:22
fbotta
Buongiorno a tutti, sono nuovo del sito.
Ho provato a fare una simulazione di una rubrica da telefono ma ho riscontrato qualche problemino.
Sto utilizzando le liste e per il momento ho creato solo due piccole funzioni inseriscitesta e stampalista.
Non capisco come mai non fungano :pat:
compila ma quando aggiungo elementi alla rubrica e poi provo a stamparli non stampa nulla.
mi piacerebbe anche trovare una alternativa al tipo (int) della variabile "numero". non mi piace avere un numero a 10 cifre int..
Metto il codice. Grazie in antcipo.

#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

struct contatto{
	string nome;
	string cognome;
	int numero;
	contatto *next;
};

int inseriscitesta(contatto *testa)
{
	//dichiarazioni
	contatto *nuovo;
	nuovo= new contatto;
	string nomeF, cognomeF;
	int numeroF;
	//inserimento utente
	cout << "inserisci nome: "<< endl;
	cin >> nomeF;
	cout << "inserisci cognome: "<< endl;
	cin >> cognomeF;
	cout << "inserisci numero: "<< endl;
	cin >> numeroF;
	cout << numeroF;
	//riempi nuovo
	nuovo->nome=nomeF;
	nuovo->cognome=cognomeF;
	nuovo->numero= numeroF;
	nuovo->next= testa;
	//modifico la testa
	testa=nuovo;	
	return 0;
}

void stampalista (contatto *testa)
{
	contatto *testa2;
	testa2=new contatto;
	testa2=testa;
	for(;testa2!=NULL;testa2=testa2->next)
	cout << testa2->nome << endl << testa2->cognome << endl << testa2->numero << endl;
}

int main(int argc, char** argv) {
	contatto *testa;  // puo volerci l'asterisco perchè punta all'inizio della lista
	testa=NULL;
	char uscita='n';
	int scelta;
	
	while(uscita=='n' || uscita=='N')
	{
	cout << "________________________________________" << endl
		 << "crea la tua rubrica di numeri telefonici" << endl
		 << "________________________________________" << endl
		 << "MENU:" << endl
		 <<  "1-Crea un nuovo contatto." << endl 
		 << "2-Elimina l'ultimo conttatto." << endl
		 << "3-Stampa la lista." << endl
		 << "4-chiudi il programma." << endl 
		 << "________________________________________" << endl<< endl;
		 
		 
	
	cout << "inserisci la tua scelta sotto forma di numero." << endl;
	cin >> scelta;
	
		switch(scelta)
		{
			case 1:
				{
				inseriscitesta(testa);
				break;	
				}
			case 2:
				{
			
				break;	
				}
			case 3:
				{
				stampalista(testa);	
				break;
				}
			case 4:
				{
				cout << "sei sicuro di vole chiudere il programma? y/n" << endl;
				cin >> uscita;
				break;	
				}
		}
	}
	system("pause");
	return 0;
}


EDIT del moderatore: titolo più descrittivo
Ultima modifica effettuata da lumo 23/08/17 10:25
aaa
23/08/17 10:34
lumo
Non funziona perché fai
testa=nuovo


Così modifichi solo il valore del puntatore testa che è locale alla funzione inseriscitesta, ma non modifichi il valore di testa che hai nel main.
Il modo più veloce di risolvere è cambiare la funzione così:
contatto* inseriscitesta(contatto* testa)
{
    ...
    return testa;
}


e poi quando la usi
testa = inseriscitesta(testa);

Così verrà aggiornato il puntatore.
Così avrai una lista che attraversata da testa a coda avrà i numeri inseriti al contrario, se non è quello che vuoi puoi stamparla in ordine inverso, oppure puoi mantenere due puntatori invece che uno: contatto* testa e contatto* coda, testa rimane fisso e coda invece sarà quello che passi a inserisci (che dovrai modificare in modo da inserire l'elemento dopo quello presente in coda, e infine aggiornare il valore di coda come sopra).

mi piacerebbe anche trovare una alternativa al tipo (int) della variabile "numero". non mi piace avere un numero a 10 cifre int..

In effetti sarebbe meglio salvarlo in una stringa, ma per il momento ti consiglio di mantenere l'intero e lavorare sulla correttezza delle operazioni con la linked list.

        string nomeF, cognomeF;
        int numeroF;
        //inserimento utente
        cout << "inserisci nome: "<< endl;
        cin >> nomeF;
        cout << "inserisci cognome: "<< endl;
        cin >> cognomeF;
        cout << "inserisci numero: "<< endl;
        cin >> numeroF;
        cout << numeroF;
        //riempi nuovo
        nuovo->nome=nomeF;
        nuovo->cognome=cognomeF;
        nuovo->numero= numeroF;
        nuovo->next= testa;

Qui non serve avere nomeF, cognomeF e numeroF, puoi usare semplicemente cin >> nuovo->nome
aaa
23/08/17 12:42
fbotta
Grazie lumo sei stato molto preciso, tutto ciò che hai detto mi è servito.
Ero a conoscenza che la "testa" della lista variava solo localmente nella funzione ma non sapevo bene come fare a sistemare il problema.

Ho inserito le correzioni e adesso la lista aggiunge contatti e stampa a dovere. un prezioso aiuto il tuo :hail:

Grazie tante e buona giornata
aaa