Vi fermate alle liste half linked o fate anche le full linked? (le full sono quelle che hanno anche il puntatore all'elemento precedente)
Visualizzazione stampabile
Vi fermate alle liste half linked o fate anche le full linked? (le full sono quelle che hanno anche il puntatore all'elemento precedente)
ebboh.. sto andando avanti.. finisco le liste poi ho pile, code, alberi
non ce la farò mai
No dai, se l'esame è il 16 puoi farcela! =) Hai altri appelli oltre a info?
PS: secondo me gli esercizi più difficili sono quelli dove c'è ricorsività.. a parte che non li trovo molto sensati ed efficienti, primo per la cripticità del codice e secondo per un problema di stack, che rischia di essere sovraccaricato.
con la ricorsione c'ho sbattuto di testa ma ora va alla grande.. speriamo che le liste non incasinino troppo..
ora sto sbattendo di testa sull'inserimento ordinato.. ma sto iniziando ad odiare l'errore BUS ERROR -.-
no oltre a programmazione nulla per ora.. poi devo iniziare a prepararmi quella bibbia di architetture degli elaboratori due.. -.-"
Ascolta, ma visto che sei su OS X e stai facendo informatica (o ingegneria informatica?) forse ti conviene attrezzarti dovutamente, se non l'hai già fatto, evitando di fare tutto da riga di comando. Ti consiglio XCode, ci metti meno ed è più user-friendly del terminale! :|
uso Xcode.. l'ho sempre usato
ma per compilare e lanciare uso comunque il terminale :roll:
ps:informatica
:roll: xcode mi ha installato il gcc.. :rol. ma c'è un modo per compilare senza comando gcc?
cmq in facoltà devo usare linux quindi ci sono abituato
XCode usa gcc per compilare e linkare =)
Per creare un progetto C, basta che fai:
File -> New Project
Nell'elenco a sinistra selezioni "Command Line Utility" e nel riquadro a destra "Standard Tool". Dopo di che clicchi "Choose.." e salvi il progetto dove ti pare, e il progetto è creato.
Per compilare premi "Build and Go" (il martellino) e per vedere l'output devi avere la finestra Console aperta. Per farlo, sempre da XCode, dal menu in alto clicca Run -> Console, mentre per utilizzare il debugger, clicca (dal menù in alto) Run -> Debugger.
Tutto qui =)
fino al salvataggio ho sempre fatto così
tutto il resto lo farò! :o
non ho ben capito la funzione di debugging.. lo fa in automatico?? :o
E' il debugger di gcc, solo che ha tool grafici. In XCode imposti i breakpoint, e il debugger viene chiamato in causa a ogni breakpoint. Quella voce che c'è nel menu Run serve solo per visualizzare la finestra del Debugger. Se noti, ci sono i pulsanti per mettere in pausa, stoppare, andare avanti, entrare nei cicli ed uscirne.
Ti hanno spiegato a cosa serve il debugger e come si usa in linea di principio?
veramente il prossimo capitolo (a cui arriverò domani spero) si chiama "debugging"!
quindi temo di non saperne ancora nulla.. :(
uff.. quest'esame mi sta stressando
Non ti preoccupare, è un argomento molto importante ma abbastanza semplice (per quanto riguarda l'utilizzo del debugger). Certo, se vi mettete a filosofeggiare su cose assurde è un altro discorso, ma in linea di massima è semplice: il debugging è quella fase dello sviluppo in cui vedi cosa fa veramente la tua applicazione, cosa c'è in memoria e riesci a correggere eventuali problemi. Infatti, senza debugger non hai la possibilità di vedere che accade in runtime, durante l'esecuzione. XCode (come ogni altro IDE con debugger) lancia l'applicazione e il debugger, in modo che il debugger sia il padrone della situazione. Quello che puoi fare tu è vedere, passo passo (letteralmente passo passo) che valori assumono le tue variabili, entrare nei cicli ed uscirne, mettere tutto in pausa, stoppare di colpo etc etc. Ci sono tecniche avanzate di debugging che non conosco (perché non mi interessano eheh) e che forse non sono nel tuo programma d'esame. Magari più in là le farai.
Cmq non preoccuparti, se hai bisogno chiedi pure e se riesco ti aiuto ;)
azz.. ho capito cos'è.. lo facevo con elettronica.. una volta costruito un circuito con un clock dai un colpo di clock alla volta controllando quali collegamenti sono attivi e quali a zero..
controllando i vari dispositivi in input ed output..
vabbè non bagnamoci prima che piova.. vediamo tra un po .. grazie mille ^^
sono curioso di sapere quando anche io inizierò C :roll:
ma te non fai informatica?
si ma.. il c da noi è la bibbia.. inizio a pensare di aver sbagliato università -.-'
preiseeeer :cry:
il primo lo inserisce al secondo da quel cavolo di bus error! :cry:Quote:
lista insord(lista mylist){
lista pre=NULL;
lista new=NULL;
lista post=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
while(val>current->dato){
pre=current;
current=current->succ;
}
if(pre==NULL){
new->succ=current;
}
else{
post=current;
current=new;
new->succ=post;
pre->succ=new;
}
}
printf("\nAggiunto con successo.\n");
return mylist;
}
Vuoi creare una lista ordinata in modo crescente (il primo elemento è il più piccolo di tutti)?
Dunque, per prima cosa il while dovrebbe essere scritto così:
while((val > (current->dato)) && (current->succ != NULL))
Poi prova a ricontrollare questa parte:
Mi mandano a male le liste :080:codice:if(pre==NULL)
{
new->succ=current;
}
else
{
post=current;
current=new;
new->succ=post;
pre->succ=new;
}
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:
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: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;
}
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?
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: