/***************************************************************/ /***************************************************************/ /* ESEMPI DI FUNZIONI RICORSIVE SU LISTE ********************/ /***************************************************************/ /*________________INSERIMENTO___________________________*/ struct nodo *inserimento(struct nodo *p){ int elem,OK; do { printf("\n Dammi il numero da inserire:\n "); OK=scanf("%d",&elem); if(!OK)getchar();} while(!OK); return(inserisci(p,elem));} /*________________INSERISCI___________________________*/ struct nodo *inserisci(struct nodo *p,int elem){ struct nodo *p1; if (testvuota(p)||(p->info >elem)){ p1= (struct nodo *)malloc((int)sizeof(struct nodo)); p1->info=elem; p1->punt=p; return(p1);} /*elem da inserire in lista vuota o in prima posizione*/ else { p->punt=inserisci(p->punt,elem); return(p);} } /*________________ELIMINAZIONE__________________________*/ struct nodo *eliminazione(struct nodo *p) { int elem,OK; do { printf("\n Dammi il numero da eliminare:\n "); OK=scanf("%d",&elem); if(!OK)getchar();} while(!OK); return(elimina(p,elem));} /*________________ELIMINA___________________________*/ struct nodo *elimina(struct nodo *p,int num){ struct nodo *p1; if(testvuota(p))return(p); /* lista vuota, nulla da eliminare*/ if(p->info==num) {p1=p; /* elemento da eliminare in prima posizione*/ p=p->punt; free(p1); return(p);} else {p->punt=elimina(p->punt,num); return(p);} } /*________________ELIMINAZIONE TUTTE__________________________*/ struct nodo *eliminazionet(struct nodo *p) { int elem,OK; do { printf("\n Dammi il numero da eliminare:\n "); OK=scanf("%d",&elem); if(!OK)getchar();} while(!OK); return(eliminat(p,elem));} /*________________ELIMINAT___________________________*/ struct nodo *eliminat(struct nodo *p,int num){ struct nodo *p1; if(testvuota(p))return(p); /* lista vuota, nulla da eliminare*/ if(p->info==num) {p1=p; /* elemento da eliminare inprima posizione*/ p=eliminat(p->punt,num); free(p1); return(p);} else {p->punt=eliminat(p->punt,num); return(p);} } /*________________VISUALIZZAZIONE_______________________*/ void *visualizzazione(struct nodo *p){ if(!testvuota(p)){printf("%d ",p->info);visualizzazione(p->punt);} } /*________________VISUALIZZAZIONE Ricorsiva di Liste Circolari____*/ void *visualizzazione(struct nodo *p){ if(!testvuota(p)) {printf("\n punt_lista--> "); visualizza(p,p->punt); printf("punt_lista\n");} } /*________________VISUALIZZA Ricorsiva di Liste Circolari_______*/ void *visualizza(struct nodo *p,struct nodo *p1){ printf("%d --> ", p1->info); if(p1!=p)visualizza(p,p1->punt);} /*________________APPEND DI DUE LISTE____________*/ /* concatena la seconda lista in fondo alla prima*/ struct nodo *append(struct nodo *p1,struct nodo *p2) { if(testvuota(p1)) return(p2); else {p1->punt=append(p1->punt, p2); return(p1);} } /*________________REVERSE____________________________*/ /* costruisce la lista inversa invertendo i puntatori*/ struct nodo *reverse(struct nodo *p){ struct nodo *p1,*p2; if(testvuota(p)) return(p); else{ p1=p; p2=p->punt; p1->punt=NULL; return(append(reverse(p2),p1));} } /*____________________________COPY_______________________*/ /* costruisce in p2 una nuova lista, identica a quella in p1; va chiamata con p1='lista-da-copiare' e p2=NULL*/ struct nodo *copy(struct nodo *p1,struct nodo *p2){ struct nodo *p3; if(testvuota(p1)) return(p2); else{ p3= (struct nodo *)malloc((int)sizeof(struct nodo)); /*alloco memoria */ p3->info=p1->info; p3->punt=p2; return(reverse(copy(p1->punt,p3)));} }