/**************************************************************************/
/*                                                                        */
/*  Thibaut Balabonski, Sylvain Conchon, Jean-Christophe Filliâtre,       */
/*  Kim Nguyen, Laurent Sartre                                            */
/*                                                                        */
/*  Informatique - MP2I/MPI - CPGE 1re et 2e années.                      */
/*  Cours et exercices corrigés. Éditions Ellipses, 2022.                 */
/*                                                                        */
/*  https://www.informatique-mpi.fr/                                      */
/*                                                                        */
/**************************************************************************/

// listes simplement chaînées, avec des éléments de type int

// la structure Cell est volontairement exportée
// pour être réutilisée, par exemple dans stack.c ou queue.c

#include "prelude.h"

#ifndef LIST
#define LIST

typedef struct Cell { int value; struct Cell *next; } list;

extern list *list_nil;

list *list_cons(int x, list *n);

list *list_append(list *l1, list *l2);
  // concatène en place les listes l1 et l2 i.e. connecte de dernier maillon
  // de l1 à l2 ; renvoie la tête de la liste
  // suppose que les listes l1 et l2 sont disjointes
  // l1 comme l2 peuvent être vides

int list_nth(list *l, int n);

int list_length(list *l);

list *list_interval(int lo, int hi);
  // renvoie la liste lo,lo+1,...,hi-1

void list_print(list *l);

bool list_cyclic(list *l);

list *list_reversal(list *l);

int list_random(list *l);
  // renvoie un élément aléatoire de l, en supposant l non vide

void list_delete(list *l);

#endif