Errore nella stampa di una lista dinamica

di il
1 risposte

Errore nella stampa di una lista dinamica

Salve in questo periodo sto studiando le liste concatenate in C e sto scrivendo il mio primo programma che permetta la sua gestione.
Al momento ho scritto la funzione per l'input di un numero al suo interno e dovrei ricevere la visualizzazione su schermo ma ciò non avviene correttamente in quanto il programma si blocca.

Ecco il codice sorgente
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h> //includo la libreria per la gestione dinamica della memoria

struct elementi
{
    int num; //variabile che contiene il valore numerico
    struct elementi* succ; //puntatore al nodo successivo
}; //end struct elementi

typedef struct elementi Lista; //rinomino l'intera struct elementi con Lista
typedef Lista *lista; //dichiaro puntatore alla struct richiamata tramite Lista

/*Dichiarazione dei prototipi di funzione*/
void InserimentoOrdinato(lista *listaPtr,int numero); //funzione per inserire valore nella lista passo come valori indirizzo e il numero da inserire
void stampaLista(lista correntePtr); //funzione per la stampa della lista

int main()
{
    lista inizioLista; //inizializzo la lista a NULL in quanto vuota

    int scelta; //scelta dell'utente
    int a; //variabile che contiene il numero digitato

    printf("\t\t***GESTIONE LISTA DINAMICA!***\n\n\n");

    printf("1)Inserisci un valore nella lista\n");

    printf("Scegli opzione: ");
    scanf("%d",&scelta);

    switch(scelta)
    {
        case 1:
            system("cls");
            printf("\t\t***Opzione: INSERIMENTO NUMERO NELLA LISTA***\n\n");
            printf("Digitare un numero intero: ");
            scanf("%d",&a);
            InserimentoOrdinato(&inizioLista,a); //richiamo la funzione e passo l'indirizzo della lista e il numero digitato
            stampaLista(inizioLista); //richiamo la funzione per la stampa della lista
        break;
    }


    return 0;
} //end main

/*Funzioni*/
void InserimentoOrdinato(lista *listaPtr,int numero)
{
    lista nuovoPtr; //puntatore al nuovo nodo
    lista precedentePtr; //puntatore al nodo precedente
    lista correntePtr; //puntatore al nodo corrente

    //attribuisco a nuovoPr il nuovo indirizzo di memoria dinamica tramite malloc
    nuovoPtr=malloc(sizeof(Lista));

    if(nuovoPtr != NULL)
    {
        nuovoPtr->num=numero; //attribuisco il numero inserito al nuovo nodo della lista
        nuovoPtr->succ=NULL; //attribuisco null al prossimo nodo poichè non è momentanemamete collegato a niente

         /*Ciclo per trovare la posizione corretta nella lista del nuovo nodo*/
        //Imposto valori iniziali per ciclo
        precedentePtr=NULL; //precedentePtr riceve locazione nodo precedente
        correntePtr=listaPtr; //correntePtr riceve locazione nodo successivo
        while(correntePtr!=NULL && numero > correntePtr->num)
        {
            precedentePtr=correntePtr;
            correntePtr=correntePtr->succ;
        } //end while

        //se precedetePtr rimane null significa che è il primo nodo e dunque il valore è la testa della lista
        if(precedentePtr==NULL)
        {
            nuovoPtr->succ=listaPtr;
            *listaPtr=nuovoPtr;
        }//end if

        //altrimenti il valore termina fra precedentePtr e correnteptr
        else
        {
            precedentePtr->succ=nuovoPtr; //il nodo precedente punta a quello nuovo
            nuovoPtr->succ=correntePtr; //il link del nuovo nodo punta a quello corrente
        } //end else
    } //end if

    else
    {
        printf("La memoria e' esaurita. Non e' possibile aggiungere valori!\a\n");
    }//end else
} //end InserimentoOrdinato()

void stampaLista(lista correntePtr)
{
    //controllo se la lista è vuota
    if(correntePtr==NULL)
        printf("La lista e' vuota, non ci sono elementi da visualizzare!\a\n");

    else
    {
        printf("Lista attuale: \n");

        //ciclo while per stampare la lista
        while(correntePtr!=NULL)
        {
                printf("%d --> ",correntePtr->num); //stampo il numero contenuto nel nodo attuale
                correntePtr = correntePtr->succ; //punto al nodo successivo della lista
        } //end while

        printf("NULL\n"); //alla fine della lista dei numeri stampo null per indicare la chiusura
    } //end else

}//end stampaLista()

Se qualcuno saprà darmi una mano lo rigrazio in anticipo

1 Risposte

  • Re: Errore nella stampa di una lista dinamica

    Un aspetto fondamentale della programmazione, che distingue i programmatori tra quelli che portano a termine il lavoro e quelli che non lo fanno, è il debugging.

    Se impari a programmare hai fatto il 20% del lavoro. Se impari a fare un corretto debugging, hai fatto il rimanente 80%.

    Prova ad eseguire il codice passo-passo, scopri in quale riga si blocca, individua i valori delle variabili, puntatori e di quello che dovrebbe essere e invece non è .... troverai il problema, lo correggerai e andrai avanti da solo.

    E poi ... non hai avuto warning dal compilatore?
Devi accedere o registrarti per scrivere nel forum
1 risposte