#include "ens_ordonne.h" #include "list.h" #include "memoire.h" #include #include #include struct ens_ordonne { list l; size_t cardinal; list curseur; size_t position; comparer cmp; }; ens_ordonne eo_creer (comparer cmp) { ens_ordonne eo = mem_malloc (sizeof (struct ens_ordonne)); eo->curseur = eo->l = NULL; eo->position = eo->cardinal = 0; eo->cmp = cmp; return eo; } size_t eo_cardinal (ens_ordonne eo) { assert (eo != NULL); return eo->cardinal; } static list * emplacement (list * l, void *e, comparer cmp) { list *p; for (p = l; *p != NULL && cmp (e, (*p)->element) > 0; p = &(*p)->next) ; return p; } void eo_ajouter_element (ens_ordonne eo, void *elt) { list *p; assert (eo != NULL && elt != NULL); p = emplacement (&eo->l, elt, eo->cmp); *p = list_cons (elt, *p); eo->cardinal++; eo->curseur = NULL; } void * eo_supprimer_element (ens_ordonne eo, comparer cmp, void *parametre) { list *p; void *elt_supprime; int c; assert (eo != NULL && parametre != NULL); for (p = &eo->l; *p != NULL && (c = cmp (parametre, (*p)->element)) > 0; p = &(*p)->next) ; if (*p == NULL || c < 0) return NULL; elt_supprime = (*p)->element; *p = list_cdr_and_free (*p); (eo->cardinal)--; eo->curseur = NULL; return elt_supprime; } void * eo_ieme (ens_ordonne eo, size_t i) { assert (eo != NULL && i <= eo->cardinal); if (eo->curseur == NULL || i < eo->position) { eo->curseur = eo->l; eo->position = 1; } for (; eo->position != i; eo->position++) eo->curseur = eo->curseur->next; return eo->curseur->element; }