Visualizzazione stampabile
-
Dunque, per prima cosa il while dovrebbe essere scritto così:
while((val > (current->dato)) && (current->succ != NULL))
Poi prova a ricontrollare questa parte:
codice:
if(pre==NULL)
{
new->succ=current;
}
else
{
post=current;
current=new;
new->succ=post;
pre->succ=new;
}
Mi mandano a male le liste :080:
-
si.. ma più che altro mi interessa sapere cosa c'è che non va in quella funzione :087:
-
Et voilà:
Codice PHP:
lista insord(lista mylist)
{
lista pre=NULL;
lista new=NULL;
lista current=NULL;
int val;
printf("\nINSERIRE VALORE : ");
scanf("%d",&val);
new = (lista) malloc(sizeof(nodolista));
new->dato=val;
new->succ=NULL;
if(mylist==NULL)
{
mylist=new;
mylist->succ=NULL;
}
else
{
current=mylist; //crea l'indice per scorrere la lista
//Scorro in avanti finché non trovo un valore più grande di val
while(current != NULL)
{
if(current->dato > val)
break;
pre = current;
current = current->succ;
}
//vedo se il dato inserito e' il piu' piccolo di tutti
if(pre == NULL)
{
new->succ = mylist;
return new; //new diventa la testa della lista
}
else
{
pre->succ = new;
new->succ = current;
return mylist;
}
}
return mylist; //ridondante, ma sicuro
}
-
ma l'hai scritta da capo ? :087:
-
No, ho tolto post perché non serviva e ho rivisto un po' l'algoritmo, ovvero questo:
Codice PHP:
//Scorro in avanti finché non trovo un valore più grande di val
while(current != NULL)
{
if(current->dato > val)
break;
pre = current;
current = current->succ;
}
//vedo se il dato inserito e' il piu' piccolo di tutti
if(pre == NULL)
{
new->succ = mylist;
return new; //new diventa la testa della lista
}
else
{
pre->succ = new;
new->succ = current;
return mylist;
}
Se non ti è chiaro qualcosa chiedimi pure! Penso che prima ti desse errore perché nel while accedevi a un valore che non era puntato da niente:
while(val > current->dato)
non puoi farlo se current è NULL! Inevitabilmente, il tuo while si impallava ;)
Poi ci sono mille modi per risolvere i problemi legati alle liste, e io ho fatto alla mia maniera. Poi vedi tu, se ti sembra organico, altrimenti trova una soluzione simile. Su internet trovi un sacco di implementazioni, ma solo alcune sono chiare, anche da un punto di vista logico.
Tu immagina sempre di dover "sganciare" gli elementi e di doverli tenere da parte, per poi agganciarli ad un altro elemento... è tipo art attack :P
-
mi sento terribilmente scemo.. ma perchè post non serve? :087:
fai scorrere current a current->succ? :087:
e dire pre->succ=new non è come dire current=new?
-
Quote:
Originariamente inviata da
Technics
mi sento terribilmente scemo.. ma perchè post non serve? :087:
fai scorrere current a current->succ? :087:
e dire pre->succ=new non è come dire current=new?
post non serve perché ho trovato un modo di risolvere il problema senza, ma magari bastava aggiustare leggermente il tuo algoritmo affinché tutto funzionasse. Uno degli obiettivi della programmazione è l'economia di codice e di variabili.. un puntatore in più o in meno non fa la differenza, ma quando le righe di codice diventano molte di più, le differenze si notano eccome!
Comunque, post non è indispensabile perché hai già current->succ e pre, e puoi accedere all'elemento successivo a quello corrente usando appunto current->succ.
La tua lista, essendo half linked, non necessita di mille mila puntatori ;)
Poi, pre->succ=new e current=new non sono la stessa cosa, dato che current è stato modificato precedentemente (current = current->succ).
Prova a farti uno schemino su carta della lista, magari ti aiuta =)
Ti posto il link ad un ottimo manuale, e per fortuna si vedono in anteprima alcune pagine dedicate alle liste. Ho usato l'edizione vecchia per anni alle superiori e anche all'uni ;)
Programmare in C - Google Ricerca Libri
-
PS: quello che interessa a te, in questo caso, è l'immagine a pagina 364
-
grazie cmq su xcode il menù a tendina RUN è tutto non cliccabile :roll:
-
Quote:
Originariamente inviata da
Technics
grazie cmq su xcode il menù a tendina RUN è tutto non cliccabile :roll:
Di solito è così quando non crei il progetto. Se segui le istruzioni che ti ho dato prima riesci a compilare ed eseguire senza problemi :)