Ragazzi, ho un problema con un programmino di esercitazione in C che non riesco a risolvere. Praticamente non riesco a calcolarmi il numero di elementi di una lista per effettuare un confronto tra stringhe. Utilizzando il debugger mi viene fuori che il valore di numElementi è un numero spropositato quando la lista è al massimo di 2-3 elementi (nelle prove). Di seguito posto il codice.
Sorgente dei sottoprogrammi:
codice:
#include <stdio.h>#include <stdlib.h>


#include "listaPtrc.h"


// SOTTOPROGRAMMI DI SERVIZIO:
//---------------------------


void aggiungiInTesta(lista* plista, tipoValori elem);
lista puntatoreAllUltimo(lista l);
lista puntatoreAllaPos (lista l, int pos);
boolean posizioneEsistente (lista l, int pos);
void errore(char* messaggio);


//---------------------------


void inizializza (lista* plista) {
    *plista = NULL;
    return;
}


void leggi (lista* plista) {
    int i, numero;
    tipoValori valore;
    printf("\nLettura dei valori della lista\n");
    printf("------------------------------\n");
    printf("Quanti valori contiene la lista ? ");
    scanf("%d", &numero);
    while (numero < 0) {
        printf("ERRORE: VALORE NON AMMESSO\n");
        printf("Il valore deve essere maggiore o uguale di 0 ");
        printf("Immetti valore corretto: ");
        scanf("%d", &numero);
    }
    inizializza(plista);
    for (i = 0; i < numero; i++) {
        printf("--Immetti il valore n.%d:", i);
        leggiValore(&valore);
        aggiungiInCoda(plista, valore);
    }
    return;
}


void leggiValore(tipoValori* valore) {
    printf("Codice del prodotto: ");
    scanf("%s", valore->codice);
    printf("Marca del prodotto: ");
    scanf("%s", valore->marca);
    printf("Descrizione del prodotto: ");
    scanf("%s", valore->descrizione);
    printf("Numero di prodotti presenti in magazzino: ");
    scanf("%d", valore->quantita);
}


void stampa (lista l) {
    int i = 0;
    lista p = l;
    printf("\nStampa dei valori della lista\n");
    printf("-----------------------------\n");
    if (listaVuota(l)) {
        printf("Lista vuota\n");
    } else {
        while (p != NULL) {
            printf("--Valore n.%d: ", i);
            stampaValore(p->valore);
            p = p->next;
            i++;
        }
    }
    return;
}


void stampaValore(tipoValori valore) {
    printf("/n Codice del prodotto: %s", valore.codice);
    printf("Marca del prodotto: %s", valore.marca);
    printf("Descrizione del prodotto: %s", valore.descrizione);
    printf("Quantità del prodotto in magazzino: %d", valore.quantita);
}
/*
void salva (lista l, char* nomeFile) {
    int i;
    lista p = l;
    FILE* outFile;
    //printf("Salvataggio nel file: -%s-", nomeFile);
     outFile = fopen(nomeFile, "w");
    while (p != NULL) {
        salvaValore(outFile, p->valore);
        p = p->next;
    }
    fclose(outFile);
    return;
}


void salvaValore(FILE* outFile, tipoValori valore) {
    fprintf(outFile, "Codice del prodotto: %s \n", valore.codice);
    fprintf(outFile, "Marca del prodotto: %s \n", valore.marca);
    fprintf(outFile, "Descrizione del prodotto: %s \n", valore.descrizione);
    fprintf(outFile, "Quantità del prodotto in magazzino: %d \n", valore.quantita);
}


void carica (lista* plista, char* nomeFile){
    int i;
    tipoValori valore;
    FILE* inFile;
    //printf("Caricamento dal file: -%s-", nomeFile);
    inFile = fopen(nomeFile, "r");
    inizializza(plista);
    while (TRUE) {
        if (caricaValore(inFile, plista) == FALSE) {
            break;
        }
    }
    fclose(inFile);
    return;
}


boolean caricaValore(FILE* inFile, lista* plista) {
    tipoValori valore;
    if (fscanf(inFile, "%f", &valore) == EOF) {
        return FALSE;
    }
    aggiungiInCoda(plista, valore);
    return TRUE;
}
*/
void aggiungiInCoda (lista* plista, tipoValori elem){
    lista p;
    if (listaVuota(*plista)) {
        aggiungiInTesta(plista, elem);
    } else {
        p = puntatoreAllUltimo(*plista);
        p->next = (lista)malloc(sizeof(elemento));
        if (p->next == NULL) {
            errore("Impossibile aggiungere elemento");
        } else {
            p->next->valore = elem;
            p->next->next = NULL;
        }
    }
    return;
}


