/************* La correction du TD 2 devrait être mise sur ecampus ce samedi ******/ #include #include /*************************************************/ /* */ /* type booléen */ /* */ /*************************************************/ typedef enum {false, true} bool; /*************************************************/ /* */ /* definition type liste */ /* */ /*************************************************/ typedef struct Bloc { int valeur ; struct Bloc * suite; } Bloc; typedef Bloc *Liste ; /*************************************************/ /* */ /* briques de base */ /* */ /*************************************************/ /*** les 5 fonctionnalités suivantes sont plus du sucre syntaxique que du code utile ***/ /*** sauf à vouloir pouvoir basculer à moindre frais sur une implémenation des listes ***/ /**** différentes des listes chainées proposées dans le cadre de ce projet ***/ // Liste Vide() { return NULL ; } // void initVide(Liste *L) { *L = NULL ; } // bool estVide(Liste l) { return l == NULL ; } // int premier(Liste l) { return l->valeur ; } // Liste suite(Liste l) { return l->suite ; } /****************/ void depile(Liste *L) { Liste tmp = *L ; *L = (*L)->suite ; free(tmp) ; } Liste ajoute(int x, Liste l) { Liste tmp = (Liste) malloc(sizeof(Bloc)) ; tmp->valeur = x ; tmp->suite = l ; return tmp ; } void empile(int x, Liste *L) { *L = ajoute(x,*L) ; } /*****************************/ /* */ /* Affiche */ /* */ /*****************************/ void affiche_rec(Liste l) { if (l == NULL) printf("\n"); else { printf("%d ", l->valeur); affiche_rec(l->suite); } } void affiche_iter(Liste l) { Liste L2 = l; while( L2 != NULL ) { printf("%d ", L2->valeur); L2 = L2->suite; } printf("\n"); } /****************************/ /* */ /* Longueur */ /* */ /****************************/ int longueur_rec (Liste l) { if (l == NULL) return 0 ; else return (1 + longueur_rec(l->suite)) ; } int longueur_iter (Liste l) { Liste P = l; int cpt = 0 ; while (P != NULL) { P = P->suite ; cpt++ ; } return cpt ; } /*****************************************/ /* */ /* VireDernier */ /* avec un depile */ /* à la main opportuniste (version iter) */ /* ou en utilisant depiie (version rec ) */ /* */ /*****************************************/ void VD (Liste *L) // *L non NULL ie liste non vide { if ( (*L)->suite == NULL ) depile(L) ; // moralement : depile(& (*L)) ; else VD (& (*L)->suite) ; } void VireDernier_rec (Liste *L) { if ( *L != NULL ) VD(L); // moralement : VD(& (*L)) ; } /*************/ void VireDernier_iter (Liste *L) { if ( *L != NULL) { while ( (*L)->suite != NULL ) L = & (*L)->suite ; free(*L) ; *L = NULL ; } } /*************************************************/ /* */ /* Libere la memoire */ /* */ /*************************************************/ void VideListe(Liste *L) { if ( *L != NULL ) { depile(L); VideListe(L); } } /********************************************/ /* */ /* DeuxEgalX */ /* */ /********************************************/ bool DeuxEgalX (Liste L, int x) { return true ; } /********************************************/ /* */ /* ContientZero */ /* */ /********************************************/ bool ContientZero (Liste L) { return true ; } /*************************************************/ /* */ /* Main */ /* */ /*************************************************/ int main(int argc, char** argv) { Liste l ; l = NULL ; VireDernier_rec (&l) ; VireDernier_iter (&l) ; affiche_rec(l) ; affiche_iter(l) ; printf(" %d \n", longueur_iter(l)) ; printf(" %d \n", longueur_rec(l)) ; printf(" %d \n", DeuxEgalX(l,0)) ; printf(" %d \n", DeuxEgalX(l,1)) ; printf(" %d \n", ContientZero(l)) ; VideListe(&l); return 0; }