Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [C] - Liste

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    61

    [C] - Liste

    Ciao ragazzi,

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

    Ho definito le strutture:
    codice:
     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:

    codice:
     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

  2. #2
    sembra giusta,ma perchè nn provi con una funzione non ricorsiva?
    soluzione più lunga, ma più semplice anche per un eventuale debugging
    ciao

  3. #3
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    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
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  4. #4
    Utente di HTML.it L'avatar di Angioletto
    Registrato dal
    Jan 2004
    Messaggi
    1,246
    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??
    Per liquidare un popolo si comincia con il privarli della memoria.Si distruggono i loro libri, la loro cultura, la loro storia. E qualcun’ altro scrive loro altri libri, li fornisce di un’altra cultura, inventa per loro un’altra storia. (Milan Kundera)

  5. #5
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Non funziona perchè non crei una lista concatenata!

    Dal punto di vista algoritmico, una soluzione ricorsiva corretta è :

    Codice PHP:
    //La prima volta crei il primo elemento
    if(== NULL)
        
    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->nextwordfreq); 
    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.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    61
    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è...

    codice:
     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);

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.