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++ - Liste Semplici
Forum - C/C++ - Liste Semplici

Avatar
NickoMaiden (Normal User)
Pro


Messaggi: 115
Iscritto: 10/06/2009

Segnala al moderatore
Postato alle 12:55
Sabato, 20/03/2010
in questi giorni a scuola mi hanno spiegato a livello teorico come funzionano liste, pile,code, alberi e grafi.
volevo partire ad implementare una lista evitando di prendere algoritmi codificati gia fatti ( altrimenti a che la voglio? ) ho provato a farlo da solo.
Codice sorgente - presumibilmente C/C++

  1. LISTA InsCoda(int n,LISTA *lista,LISTA *inizio)
  2.       {
  3.       int i;      
  4.       inizio=lista;
  5.  
  6.     for(i=0;i<n;i++)
  7.        {
  8.        lista->successivo=new LISTA;
  9.        lista=lista->successivo;
  10.        cin>>lista->info;
  11.        lista->successivo=NULL;
  12.        }
  13.        
  14.        return *inizio->successivo;
  15.       }


e questo mi funziona.
invece questo:

Codice sorgente - presumibilmente C/C++

  1. LISTA InsTesta(LISTA *lista,LISTA *inizio)
  2.                      {
  3.    cout<<"in testa:\n";
  4.    LISTA *temp=new LISTA;
  5.    cin>>temp->info;
  6.    temp->successivo=inizio;
  7.    lista=temp;
  8.    inizio=temp;
  9.    return *temp;
  10.                      }


questo qua se non lo uso come funzione, oppure stampo il contenuto all'interno della funzione stessa funziona, dal momento che mi restituisce la lista temp, lista->successivo punta a se stesso :O
non riesco a venirci fuori, chi mi da una mano ?
grazie

dimenticavo:
ecco la struttura della lista:
Codice sorgente - presumibilmente C/C++

  1. struct LISTA
  2.             {
  3.             int info;
  4.             LISTA *successivo;
  5.             };


Ultima modifica effettuata da NickoMaiden il 20/03/2010 alle 12:55


char segreto[100]={"Abaca da cala da ciaccia"};
for(int i=0;i<100;i++)
  {
  if(segreto[ i ]=='a'||segreto[ i ]=='A')
    {
    segreto[ i ]='u';
    }
  }
cout<<segreto;
system("pause");
return EXIT_SUCCESS;
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 13:37
Sabato, 20/03/2010

a parte ricordarti di cambiare quell'obrobio di firma ti posso dire che se devi inserire in testa, praticamente devi cambiare il puntatore alla testa:

1) Allochi un nuovo elemento
2) Il successivo del nuovo elemento è la vecchia testa
3) Ritorni il puntatore al nuovo elemento

usando il puntatore al nuovo elemento come testa hai l'effetto di "inserire in testa".



Ingegnere Informatico
https://ldlagency.it
PM Quote
Avatar
NickoMaiden (Normal User)
Pro


Messaggi: 115
Iscritto: 10/06/2009

Segnala al moderatore
Postato alle 13:53
Sabato, 20/03/2010
Testo quotato

Postato originariamente da HeDo:


a parte ricordarti di cambiare quell'obrobio di firma ti posso dire che se devi inserire in testa, praticamente devi cambiare il puntatore alla testa:

1) Allochi un nuovo elemento
2) Il successivo del nuovo elemento è la vecchia testa
3) Ritorni il puntatore al nuovo elemento

usando il puntatore al nuovo elemento come testa hai l'effetto di "inserire in testa".





Codice sorgente - presumibilmente C/C++

  1. LISTA InsTesta(LISTA *lista,LISTA *inizio)
  2.                      {
  3.    cout<<"in testa:\n";
  4.    LISTA *temp=new LISTA;    //Alloco un nuovo elemento, e ci siamo
  5.    cin>>temp->info;
  6.    temp->successivo=inizio;  //il successivo del nuovo elemento
  7.                              //è la testa della vecchia coda
  8.    return *temp;             //ritorno il puntatore al nuovo elemento
  9.                      }



sarebbe cosi? non funziona... praticamente se metto la funzione che stampa la lista dentro la funzione stessa è tutto apposto, se cerco di stampare la lista al di fuori va in loop infinito e mi stampa il primo elemento perchè il puntatore del successivo punta alla struttura stessa (e quindi non al successivo), non riesco a spiegarmi questa cosa :om:
in allegato uno screen di sto benedetto programma

per la stampa ho fatto sta roba qui:
Codice sorgente - presumibilmente C/C++

  1. void stampa(LISTA *lista){
  2.      
  3.                           while(lista)
  4.                                 {
  5.                                  cout<<lista->info<<"\t";
  6.                                  lista=lista->successivo;
  7.                                 }
  8.                           }


da questo ho capito che lista->successivo punta alla struttura stessa


NickoMaiden ha allegato un file: mmmm.JPG (47250 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da NickoMaiden il 20/03/2010 alle 13:56


char segreto[100]={"Abaca da cala da ciaccia"};
for(int i=0;i<100;i++)
  {
  if(segreto[ i ]=='a'||segreto[ i ]=='A')
    {
    segreto[ i ]='u';
    }
  }
cout<<segreto;
system("pause");
return EXIT_SUCCESS;
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 18:30
Sabato, 20/03/2010
Il programma non funziona perche, a mio avviso, tu allochi un nuovo elemento nella lista, ma non cambi l' inizio della lista. In questo modo, gli elementi non sono collegati.

Ecco come dovresti fare:
Codice sorgente - presumibilmente C/C++

  1. void InsTesta(LISTA &inizio, int DatoDaSalvare)
  2. {  
  3.    LISTA *temp=new LISTA;    //Alloco un nuovo elemento, e ci siamo
  4.    temp->info=DatoDaSalvare
  5.    temp->successivo=inizio;  //il successivo del nuovo elemento
  6.    inizio=temp;
  7. }



Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
NickoMaiden (Normal User)
Pro


Messaggi: 115
Iscritto: 10/06/2009

Segnala al moderatore
Postato alle 23:18
Sabato, 20/03/2010
Testo quotato

Postato originariamente da Poggi Marco:

Il programma non funziona perche, a mio avviso, tu allochi un nuovo elemento nella lista, ma non cambi l' inizio della lista. In questo modo, gli elementi non sono collegati.

Ecco come dovresti fare:
Codice sorgente - presumibilmente C/C++

  1. void InsTesta(LISTA &inizio, int DatoDaSalvare)
  2. {  
  3.    LISTA *temp=new LISTA;    //Alloco un nuovo elemento, e ci siamo
  4.    temp->info=DatoDaSalvare
  5.    temp->successivo=inizio;  //il successivo del nuovo elemento
  6.    inizio=temp;
  7. }




ma alla fine è identico al mio si può dire, quello che cambia è che il mio restituisce il puntatore, il tuo fa un passaggio per indirizzo,io il dato lo prendo con un cin interno mentre tu lo passi alla funzione
in ogni caso nemmeno il tuo funziona. sarà il compilatore?
purtroppo non posso mettere il visual studio perchè sono su un hard disk provvisorio che quello di 1tb l'ho bruciato... dev c++ è abbastanza leggero e quindi uso questo (mi ci ero anche abituato al visual studio :()


char segreto[100]={"Abaca da cala da ciaccia"};
for(int i=0;i<100;i++)
  {
  if(segreto[ i ]=='a'||segreto[ i ]=='A')
    {
    segreto[ i ]='u';
    }
  }
cout<<segreto;
system("pause");
return EXIT_SUCCESS;
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 1:23
Domenica, 21/03/2010
entrambi sbagliate, o meglio, a entrambi sfugge qualcosa.

si può fare in 2 modi:

Codice sorgente - presumibilmente C/C++

  1. LISTA *HeadInsert(LISTA *Head, int data) {
  2.        
  3.         LISTA *temp = new LISTA;
  4.         temp->info = data;
  5.         temp->successivo = Head;
  6.  
  7.         return temp;
  8.  
  9. }



e si usa:

Codice sorgente - presumibilmente C/C++

  1. LISTA *Head = new LISTA;
  2. Head->info = 5;
  3. Head->successivo = NULL;
  4.  
  5. // Stampa: 5
  6. PrintLista(Head);
  7.  
  8. // NB: Aggiorno la testa
  9. Head = HeadInsert(Head, 10);
  10.  
  11. // Stampa: 10 5
  12. PrintLista(Head);



oppure una funzione così strutturata:

Codice sorgente - presumibilmente C/C++

  1. void HeadInsert(LISTA **Head, int data) {
  2.  
  3.         LISTA *temp = new LISTA;
  4.         temp->info = data;
  5.         temp->successivo = *Head;
  6.  
  7.         *Head = temp;
  8.  
  9. }



e si usa:

Codice sorgente - presumibilmente C/C++

  1. LISTA *Head = new LISTA;
  2. Head->info = 5;
  3. Head->successivo = NULL;
  4.  
  5. // Stampa: 5
  6. PrintLista(Head);
  7.  
  8. // NB: Aggiorno la testa
  9. HeadInsert(&Head, 10);
  10.  
  11. // Stampa: 10 5
  12. PrintLista(Head);



Il codice funziona, l'ho testato.

Visual studio non pesa così tanto, se metti solo visual C++ credo che con 200mb o poco più te la cavi.

Ultima modifica effettuata da HeDo il 21/03/2010 alle 1:25


Ingegnere Informatico
https://ldlagency.it
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 10:15
Domenica, 21/03/2010
Grazie HeDo! :k:


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
NickoMaiden (Normal User)
Pro


Messaggi: 115
Iscritto: 10/06/2009

Segnala al moderatore
Postato alle 1:38
Lunedì, 22/03/2010
Testo quotato

Postato originariamente da HeDo:


Codice sorgente - presumibilmente C/C++

  1. LISTA [b]*HeadInsert[/b](LISTA *Head, int data) {
  2.        
  3.         LISTA *temp = new LISTA;
  4.         temp->info = data;
  5.         temp->successivo = Head;
  6.  
  7.         return temp;
  8.  
  9. }





grazie mille!
questa mi sembra buona e funziona. ho un dubbio sulla parte che ho messo in grassetto. perchè ci va il simbolo star prima della funzione? (che poi anche la mia va con il simbolo star davanti)


char segreto[100]={"Abaca da cala da ciaccia"};
for(int i=0;i<100;i++)
  {
  if(segreto[ i ]=='a'||segreto[ i ]=='A')
    {
    segreto[ i ]='u';
    }
  }
cout<<segreto;
system("pause");
return EXIT_SUCCESS;
PM Quote