PDA

Visualizza la versione completa : [C] - Liste


Napoli82
10-02-2004, 12:15
Ciao ragazzi,

allora, devo leggere delle parole da un file di testo e creare una lista lineare di tali parole.

Ho definito le strutture:


struct voce {
char *parola;
int frequenza;
struct voce *next;
}

typedef struct voce *Lista;


Per la fase di lettura da file non ci sono problemi. Il problema sta nell'inserimento nella lista:



void InserisciInCoda(Lista l, char *word, int freq)
{
if(l==NULL)
{
l=(struct voce *)malloc(sizeof(struct voce));
l->parola=word;
l->frequenza=freq;
l->next=NULL;
}
else
InserisciInCoda(l->next,word,freq);
}


A run-time il programma si blocca. Dov' l'errore? Secondo voi si potrebbe risolvere in un modo migliore?

Grazie

claudiosala80
10-02-2004, 12:46
sembra giusta,ma perch nn provi con una funzione non ricorsiva?
soluzione pi lunga, ma pi semplice anche per un eventuale debugging
ciao

infinitejustice
10-02-2004, 13:23
Se si blocca probabilmente vai a lavorare su aree di memoria nn allocate, controlla di allocare bene e di attaccare bene la lista :)

[aggiunta] sei sicuro che char *word sia ancora un puntatore valido quando viene chiamata la funzione e che invece magari il puntatore alla word del file nn sia da un'altra parte?


Potresti anche provare un while(!(feof(miofile))) e gestire al suo interno la creazione della lista

Angioletto
10-02-2004, 13:37
typedef struct voce *Lista;

io non avrei fatto cos..
Lista non una classe, ma un tipo puntatore a voce..

Tu aggiorni semplicemente il valore di tale puntatore nella funzione, ma non hai una classe lista....o la hai gi implementata??

anx721
10-02-2004, 15:34
Non funziona perch non crei una lista concatenata!

Dal punto di vista algoritmico, una soluzione ricorsiva corretta :



//La prima volta crei il primo elemento
if(l == NULL)
l = nuovo elemento creato;
else
//Ti fermi quando l'elemento successivo e nullo, non quando l'elemnto corrente nullo!
if(l->next == NULL)
l->next == nuovo elemento creato;
//Se l'elemento successivo non nullo, vai avanti
else
InserisciInCoda(l->next, word, freq);


Comuqnue questa soluzione non molto efficiente, meglio se ti mantieni un puntatore all'ultimo elemento della lista in modo da inserire in tempo costante, ciao.

Napoli82
11-02-2004, 13:16
Mi sapreste dire cosa non va nella funzione InitLista? Continua a darmi il warning: "Parameter 'plis' is never used" ed in effetti nonm esegue mai quell'istruzione ma non capisco perch...



struct nodo {
char *parola;
int frequenza;
struct nodo *next;
};

void InitLista(struct nodo *plis)
{
plis = NULL;
}

......

void main(void)
{
struct nodo *Elenco;
Elenco=(struct nodo *)malloc(sizeof(struct nodo));
InitLista(Elenco);

Loading