codice:
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef int Boolean;
struct list {
int value;
struct list * next_ptr;
};
void init( struct list ** ptrptr );
void visit( struct list * ptr );
void pre_insert( struct list ** ptrptr, int value );
void newlist(struct list **ptr, int A, struct list **dst_ptr);
main()
{
Boolean itera = TRUE;
int value;
int scelta;
struct list * ptr, * dst_ptr;
int A;
// inizializzazione della lista
init( &ptr );
init ( &dst_ptr);
do {
// menù di scelta
printf( "\nScegli operazione:\n" );
printf( "1. inserisci un elemento nella lista 1\n" );
printf( "2. crea la lista dei multipli di A, rimuovendoli dalla lista 1\n");
printf( "3. visita la lista 1\n");
printf( "4. visita la lista dei multipli di A\n");
printf( "0. esci\n" );
// legge la scelta
scanf( "%d", &scelta );
// pulisce lo schermo
system("cls");
// chiamata delle funzioni sulla lista
switch ( scelta ) {
case 1: // inserimento lista 1
printf( "\ninserisci valore: " );
scanf( "%d", &value );
// funzione di inserimento prefisso nella lista
pre_insert( &ptr, value);
break;
case 2: // crea lista degli elementi divisibili per A, rimuovendoli dalla lista principale
printf( "\ninserisci il divisore: ");
scanf( "%d", &A);
newlist( &ptr, A, &dst_ptr);
break;
case 3: // visita la lista 1
printf( "\n\nlista 1: " );
visit( ptr );
break;
case 4: // visita la lista dei multipli di A
printf( "\n\nlista multipli di A: " );
visit( dst_ptr );
break;
case 0: itera = FALSE;
break;
default: // in ogni altro caso ripresenta il menù
printf( "\nscelta errata!" );
break;
}
} while ( itera );
system("PAUSE");
return 0;
}
void newlist( struct list **ptrptr, int A, struct list ** dst_ptr) {
struct list *tmp;
while ( *ptrptr != NULL ) {
if( (*ptrptr)->value % A == 0) {
tmp = *ptrptr;
while (*dst_ptr != NULL) {
*dst_ptr = (*dst_ptr)->next_ptr;
}
*dst_ptr = tmp;
ptrptr = &(*ptrptr)->next_ptr;
}
else
*ptrptr = (*ptrptr)->next_ptr;
}
}
void init( struct list ** ptrptr )
/* inizializzazione
*/
{
*ptrptr = NULL;
}
void visit( struct list * ptr )
/* visita della lista
*/
{
while ( ptr != NULL ) {
printf( "%d ", ptr->value );
ptr = ptr->next_ptr;
}
}
void pre_insert( struct list ** ptrptr, int value )
/* inserisce in testa
*/
{
struct list * tmp_ptr;
tmp_ptr = *ptrptr;
*ptrptr = (struct list *) malloc( sizeof(struct list));
(*ptrptr)->value = value;
(*ptrptr)->next_ptr = tmp_ptr;
}