void aggiungiInPosizione (lista* plista, tipoValori elem, int pos) {
    lista p;
    lista tmp;
    if (!posizioneEsistente(*plista, pos)) {
        if (pos != numeroElementi(*plista)) {
            errore("Posizione inesistente. Impossibile inserire");
        } else {
            aggiungiInCoda(plista, elem);
        }
    } else {
        if (pos == 0) {
            aggiungiInTesta(plista, elem);
        } else {
            p = puntatoreAllaPos (*plista, pos - 1);
            tmp = p->next;
            p->next = (lista)malloc(sizeof(elemento));;
            if (p->next == NULL) {
                errore("Impossibile aggiungere elemento");
                p->next = tmp;
            } else {
                p->next->valore = elem;
                p->next->next = tmp;
            }
        }
    }
    return;
}


void eliminaInCoda (lista* plista){
    elemento* tmp;
    if (listaVuota(*plista)) {
        errore("Lista vuota. Impossibile eliminare");
    } else {
        if ((*plista)->next == NULL) {
            tmp = *plista;
            *plista = NULL;
        } else {
            lista p = puntatoreAllaPos(*plista, numeroElementi(*plista) - 2);
            tmp = p->next;
            p->next = NULL;
        }
        free(tmp);
    }
    return;
}


void eliminaInPosizione (lista* plista, int pos){
    lista tmp;
    if (!posizioneEsistente(*plista, pos)) {
        errore("Posizione inesistente. Impossibile eliminare");
    } else {
        if (pos == 0) {
            tmp = *plista;
            *plista = (*plista)->next;
        } else {
            lista p = puntatoreAllaPos (*plista, pos - 1);
            tmp = p->next;
            p->next = p->next->next;
        }
        free(tmp);
    }
    return;
}
/*
int cercaPosizione (lista l, tipoValori elem) {
    lista tmp = l;
    int i =  0;
    while (tmp != NULL) {
        if (confronta(tmp->valore,elem)) {
            return i;
        } else {
            tmp = tmp->next;
            i++;
        }
    }
    return -1;
}


boolean confronta(tipoValori val1, tipoValori val2) {
    return val1 == val2;
}
*/
int numeroElementi (lista l){
    lista tmp = l;
    int conta =  0;
    while (tmp != NULL) {
        tmp = tmp->next;
        conta++;
    }
    return conta;
}


tipoValori elementoInPosizione (lista l, int pos) {
    tipoValori valore;
    lista tmp = puntatoreAllaPos (l, pos);
    return tmp->valore;
}


boolean listaVuota (lista l) {
    return (l == NULL);
}


boolean listaPiena (lista l) {
    return FALSE;
}




// sottoprogrammi privati


boolean posizioneEsistente (lista l, int pos){
    if (listaVuota(l)) {
        return FALSE;
    } else {
        return (pos >= 0 && pos < numeroElementi(l));
    }
}


elemento* puntatoreAllUltimo (lista l) {
    lista p = l;
    if (p != NULL) {
        while (p->next != NULL) {
            p = p->next;
        }
    }
    return p;
}


elemento* puntatoreAllaPos (lista l, int pos) {
    int i;
    lista p = l;
    if (p != NULL) {
        for (i = 0; i < pos; i++) {
            p = p->next;
        }
    }
    return p;
}


void aggiungiInTesta (lista* plista, tipoValori elem){
    lista tmp = *plista;
    *plista = (lista)malloc(sizeof(elemento));;
    if (*plista == NULL) {
        errore("Impossibile aggiungere elemento");
    } else {
        (*plista)->valore = elem;
        (*plista)->next = tmp;
    }
    return;
}


void errore(char* messaggio) {
    printf("***** ERRORE: %s\n", messaggio);
    exit(EXIT_FAILURE);
}