Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [C++] Problema inserimento in linked list
Forum - C/C++ - [C++] Problema inserimento in linked list

Avatar
fbotta (Normal User)
Newbie


Messaggi: 6
Iscritto: 23/08/2017

Segnala al moderatore
Postato alle 12:22
Mercoledì, 23/08/2017
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.

Codice sorgente - presumibilmente C#

  1. #include <iostream>
  2. using namespace std;
  3. /* run this program using the console pauser or add your own getch, system("pause") or input loop */
  4.  
  5. struct contatto{
  6.         string nome;
  7.         string cognome;
  8.         int numero;
  9.         contatto *next;
  10. };
  11.  
  12. int inseriscitesta(contatto *testa)
  13. {
  14.         //dichiarazioni
  15.         contatto *nuovo;
  16.         nuovo= new contatto;
  17.         string nomeF, cognomeF;
  18.         int numeroF;
  19.         //inserimento utente
  20.         cout << "inserisci nome: "<< endl;
  21.         cin >> nomeF;
  22.         cout << "inserisci cognome: "<< endl;
  23.         cin >> cognomeF;
  24.         cout << "inserisci numero: "<< endl;
  25.         cin >> numeroF;
  26.         cout << numeroF;
  27.         //riempi nuovo
  28.         nuovo->nome=nomeF;
  29.         nuovo->cognome=cognomeF;
  30.         nuovo->numero= numeroF;
  31.         nuovo->next= testa;
  32.         //modifico la testa
  33.         testa=nuovo;   
  34.         return 0;
  35. }
  36.  
  37. void stampalista (contatto *testa)
  38. {
  39.         contatto *testa2;
  40.         testa2=new contatto;
  41.         testa2=testa;
  42.         for(;testa2!=NULL;testa2=testa2->next)
  43.         cout << testa2->nome << endl << testa2->cognome << endl << testa2->numero << endl;
  44. }
  45.  
  46. int main(int argc, char** argv) {
  47.         contatto *testa;  // puo volerci l'asterisco perchè punta all'inizio della lista
  48.         testa=NULL;
  49.         char uscita='n';
  50.         int scelta;
  51.        
  52.         while(uscita=='n' || uscita=='N')
  53.         {
  54.         cout << "________________________________________" << endl
  55.                  << "crea la tua rubrica di numeri telefonici" << endl
  56.                  << "________________________________________" << endl
  57.                  << "MENU:" << endl
  58.                  <<  "1-Crea un nuovo contatto." << endl
  59.                  << "2-Elimina l'ultimo conttatto." << endl
  60.                  << "3-Stampa la lista." << endl
  61.                  << "4-chiudi il programma." << endl
  62.                  << "________________________________________" << endl<< endl;
  63.                  
  64.                  
  65.        
  66.         cout << "inserisci la tua scelta sotto forma di numero." << endl;
  67.         cin >> scelta;
  68.        
  69.                 switch(scelta)
  70.                 {
  71.                         case 1:
  72.                                 {
  73.                                 inseriscitesta(testa);
  74.                                 break; 
  75.                                 }
  76.                         case 2:
  77.                                 {
  78.                        
  79.                                 break; 
  80.                                 }
  81.                         case 3:
  82.                                 {
  83.                                 stampalista(testa);    
  84.                                 break;
  85.                                 }
  86.                         case 4:
  87.                                 {
  88.                                 cout << "sei sicuro di vole chiudere il programma? y/n" << endl;
  89.                                 cin >> uscita;
  90.                                 break; 
  91.                                 }
  92.                 }
  93.         }
  94.         system("pause");
  95.         return 0;
  96. }



EDIT del moderatore: titolo più descrittivo

Ultima modifica effettuata da lumo il 23/08/2017 alle 12:25
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 401
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 12:34
Mercoledì, 23/08/2017
Non funziona perché fai
Codice sorgente - presumibilmente Plain Text

  1. 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ì:
Codice sorgente - presumibilmente C/C++

  1. contatto* inseriscitesta(contatto* testa)
  2. {
  3.     ...
  4.     return testa;
  5. }



e poi quando la usi
Codice sorgente - presumibilmente Plain Text

  1. 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).

Testo quotato


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.

Codice sorgente - presumibilmente C/C++

  1. string nomeF, cognomeF;
  2.         int numeroF;
  3.         //inserimento utente
  4.         cout << "inserisci nome: "<< endl;
  5.         cin >> nomeF;
  6.         cout << "inserisci cognome: "<< endl;
  7.         cin >> cognomeF;
  8.         cout << "inserisci numero: "<< endl;
  9.         cin >> numeroF;
  10.         cout << numeroF;
  11.         //riempi nuovo
  12.         nuovo->nome=nomeF;
  13.         nuovo->cognome=cognomeF;
  14.         nuovo->numero= numeroF;
  15.         nuovo->next= testa;


Qui non serve avere nomeF, cognomeF e numeroF, puoi usare semplicemente cin >> nuovo->nome

PM Quote
Avatar
fbotta (Normal User)
Newbie


Messaggi: 6
Iscritto: 23/08/2017

Segnala al moderatore
Postato alle 14:42
Mercoledì, 23/08/2017
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

PM Quote