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