/* Accetta in ingresso una sequenza di valori interi terminante e
la memorizzi in due liste lineari: una per i numeri positivi e
una per quelli negativi*/
#include <stdio.h>
#include <malloc.h>
/* Struttura che determina gli elementi di una lista */
struct elemento {
int inf;
struct elemento *pun;
} *crea_lista(void);
/* Prototipi delle funzioni */
void visualizza(struct elemento*);
void separa(struct elemento*,struct elemento*,struct elemento*);
int main() {
struct elemento *lista;
struct elemento *pari;
struct elemento *dispari;
lista = crea_lista();
visualizza(lista);
separa(lista,pari,dispari);
visualizza(pari);
visualizza(dispari);
getchar();
return 0;
}
/* Funzione per l'accettazione dei valori immessi e la creazione della lista.
Restituisce un puntatore alla testa della lista */
struct elemento *crea_lista(void) {
struct elemento *p, *paus;
char scelta;
int t,aus;
/* Creazione del primo elemento */
p = (struct elemento*)malloc(sizeof(struct elemento));
printf("\nInserisci il primo elemento: ");
scanf("%d",&p->inf);
fflush(stdin);
paus = p;
t = 1;
/* Creazione degli elementi successivi */
for(;
{
printf("\nVuoi inserire un\'altro elemento? [S/N]: ");
scanf("%c",&scelta);
fflush(stdin);
if ((scelta=='s') || (scelta=='S') || (scelta=='n') || (scelta=='N')) {
if((scelta=='s') || (scelta == 'S')) {
paus->pun = (struct elemento*)malloc(sizeof(struct elemento));
paus = paus->pun;
t++;
printf("\nInserisci il valore dell\'elemento %d: ",t);
scanf("%d",&paus->inf);
fflush(stdin);
} else {
paus->pun = NULL;
break;
}
} else printf("\nInserire un valore corretto!");
}
return(p);
}
/* Routine per la visualizzazione della lista */
void visualizza(struct elemento *p) {
int i = 1;
printf("\n\n\t\tVisualizzazione lista\n");
while(p!=NULL) {
printf("\nElemento %d: %d",i,p->inf);
p = p->pun;
i++;
}
printf("\n\n\t\t--------------------\n\n");
getchar();
}
/* Routine per l'eliminazione dei numeri pari presenti nella lista */
void separa(struct elemento *p, struct elemento *pari, struct elemento *dispari) {
struct elemento *paus_p, *paus_d;
int flag_p = 0;
int flag_d = 0;
printf("\n\n\t\tDistinzione liste pari e dispari....\n");
while(p!=NULL) {
if((p->inf%2)==0) { // è pari
if(flag_p==0) { // Creazione primo elemento
pari = (struct elemento*)malloc(sizeof(struct elemento));
pari->inf = p->inf;
paus_p = pari;
flag_p++;
} else { // Creazione elementi successivi
paus_p->pun = (struct elemento*)malloc(sizeof(struct elemento));
paus_p = paus_p->pun;
paus_p->inf = p->inf;
}
} else { // è dispari
if(flag_p==0) { // Creazione primo elemento
dispari = (struct elemento*)malloc(sizeof(struct elemento));
dispari->inf = p->inf;
paus_d = dispari;
flag_d++;
} else { // Creazione elementi successivi
paus_d->pun = (struct elemento*)malloc(sizeof(struct elemento));
paus_d = paus_p->pun;
paus_d->inf = p->inf;
}
}
p = p->pun;
}
}