/* Programma per la gestione di liste di punti */ #include struct elemento{ /*definisco una struttura formata da tre campi*/ int ascissa; int ordinata; struct elemento *next; /*questo campo contiene un ptr ad una struttura*/ }; typedef struct elemento punto; punto* inserisci(punto *); /*prototipi di funzione*/ punto *cancella(punto *first); void stampa(punto *first); /******************************************************************************/ void main(void){ int scelta; punto *primo=NULL; /*Puntatore a punto, inizializzato a NULL*/ do{ printf("Scegli la tua opzione\n"); printf("1) Inserisci nuovo punto\n"); printf("2) Cancella ultimo punto\n"); printf("3) Stampa lista corrente dei punti\n"); printf("4) Termina programma\n"); scanf("%d",&scelta); switch(scelta){ case 1: primo=inserisci(primo); /*chiamo inserisci passando il puntatore "primo"*/ break; //Inserisce nuovo punto in testa case 2: primo=cancella(primo); /*chiamo cancella passando il puntatore "primo"*/ break; //cancella ultimo punto inserito case 3: stampa(primo); /*chiamo stampa passando il puntatore "primo"*/ break; //stampa gli elementi correnti della lista case 4: break; default: printf("Scelta non corretta; inserisci nuovamente\n\n"); } }while (scelta!=4); } /******************************************************************************/ punto* inserisci(punto *first){ int asc,ord; punto *q; /*dichiaro un puntatore a struttura punto*/ printf("\nInserisci le coordinate del nuovo punto\n"); printf("Ascissa="); scanf("%d",&asc); printf("Ordinata="); scanf("%d",&ord); q=(punto *)malloc(sizeof(punto)); //allocazione dinamica memoria per il nuovo elemento if (q==NULL) { //verifico che l'allocazione abbia avuto successo printf("\nMemoria esaurita!\n"); return(first); } q->ascissa=asc; /*inserisco nei campi della struttura puntata da q i valori*/ q->ordinata=ord; q->next=first; //inserimento in testa printf("Punto (%d,%d) inserito con successo.\n",q->ascissa,q->ordinata); return q; } /******************************************************************************/ punto *cancella(punto *first){ punto *p; /*dichiaro un puntatore alla struttura punto*/ if (first==NULL) printf("\nNessun elemento nella lista.\n\n"); else{ p=first->next; /*metto in p il valore next della strutt. puntata da first*/ free(first); /*deallocazione della memoria*/ } return p; } /******************************************************************************/ void stampa(punto *first){ int cont=1; punto *q; /*dichiaro un puntatore alla struttura punto*/ if (first==NULL) printf("La lista e' vuota.\n"); else for(q = first; q != NULL; q = q-> next){ printf("%d -- (%d,%d)\n",cont,q->ascissa,q->ordinata); cont++; } }