ci risiamo, testi fatti male, dispense peggio.. lucidi non parliamone..
non riesco a capire una beneamata mazza delle liste in C
qualcuno ne sa qualcosa? vi prego
ci risiamo, testi fatti male, dispense peggio.. lucidi non parliamone..
non riesco a capire una beneamata mazza delle liste in C
qualcuno ne sa qualcosa? vi prego
hai già guardato qui?
Introduzione alle Liste | Guida C | Programmazione.HTML.it
html.it secondo me ha delle ottime guide, almeno io con java mi sono trovato molto molto bene, più del libro
si.. già letta tutta.. ma non è affatto chiara.. cioè.. in teoria è ottima ma non da spiegazioni al perchè fa determinate cose.. al "come si fa" insomma
sto in crisi..
nello specifico non capisco come riempire dinamicamente una lista.. ovvero senza numero di valori di partenza.. ma fermandosi ad un determinato evento.. mi sono perso tra le allocazioni dinamiche e l'inizializzazione dei nuovi puntatori a struttura
Hai presente come è fatto a spanne un array? Se sì, immagina un array di char e immagina un array di struct. Ecco, non cambia nulla, se non che un array di char è automaticamente concatenato (data la natura della variabile) mentre un "array di struct" (ovvero la tua lista) deve essere strutturato in modo che ogni elemento dell'array (della lista) punti al successivo e al precedente. Per farlo, nell'implementazione del typedef della tua struttura, devi semplicemente definire un puntatore allo stesso tipo di struttura. Ovviamente, il tuo array è dato dal puntatore al primo elemento della lista, e tramite il puntatore "head" puoi puntare all'elemento successivo. Una volta puntato all'elemento successivo, potrai accedere all'indirizzo del terzo elemento, e così via.
Tutto qui =)
Se non ti è chiaro e vuoi del codice chiedi pure, è che sono arrugginito sul C e non vorrei scrivere boiate per nulla.
Ah dimenticavo: siccome funziona come un array, devi allocare con la funzione malloc() per poter creare un nuovo elemento. Una volta creato, assegni il valore del puntatore appena creato al puntatore alla prossima struttura presente nell'elemento che vuoi della lista. Prima di far questo, però, devi sganciare l'elemento che è gia referenziato come successivo, assegnado il valore del suo indirizzo al puntatore all'elemento successivo della nuova struttura che hai allocato con malloc.
Prova a dare un'occhiata qui: http://it.wikipedia.org/wiki/Lista_(informatica)
si fin qui c'ero.. solo una cosa.. con i vettori me la cavo bene..
alloco tranquillamente utilizzando il puntatore
quello che non riesco a fare è ad esempio una lista che si riempie man mano (non necessariamente in maniera ordinata basta un numero dietro l0altro come in un vettore) fin quando non accade un evento.. ad esempio fin quando il dato in input non è 5..
ecco.. la funzione che dovrebbe fare sta cosa non mi è affatto chiara e ogni esercizio che provo a fare mi da un BUS ERROR , un errore che inizio ad odiare.. faccio casino coi puntatori credo
Innanzitutto assicurati che appena allochi spazio per una struttura, il puntatore alla struttura successiva sia NULL. Per la funzione di cui parli, dipendi da cos'hai fatto prima che l'utente inserisce il numero da tastiera.
1. leggi numero
2. se == 5 esci
3. altrimenti alloca un puntatore temporaneo (e.g.: tmp)
4. assegna al puntatore alla struttura successiva della struttura appena allocata un NULL (tmp->next = NULL.
5. assegna al tuo puntatore lista corrente il puntatore temporaneo appena creato (lista->next = tmp
PS: tutto il giochetto del NULL lo puoi evitare assegnandolo direttamente nel typedef della tua struct, in testa al programma... dovrebbe funzionare
posso approfittare della tua pazienza?
cosa c'è di sbagliato in questo programma
non fa nulla di che.. chiede quanti valori vogliamo inserire.. e tramite una funzione crea e aggiunge valori alla lista e tramite una seconda li stampa.. dovrebero essere i primi rudimenti delle liste.. eppure gira ma non mi stampa nulla-.-
#include<stdio.h>
#include<stdlib.h>
typedef struct nodo{
int dato;
struct nodo *succ;
}nodo;
void creanuovo(nodo *T);
void stampa(nodo *T);
int main(){
nodo *testa;
testa=NULL;
int n, i=0;
printf("\nNUM ELEM : ");
scanf("%d", &n);
while(i<n){
creanuovo(testa);
i++;
}
printf("\nLISTA : \n");
stampa(testa);
printf("\nEND\n");
return 0;
}
void creanuovo(nodo *T){
nodo* new;
int val;
new=(nodo *)malloc(sizeof(nodo));
new->succ=NULL;
printf("ins val : ");
scanf("%d",&val);
while(T!=NULL){
T=T->succ;
}
new->dato=val;
T=new;
return;
}
void stampa(nodo *T){
int i=0;
while(T!=NULL){
printf("%d-->", T->dato);
T=T->succ;
i++;
}
return;
}
Devi lavorare con due puntatori. Uno lo usi come indice, l'altro come prossimo elemento, in modo da lasciare intoccato il puntatore della testa. Se modifichi quello, perdi l'indirizzo in memoria del punto di partenza della tua lista! Cmq ora sto dando un'occhiata, e sembra che il problema sia proprio la funzione creanuovo().
Purtroppo sono arrugginito su queste cose, non le guardo più da tempo.. se riesco ti faccio sapere