ti ringrazio, ma un puntatore di tipo struttura? o un puntatore a un intero?
ti ringrazio, ma un puntatore di tipo struttura? o un puntatore a un intero?
Puntatore a struttura, nel tuo caso puoi pensare a qualcosa di simile:
nodo *next;
nodo *current;
Il concetto è che una generica funzione di inserimento e di stampa di una qualsiasi lista, ha come parametro il puntatore alla testa e non deve assolutamente andarne a toccare l'indirizzo.
Purtroppo ho un esame domani e non ho tempo oggi di aiutarti, anche se ho già iniziato a toccare il source qua e là, ma se riesco te lo mando. Hai fretta?
ho l'esame il 16 e mi mancano questi argomenti qui che a detta di molti sono semplicissimi.. ma certe vole mi sento così stupido.. comunque preiser grazie mille non preoccuparti non voglio toglierti tempo allo studio.. in bocca al lupo.. posto qui eventuali risvolti
prego! Non sono cose semplici, soprattutto se è la prima volta che le vedi. Quello della lista è però un concetto fondamentale. Per capirlo devi avere bene in mente come funzionano i puntatori e cosa accade in memoria a ogni assegnamento/allocazione che fai. Per esperienza personale, è già tanto se te le spiegano in università... ne ho imparate di più alle superiori che non lì... cmq ora provo a riscrivere da zero la funzioncina, ma non ti garantisco tempi rapidi buono studio anche a te!
Ok, ho leggermente modificato il tuo codice. Non ci sono commenti perché non ho molto tempo, gh! Mi dispiace.. comunque spero si capisca. Se hai problemi chiedi pure
Ti dico solo che ci sono vari approci alle liste, e vari modi di portarsi dietro i puntatori. Ho deciso di fare due typedef. Il primo coincide con il tuo typedef, mentre il secondo è un passo ulteriore, e serve a definire il puntatore a struttura come tipo di dato. In questo modo eviti ogni volta di scrivere "nodo *".
La modifica principale che ho apportato è il valore restituito dalla funzione creanuovo(): ritorna la testa della lista.
codice:#include <stdio.h> #include <stdlib.h> struct nodo{ int dato; struct nodo *succ; }; typedef struct nodo elemento; typedef elemento *lista; lista creanuovo(lista myList, int value); void stampa(lista myList); int main() { lista myList = NULL; int n, i, value; printf("\nNUM ELEM : "); scanf("%d", &n); for(i=0; i<n; i++) { printf("Inserire valore: "); fflush(stdin); scanf("%d", &value); myList = creanuovo(myList, value); } printf("\nLISTA : \n"); stampa(myList); printf("\nEND\n"); return 0; } lista creanuovo(lista myList, int value) { lista new = NULL; lista current = NULL; new = (lista)malloc(sizeof(elemento)); new->succ = NULL; new->dato = value; if(myList == NULL) { myList = new; myList->succ = NULL; } else { current = myList; while(current->succ != NULL) current = current->succ; current->succ = new; } return myList; } void stampa(lista myList) { int i=0; lista tmp = myList; while(tmp != NULL) { printf("%d) %d-->", i,tmp->dato); tmp=tmp->succ; i++; } return; }
ti ringrazio sto vedendo di capirci qualcosa..
ecco una cosa che il mio libro non spiega è cosa significa mettere lista tra parentesi prima di malloc
fflush(stdin) non l'ho mai visto.. nemmeno a lezione!
In due parole:
char un_carattere;
int un_intero;
un_intero = (int) un_carattere;
Ecco, (int) un_carattere è un typecast, ovvero una conversione di tipo. Chiedo al compilatore di assegnare alla varabile un_intero il valore di un_carattere "convertito" in intero.
La funzione malloc() ti restituisce un indirizzo (di tipo void, ovvero di nessun tipo in particolare) e tu lo devi tipizzare, dicendogli che è del tipo lista.
Poi, fflush() è una funzione che svuota il buffer di quello che gli passi come argomento. Ogni volta che chiami scanf, devi fare fflush(stdin), ovvero devi svuotare il buffer di tastiera, altrimenti il tuo programma non ti fila di striscio nessuno scanf e tu non riesci a dargli in input nulla tranne il primo input che gli hai dato.
cerchi cattedra? vieni alla sapienza. hai spiegato perfettamente in tre righe quello che non ho capito per un anno intero
però non l'ho mai usato ed è sempre andata liscia.. anzi.. ora l'ho escluso ponendolo come commento e gira lo stesso
ahah se cerchi spiegazioni chiare a informatica, fai meglio a rassegnarti. Sono abituati a interagire col computer e con persone che ragionano come computer.. la didattica lascia spesso a desiderare. Ho passato l'esame di info1 con le conoscenze pregresse delle superiori, ma per il semplice fatto che a lezione non spiegavano NIENTE che avesse a che vedere con l'informatica. Info2 invece è stato l'opposto, un casino immane.. un robot era più umano del prof... ma ormai è acqua passata
Dipende, generalmente non funziona, esperienza personale, sia su linux che su win. Per sicurezza, tu mettilo, perché poi ti trovi all'esame o in lab che non riesci ad andare avanti per una simile banalità.però non l'ho mai usato ed è sempre andata liscia.. anzi.. ora l'ho escluso ponendolo come commento e gira lo stesso