Oppure

Loading
20/03/10 11:55
NickoMaiden
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.
LISTA InsCoda(int n,LISTA *lista,LISTA *inizio)
      {
      int i;      
      inizio=lista;
  
    for(i=0;i<n;i++)
       {
       lista->successivo=new LISTA;
       lista=lista->successivo;
       cin>>lista->info;
       lista->successivo=NULL;
       }
       
       return *inizio->successivo;
      }

e questo mi funziona.
invece questo:

LISTA InsTesta(LISTA *lista,LISTA *inizio)
                     {
   cout<<"in testa:\n";
   LISTA *temp=new LISTA;
   cin>>temp->info;
   temp->successivo=inizio;
   lista=temp;
   inizio=temp;
   return *temp;
                     }

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:
struct LISTA
            {
            int info;
            LISTA *successivo;
            };
Ultima modifica effettuata da NickoMaiden 20/03/10 11:55
aaa
20/03/10 12:37
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".

aaa
20/03/10 12:53
NickoMaiden
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".




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


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:
void stampa(LISTA *lista){
     
                          while(lista)
                                {
                                 cout<<lista->info<<"\t";
                                 lista=lista->successivo;
                                }
                          }

da questo ho capito che lista->successivo punta alla struttura stessa
Ultima modifica effettuata da NickoMaiden 20/03/10 12:56
aaa
20/03/10 17:30
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:
void InsTesta(LISTA &inizio, int DatoDaSalvare) 
{  
   LISTA *temp=new LISTA;    //Alloco un nuovo elemento, e ci siamo 
   temp->info=DatoDaSalvare 
   temp->successivo=inizio;  //il successivo del nuovo elemento 
   inizio=temp;
}
aaa
20/03/10 22:18
NickoMaiden
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:
void InsTesta(LISTA &inizio, int DatoDaSalvare) 
{  
   LISTA *temp=new LISTA;    //Alloco un nuovo elemento, e ci siamo 
   temp->info=DatoDaSalvare 
   temp->successivo=inizio;  //il successivo del nuovo elemento 
   inizio=temp;
}


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 :()
aaa
21/03/10 0:23
HeDo
entrambi sbagliate, o meglio, a entrambi sfugge qualcosa.

si può fare in 2 modi:


LISTA *HeadInsert(LISTA *Head, int data) {
	
	LISTA *temp = new LISTA;
	temp->info = data;
	temp->successivo = Head;

	return temp;

}


e si usa:

LISTA *Head = new LISTA;
Head->info = 5;
Head->successivo = NULL;

// Stampa: 5
PrintLista(Head);

// NB: Aggiorno la testa
Head = HeadInsert(Head, 10);

// Stampa: 10 5
PrintLista(Head);



oppure una funzione così strutturata:


void HeadInsert(LISTA **Head, int data) {

	LISTA *temp = new LISTA;
	temp->info = data;
	temp->successivo = *Head;

	*Head = temp;

}



e si usa:


LISTA *Head = new LISTA;
Head->info = 5;
Head->successivo = NULL;

// Stampa: 5
PrintLista(Head);

// NB: Aggiorno la testa
HeadInsert(&Head, 10);

// Stampa: 10 5
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 21/03/10 0:25
aaa
21/03/10 9:15
Poggi Marco
Grazie HeDo! :k:
aaa
22/03/10 0:38
NickoMaiden
Postato originariamente da HeDo:



LISTA [b]*HeadInsert[/b](LISTA *Head, int data) {
	
	LISTA *temp = new LISTA;
	temp->info = data;
	temp->successivo = Head;

	return temp;

}



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)
aaa