PDA

View Full Version : [C] Lista semplice/Segmentation Fault


C3ls1us
24-01-2009, 16:58
Vi riassumo il mio problema:
stò provando ad implementare in C delle liste semplici e a prendere dimestichezza con i puntatori a struct.
Il mio esercizio consisteva nell'implementare una lista semplice, inserire dei dati, e poter visualizzarli in seguito.
Probabilmente si tratta di un errore sintattico, ma è da un giorno che sono fermo, nonostante abbia sfogliato kg di pagine web e non...! Grazie Mille!!! :)

#include <stdio.h>
#include <stdlib.h>

typedef struct lista
{
int x;
int y;
struct lista *succ;
}ls;

struct lista *pt,*punt; //pt e pt ausiliario

int main()
{
int n;

printf("Num di elementi\t");
scanf("%d",&n);

pt=NULL; //inizializzazione
pt=(ls*)malloc(sizeof(ls)*2);
if (pt==NULL)
return 1; //controllo su malloc
punt=pt;

printf("ins dati\n");
while(n>0)
{
scanf("%d",&pt->x);
scanf("%d",&pt->y);
n--;
pt=pt->succ;
}
pt=punt;
printf("%d,%d\n",pt->x,pt->y);
free(pt);
return 0;
}


mattia@mattia:~/c$ ./a.out
Num di elementi 3
ins dati
1
1
2
Segmentation fault :help:

k0nt3
24-01-2009, 19:30
beh funziona solo se inserisci un solo elemento, perchè allochi memoria solo per il primo elemento. il fatto che moltiplichi size per 2 non ha effetto in quanto il prossimo elemento non sarà necessariamente in un indirizzo di memoria sequenziale al primo elemento (altrimenti sarebbe un array e non una lista).
ecco una versione funzionante

#include <stdio.h>
#include <stdlib.h>

typedef struct lista
{
int x;
int y;
struct lista *succ;
}ls;

ls *testa = NULL; // testa della lista
ls *cur = NULL; // cursore

int main()
{
int n;

printf("Num di elementi\t");
scanf("%d",&n);

printf("ins dati\n");
while(n>0)
{
ls *elem = (ls*)malloc(sizeof(ls));
scanf("%d",&elem->x);
scanf("%d",&elem->y);

if(cur==NULL) // la lista e' vuota
{
cur = elem; // il cursore punta all'elemento che ho appena creato
testa = cur; // il nuovo elemento diventa anche la testa della lista
}
else // altrimenti cur punta all'ultimo elemento inserito nella lista
{
cur->succ = elem; // il campo succ dell'ultimo elemento inserito punta al nuovo elemento creato
cur=cur->succ; // si scorre il cursore all'ultimo elemento creato
}

--n;
}

// parto dal primo elemento per liberare la memoria
cur = testa;
while(cur != NULL)
{
printf("%d,%d\n",cur->x,cur->y);
free(cur);
cur = cur->succ; // quando arrivo alla fine della lista cur puntera' a NULL interrompendo il while
}

return 0;
}

come vedi alloco memoria ogni volta che inserisco un elemento

C3ls1us
25-01-2009, 01:36
Grazie!!!!! Mi sfuggiva qualcosa! Grazie davvero!:)