Problema lettura lista

di il
4 risposte

Problema lettura lista

Ciao,

ho un problema di lettura di una lista:
typedef struct NodoLista {
            char dato[BUFLEN];
            struct NodoLista *next;
} myLista;

typedef myLista *TipoLista;

.........
main ()
{
  TipoLista l = NULL;
  .........
  // Ciclo per l'input delle stringhe e l'inserimento nella lista

}

void stampaLista(TipoLista l){
    while (l!=NULL) {
    printf("[Il dato e' = %s] ",l->dato);
   l=l->next;
  }
 printf("\n");
}

//funzione per inserire in coda ad una lista un nuovo nodo
void inserisciInCoda(TipoLista* l, char *buf){
 TipoLista temp = (TipoLista)malloc(sizeof(myLista));
 strcpy(temp->dato,buf); // per motivi vari è necessario, ma funziona
 temp->next = NULL;
 if (*l==NULL) 
 	  *l = temp;
 else {
     TipoLista temp2 = *l;
     while (temp2->next!=NULL)
           temp2= temp2->next;
           temp2->next=temp;
    }
}
Con piccoli accorgimenti ho testato l'inserimento delle mie stringhe nella lista e questo avviene senza problemi.
Se, però, lancio l'istruzione stampaLista(l); mi viene stampato solo l'ultimo elemento.

Ci sto ammattendo e non so come fare. Spero in un aiuto da qualcuno un pò più esperto.
Ciao e grazie

4 Risposte

  • Re: Problema lettura lista

    Ho provato le tue funzioni di inserimento e stampa e funzionano benissimo, mi sa che fai qualcosa di sbagliato nel main
  • Re: Problema lettura lista

    Smanettone ha scritto:


    ho provato le tue funzioni di inserimento e stampa e funzionano benissimo, mi sa che fai qualcosa di sbagliato nel main
    Grazie,
    in effetti era una stupidaggine.
    Ora ho però un'ultimo problema
    int contaParole(char *a, char *b) 
    { 
        int cnt = 0; 
        char *sptr = a; 
        /* TEST
        int c = strlen(a);
        int d = strlen(b);
        printf("a = %d e b = %d\n",c,d); */
        while ( sptr != '\0' && ( sptr = strstr( sptr, b ) ) != NULL )
        {
          cnt++; 
          sptr += strlen( b ); 
        } 
        return(cnt); 
    }
    Questa funzione dovrebbe contare le occorrenze di b in a.
    Ho testato come vedi quello che viene passato e mi ritrovo le lunghezze giuste delle variabili (+1 per '\0') e i valori corretti.
    Ma la funzione non gira. Per quanto provi sptr = strstr( sptr, b ) risulta sempre NULL.

    Have You an "idea" ?

    Ti ringrazio; questo è proprio l'ultima rogna del mio esercizio.

    Bye
  • Re: Problema lettura lista

    Int contaParole(char *a, char *b)
    {
    int cnt = 0;
    char *sptr = a;

    while ( (sptr != '\0') && ( sptr = strstr( sptr, b ) ) != NULL )
    {
    cnt++;
    sptr += (strlen( b )*sizeof(char));
    }
    return(cnt);
    }

    sptr lo devi spostare in modo tale che vada a puntare poi all'inizio di un'altra entry dell'array a, quindi devi sommargli:

    [numero di byte per memorizzare un char] * [numero di entry che ti devi spostare (cioè uguale al numero di lettere di b)]
  • Re: Problema lettura lista

    Smanettone ha scritto:


    int contaParole(char *a, char *b)
    Ciao

    Grazie per avermi risposto. Quello che succede, però, è questo.
    Se scrivo un piccolo programma di test come quello seguente, la funzione "funziona".
    #include <stdio.h>
    #include <string.h>
    
    #define BUFLEN 100
    
    int contaParole(char *a, char *b);
    
    int main()
    {
      int occur;
      char stringa[BUFLEN] = "prova1 prova2 prova3 prova4 prova5";
      char parola[20] = "prova";
      
           occur = contaParole(stringa,parola);
           printf("Il numero di occorrenze e' %d\n",occur);
           sleep(3);
    }
    Mi vengono ritornate esattamente 5 occorrenze.

    Se invece, lancio la funzione da un'altra funzione (come dovrebbe essere nel mio caso) mi viene ritornato sempre 0. La funzione chiamante è questa:
    int contaOccorrenze(TipoLista l, char *buf)
    {
      int n = 0;
      int occ = 0;
    
         while (l != NULL)
         {
              occ = contaParole(l->dato, buf);
              n = n + occ;
              l = l->next ;
         }
         return(n) ;
    }
    E' abbastanza evidente che si tratta di leggere sequenzialmente una lista di stringhe, per ognuna delle quali usando contaParole si calcola il numero di occorrenze della parola cercata.
    Alla fine dovrei avere il numero totale di occorrenze della parola nella lista.
    Ho inserito in in contaParole un banale printf per testare i valori passati di a e b e sono giusti, però non funge.
    E' un mistero.

    Cosa ne pensi?

    Saluti cordiali
Devi accedere o registrarti per scrivere nel forum
4 risposte