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;
}