--- /dev/null
+/********************************************************************/
+/* Implantation d'une liste triee d'entiers */
+/********************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef int element;
+
+typedef struct cellule {
+ element valeur;
+ struct cellule *suivant;
+} Cellule, *Liste;
+
+
+
+Liste ajouter_iter(element e, Liste L)
+{
+ Cellule *pc, *p1=L, *p2=NULL;
+
+ pc = (Cellule *)malloc(sizeof(Cellule));
+ pc->valeur=e;pc->suivant=NULL;
+
+ if (!L) /* liste vide */ return pc;
+ while (p1 && (e >= p1->valeur))
+ {
+ p2 = p1;
+ p1 = p1->suivant;
+ }
+
+ if (!p2) /* insertion en tete */ {pc->suivant = L; L=pc; }
+ else {/* insertion entre p2 et p1 */
+ p2->suivant = pc;
+ pc->suivant = p1;
+ }
+
+ return L;
+}
+
+
+int longueur_iter(Liste L)
+{
+ int res = 0;
+ while(L)
+ {
+ res = res + 1;
+ L=L->suivant;
+ }
+ return res;
+}
+
+
+int longueur_rec(Liste L)
+{
+ if(!L) return 0;
+ return 1+longueur_rec(L->suivant);
+}
+
+
+void visualiser_iter(Liste L)
+{
+ while (L)
+ {
+ printf("%d ",L->valeur);
+ L = L->suivant;
+ }
+ printf("\n");
+}
+
+
+void visualiser_aux(Liste L)
+{
+ if(L)
+ {
+ printf("%d ",L->valeur);
+ visualiser_aux(L->suivant);
+ }
+}
+
+
+void visualiser_rec(Liste L)
+{
+ visualiser_aux(L);
+ printf("\n");
+}
+
+
+int rechercher_iter(element e, Liste L)
+{
+ while(L)
+ {
+ if(e == L->valeur) return 1;
+ L = L->suivant;
+ }
+ return 0;
+}
+
+
+int rechercher_rec(element e, Liste L)
+{
+ if(L == NULL) return 0;
+ if(e==L->valeur) return 1;
+ return rechercher_rec(e,L->suivant);
+}
+
+
+Liste rechercher_rec2(element e, Liste L)
+{
+ if(!L || e==L->valeur) return L;
+ else return rechercher_rec2(e,L->suivant);
+}
+
+
+Liste ajouter_rec(element e, Liste L)
+{
+ if(!L)
+ {
+ L=(Cellule *)malloc(sizeof(Cellule)); /* liste vide */
+ L->valeur=e;L->suivant=NULL;
+ }
+ else if(e < L->valeur) /* ajouter DEVANT la tete */
+ {
+ Cellule *p=(Cellule *)malloc(sizeof(Cellule));
+ p->valeur=e; p->suivant=L;
+ L=p; /* nouvelle tete de liste */
+ }
+ else L->suivant=ajouter_rec(e,L->suivant); /* ajouter DERRIERE la tete */
+ return L;
+}
+
+
+Liste supprimer_iter(element e, Liste L)
+{
+ Liste prec = NULL;
+ while(L)
+ {
+ if(e == L->valeur) {
+ prec->suivant = L->suivant; /* le suivant de prec devient le suivant de L */
+ free(L); /* liberation memoire pour L */
+ return prec;
+ }
+ prec = L;
+ L = L->suivant;
+ }
+ return L;
+}
+
+
+Liste supprimer_rec(element e, Liste L)
+{
+ if(!L) ; /* element absent - on ne fait rien */
+ else if(L->valeur==e)
+ {
+ Cellule *p=L;
+ L=L->suivant;
+ free(p);
+ }
+ else L->suivant=supprimer_rec(e,L->suivant);
+ return L;
+}
+
+
+Liste inverser_iter(Liste L)
+{
+ Liste cell=NULL; /* une cellule temporaire */
+ Liste inv=NULL; /* la liste inversee */
+
+ while(L!=NULL)
+ {
+ cell=L; /* on prend la premiere cellule de la liste */
+ L=L->suivant; /* le debut de la liste devient l'element suivant */
+ cell->suivant=inv; /* on libere l'element de la liste et on le place en debut de la liste a renvoyer*/
+ inv=cell; /* l'element qu'on vient de mettre en debut de liste devient le debut de la liste de a renvoyer */
+ }
+ return inv;
+}
+
+
+
+Liste inserer_fin(element e, Liste L)
+{
+ Cellule *pc, *p1=L, *p2=NULL;
+ pc = (Cellule *)malloc(sizeof(Cellule));
+ pc->valeur=e;pc->suivant=NULL;
+ if (!L) return pc;
+ while (p1)
+ {
+ p2 = p1;
+ p1 = p1->suivant;
+ }
+ p2->suivant = pc;
+ pc->suivant = p1;
+ return L;
+}
+
+
+Liste inverser_rec(Liste L)
+{
+ if(L != NULL) {
+ return inserer_fin(L->valeur, inverser_rec(L->suivant));
+ }
+ else return L;
+}
+
+
+/****************************************************************************/
+
+int main()
+{int x;
+ Liste L=NULL;
+ printf("liste vide\n");
+ visualiser_iter(L);
+ visualiser_rec(L);
+
+ printf("longueur=%d\n",longueur_iter(L));
+ printf("longueur=%d\n",longueur_rec(L));
+
+ printf("ajout de 3\n");
+ L=ajouter_iter(3,L);
+ printf("ajout de 6\n");
+ L=ajouter_iter(6,L);
+ printf("ajout de 1\n");
+ L=ajouter_iter(1,L);
+ printf("ajout de 10\n");
+ L=ajouter_iter(10,L);
+ printf("ajout de 6\n");
+ L=ajouter_iter(6,L);
+ visualiser_iter(L);
+ visualiser_rec(L);
+
+ printf("longueur=%d\n",longueur_iter(L));
+ printf("longueur=%d\n",longueur_rec(L));
+
+ printf("recherche de %d = %d\n",3,rechercher_iter(3,L));
+ printf("recherche de %d = %d\n",3,rechercher_rec(3,L));
+ printf("recherche de %d = %d\n",4,rechercher_iter(4,L));
+ printf("recherche de %d = %d\n",4,rechercher_rec(4,L));
+
+ printf("ajout (rec) de 4\n");
+ L=ajouter_rec(4,L);
+ visualiser_iter(L);
+ printf("ajout (rec) de 8\n");
+ L=ajouter_rec(8,L);
+ visualiser_iter(L);
+
+ printf("suppression (iter) de 4\n");
+ supprimer_iter(4,L);
+ visualiser_iter(L);
+ printf("suppression (rec) de 6\n");
+ supprimer_rec(6,L);
+ visualiser_iter(L);
+
+ printf("liste inversee (iter)\n");
+ Liste inv = inverser_iter(L);
+ visualiser_iter(inv);
+
+ printf("Liste inversee (rec)\n");
+ Liste inv2 = inverser_rec(inv);
+ visualiser_iter(inv2);
+
+ /* il faut aussi tester chaque fonction (visualiser, supprimer, rechercher, inverser, ...) sur tous les cas : liste vide, liste avec un seul element, operation sur le premier element, operation sur le dernier element, ... */
+}
+
+
+/****************************************************************************/
+
+/* trace d'execution :
+liste vide
+
+
+longueur=0
+longueur=0
+ajout de 3
+ajout de 6
+ajout de 1
+ajout de 10
+ajout de 6
+1 3 6 6 10
+1 3 6 6 10
+longueur=5
+longueur=5
+recherche de 3 = 1
+recherche de 3 = 1
+recherche de 4 = 0
+recherche de 4 = 0
+ajout (rec) de 4
+1 3 4 6 6 10
+ajout (rec) de 8
+1 3 4 6 6 8 10
+suppression (iter) de 4
+1 3 6 6 8 10
+suppression (rec) de 6
+1 3 6 8 10
+liste inversee (iter)
+10 8 6 3 1
+Liste inversee (rec)
+1 3 6 8 10
+*/
+