/*Il programma permette di inserire stampare cancellare i nomi di una lista. La stampa deve poter essere globale(tutti i nomi della lista) o selettiva (dato un nome devono poter esere stampati il precedente e il successivo della lista). Si assumache la lista sia inizialmente vuota, che il numero di nomi non sia noto a priori, che i nomi non contengano spazi e siano lunghi al di pił 20 caratteri*/ #include #include #include #include #define NUM_CAR 80 #define LUNG_NOME 20 struct _nome { char name[LUNG_NOME+1]; struct _nome *next; struct _nome *prev; }; typedef struct _nome nome; void stampa(nome*); nome *cancella(nome*, char elimina[]); nome *inserisci(nome*, char aggiungi[]); void pulisci(nome* head); void main() { int scelta, esci=0; char riga[NUM_CAR]; nome *testa=NULL; do{ printf("[1]stampa, [2]cancella, [3]aggiungi, [4]esci: "); fflush(stdout); gets(riga); scelta=atoi(riga); switch(scelta){ case 1: stampa(testa); break; case 2: printf("Nome da cancellare: "); fflush(stdout); gets(riga); testa=cancella(testa, riga); break; case 3: printf("Nome da inserire: "); fflush(stdout); gets(riga); testa=inserisci(testa, riga); break; case 4: esci=1; pulisci(testa); break; default: printf("Opzione errata\n"); }; }while(!esci); } nome *inserisci(nome* head, char aggiungi[]) { nome *app; int trovato=0; app=head; while(app!=NULL && !trovato) { if(!strcmp(app->name,aggiungi)) { trovato=1; printf("Nome gią presente\n"); } app=app->next; } if(!trovato) { app=(nome*)calloc(1,sizeof(nome)); strcpy(app->name,aggiungi); app->next=head; app->prev=NULL; if(head!=NULL) head->prev=app; head=app; } return head; } void stampa(nome *head) { char riga[NUM_CAR]; int scelta, trovato=0; if(head==NULL) { printf("Lista vuota\n"); return; } printf("[1]stampa globale, [2]stampa selettiva: "); fflush(stdout); gets(riga); scelta=atoi(riga); switch(scelta){ case 1: while(head!=NULL) { printf("%s\n", head->name); head=head->next; } break; case 2: printf("Introduci nome: "); fflush(stdout); gets(riga); while(head!=NULL && !trovato) { if(!strcmp(head->name,riga)) { if(head->prev!=NULL) printf("Nome precedente %s\n",head->prev->name); else printf("Nome precedente inesistente\n"); }trovato=1; } head=head->next; if(!trovato) printf("Nome introdotto inesistente"); break; default: printf("Opzione errata\n"); }; } nome *cancella(nome *head, char elimina[]) { nome *app,*app2; int eliminato=0; if(head==NULL) { printf("Lista vuota\n"); return head; } app2=head; while(head!=NULL && !eliminato) { if(!strcmp(head->name, elimina)) { app=head; if(head->prev==NULL) { head->next->prev=NULL; head=head->next; app2=head; } else if(head->next==NULL) { head->prev->next=NULL; head=head->prev; } else { head->next->prev=head->prev; head->prev->next=head->next; } free(app); eliminato=1; } head=head->next; } head=app2; if(!eliminato) printf("Elemento non disponibile\n"); return head; } void pulisci(nome *head) { nome *app; if(head==NULL) return; while(head!=NULL) { app=head; head=head->next; free(app); } return; }