Salve a tutti e' da un po' che sto cominciando a smanettare con le liste,trovando abbastanza problemi.
il programma che avevo scritto è abbastanza classico
codice:
#include <stdio.h>#include <stdlib.h>
struct ListaNodo{
char nodo;
struct ListaNodo *nextPtr; //punta al prossimo nodo
};
typedef struct ListaNodo ListaNodo;
typedef ListaNodo *ListaNodoPtr;
void istruzioni(void);
void inserisci(ListaNodoPtr *, char);
int cancella(ListaNodoPtr *, char);
void visualizza(ListaNodoPtr);
int main(void)
{
ListaNodoPtr startPtr=NULL; //primo nodo della lista, che è sempre fittizio, come l'ultimo.
int scl;
char item;
int risp;
istruzioni();
scanf("%d" ,&scl);
while(scl != 4)
{
switch(scl)
{
case 1:
printf("Inserisci una lettera:");
scanf("\n%c" ,&item);
inserisci(&startPtr, item);
break;
case 2:
printf("\nInserisci l'elemento da cancellare:");
scanf("\n%c" ,&item);
risp=cancella(&startPtr, item);
if(risp != 0)
printf("\nCancellazione avvenuta con successo\n");
else
printf("\nNon hai trovato nessun elemento corrispondente\n");
break;
case 3:
visualizza(startPtr);
break;
default:
printf("\nScelta invalida\n");
istruzioni();
scanf("%d" ,&scl);
break;
}
istruzioni();
scanf("%d" ,&scl);
}
}
void istruzioni(void)
{
printf("1)Inserisci un nuovo nodo nella lista\n");
printf("2)Cancella un nodo dalla Lista\n");
printf("3)Visualizza\n");
printf("4)Esci\n");
}
void inserisci(ListaNodoPtr *sPtr, char witem)
{
ListaNodoPtr nuovo_ptr;
ListaNodoPtr ptr_corrente;
ListaNodoPtr ptr_precedente;
nuovo_ptr=malloc(sizeof(ListaNodo));
if(nuovo_ptr != NULL) //la memoria è ancora disponibile ?
{
nuovo_ptr->nodo= witem;
nuovo_ptr->nextPtr = NULL;
ptr_precedente= NULL;
ptr_corrente= *sPtr;
while(ptr_corrente != NULL && witem > ptr_corrente->nodo)
{
ptr_precedente=ptr_corrente;
ptr_corrente=ptr_corrente->nextPtr;
}
if(ptr_precedente == NULL)
{
nuovo_ptr->nextPtr = *sPtr;
*sPtr = nuovo_ptr;
}
else
{
ptr_precedente->nextPtr = nuovo_ptr;
nuovo_ptr->nextPtr = ptr_corrente;
}
}
}
int cancella(ListaNodoPtr * sPtr, char item)
{
ListaNodoPtr ptr_precedente;
ListaNodoPtr ptr_corrente;
ListaNodoPtr tmp;
if(item == (*sPtr)->nodo)
{
tmp= *sPtr;
*sPtr = (*sPtr)->nextPtr;
free(tmp);
return 1;
}
else
{
ptr_precedente = *sPtr;
ptr_corrente = (*sPtr)->nextPtr;
while(ptr_corrente != NULL && item != ptr_corrente->nodo)
{
ptr_precedente=ptr_corrente;
ptr_corrente=ptr_corrente->nextPtr;
}
if(ptr_corrente != NULL)
{
tmp=ptr_corrente;
ptr_precedente->nextPtr=ptr_corrente->nextPtr;
free(tmp);
return 1;
}
return 0;
}
}
void visualizza(ListaNodoPtr corrente)
{
if(corrente == NULL)
printf("\nNessun elemento presente nella lista\n");
else
{
printf("La lista e':\n");
while(corrente != NULL)
{
printf("%c --> " ,corrente->nodo);
corrente=corrente->nextPtr;
}
printf("NULL\n\n");
}
}
quello che però mi blocca è la seguente domanda, io nella struct ho utilizzato un solo tipo di dato (il char ) ma se volessi utilizzare un dato più complesso ? come ad esempio un nome e un numero ?
per intenderci, intenderei trattare questi nuovi tipi di dati come elementi della struct, per essere più chiaro:
codice:
struct Prova{
char *nome;
char *cognome;
int ID;
};
Precisamente mi blocco nell'inserire questi nuovi dati nella lista, cioè non so come fare e\o cosa aggiungere al codice di sopra .
Grazie per il tempo dedicatomi