import java.io.*;
import java.lang.*;
import java.util.*;

// \esc{De'claration des listes, voir page \pageref{prog:declaration-liste}} 

public class Liste {

  int contenu;
  Liste suivant;

  Liste (int x, Liste a) {
      this.contenu = x;
      this.suivant = a;
  }

  static Liste ajouter (int x, Liste a) {

    return new Liste (x, a);
  }

  static boolean recherche(int x, Liste a) {
  // \esc{Recherche, voir page \pageref{prog:recherche-liste}} 

    while (a != null) {
        if (a.contenu == x)
            return true;
        a = a.suivant;
    }
    return false;
  }

  static boolean rechercheR (int x, Liste a) {
  // \esc{recherche re'cursive, voir page \pageref{prog:recherche-liste-rec}}

    if (a == null) 
        return false;
    else if (a.contenu == x) 
        return true;       
    else 
        return rechercheR (x, a.suivant);
  }

  static boolean rechercheRbis (int x, Liste a) {
  // \esc{recherche re'cursive, voir page \pageref{prog:recherche-liste-rec}}

    return (a != null)
        && ((a.contenu == x)
            || rechercheRbis (x, a.suivant));
  }

   static int longueur(Liste a) {
   // \esc{Longueur d'une liste, voir page \pageref{prog:longueur-liste-rec}}

    if (a == null)
        return 0;
    else
        return 1 + longueur (a.suivant);
  }

  static int longueurI(Liste a) {
   // \esc{Longueur d'une liste, voir page \pageref{prog:longueur-liste}}

    int   longueur = 0;
    while (a != null) {
        ++longueur;
        a = a.suivant;
    }
    return longueur;
  } 

  static Liste supprimer (int x, Liste a) {
  // \esc{Supprimer, voir page \pageref{prog:supprimer-liste-recursif}} 

    if (a != null)
        if (a.contenu == x)
            a = a.suivant;
        else 
         a.suivant  = supprimer (x, a.suivant);
    return a;      
  }

  static Liste supprimerI (int x, Liste a) { 

    Liste   b, c;

    if (a != null)
        if (a.contenu == x){
            c = a;
            a = a.suivant;
        } else {
            b = a ;
            while (b.suivant != null && b.suivant.contenu != x) 
                b = b.suivant;
            if (b.suivant != null) { 
                c = b.suivant;
                b.suivant = b.suivant.suivant;
            }
        } 
    return a;       
  }

  static Liste listePremier (int n) {
   //\esc{Liste des nombres premiers, voir page \pageref{prog:liste-premiers}}

    Liste  a = null;
    int    k;

    for (int i = n; i >= 2; --i) {
         a = ajouter (i, a);
    } 
    k = a.contenu; 
    for (Liste b = a; k * k <= n ; b = b.suivant){ 
        k = b.contenu;   
        for (int j = k; j <= n/k; ++j) 
            a = supprimer (j * k, a);
        }
    return(a); 
  }

  static void imprimer (Liste a) {

    for (Liste b = a; b != null; b = b.suivant) 
        System.out.print (b.contenu + " ");
    System.out.println ();
  }

  public static void main(String args[]) {
      
    Liste a = new Liste (4, new Liste (3, new Liste (2, new Liste (1, 
              null))));
    imprimer (a);
    System.out.println (longueur (a));
    System.out.println (longueurI (a));
    if (args.length == 1) {
        System.out.println (recherche(Integer.parseInt(args[0]), a));
        System.out.println (rechercheR(Integer.parseInt(args[0]), a));
        System.out.println (rechercheRbis(Integer.parseInt(args[0]), a));
    a = supprimer (3, a);
    imprimer (a);
    a = supprimer (4, a);
    imprimer (a);
    a = supprimer (1, a);
    imprimer (a);
    a = supprimer (2, a);
    imprimer (a);
    System.out.println ("--------------------- premiers");
    imprimer (listePremier (120));
    }
  }
}

