NickoMaiden (Normal User)
Pro
Messaggi: 115
Iscritto: 10/06/2009
|
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++ |
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:
Codice sorgente - presumibilmente C/C++ |
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:
Codice sorgente - presumibilmente C/C++ |
struct LISTA
{
int info;
LISTA *successivo;
};
|
Ultima modifica effettuata da NickoMaiden il 20/03/2010 alle 12:55 |
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
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".
|
|
NickoMaiden (Normal User)
Pro
Messaggi: 115
Iscritto: 10/06/2009
|
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++ |
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
in allegato uno screen di sto benedetto programma
per la stampa ho fatto sta roba qui:
Codice sorgente - presumibilmente C/C++ |
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 il 20/03/2010 alle 13:56 |
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/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++ |
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;
}
|
|
|
NickoMaiden (Normal User)
Pro
Messaggi: 115
Iscritto: 10/06/2009
|
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++ |
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 ) |
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
entrambi sbagliate, o meglio, a entrambi sfugge qualcosa.
si può fare in 2 modi:
Codice sorgente - presumibilmente C/C++ |
LISTA *HeadInsert(LISTA *Head, int data) {
LISTA *temp = new LISTA;
temp->info = data;
temp->successivo = Head;
return temp;
}
|
e si usa:
Codice sorgente - presumibilmente C/C++ |
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:
Codice sorgente - presumibilmente C/C++ |
void HeadInsert(LISTA **Head, int data) {
LISTA *temp = new LISTA;
temp->info = data;
temp->successivo = *Head;
*Head = temp;
}
|
e si usa:
Codice sorgente - presumibilmente C/C++ |
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 il 21/03/2010 alle 1:25 |
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
Grazie HeDo!
|
|
NickoMaiden (Normal User)
Pro
Messaggi: 115
Iscritto: 10/06/2009
|
Postato originariamente da HeDo:
Codice sorgente - presumibilmente C/C++ |
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) |
|