#include #include struct cell { int contenu; struct cell *next; }; struct list { struct cell *head; struct cell *last; }; const struct list liste_vide = {NULL, NULL}; void insert_head(struct list *plist, int valeur) { struct cell *new_cell = malloc(sizeof(struct cell)); new_cell->contenu = valeur; new_cell->next = plist->head; plist->head = new_cell; if (plist->last == NULL) { // Mettre à jour le dernier élément plist->last = new_cell; } } int delete_head(struct list *plist) { if (plist->head == NULL) { // Rien à effacer return 0; } struct cell *del_cell = plist->head; plist->head = plist->head->next; if (plist->head == NULL) { // La liste est vide plist->last = NULL; } free(del_cell); return 1; } int pop(struct list *plist, int *valeur) { if (plist->head != NULL) { *valeur = plist->head->contenu; } return delete_head(plist); } int insert_after(struct list *plist, struct cell *where, int valeur) { if (plist == NULL || where == NULL) { // pointeur invalide return 0; } struct cell *new_cell = malloc(sizeof(struct cell)); new_cell->contenu = valeur; new_cell->next = where->next; where->next = new_cell; if (plist->last == where) { // Mettre à jour le dernier élément plist->last = new_cell; } return 1; } void insert_last(struct list *plist, int valeur) { if (plist->last == NULL) { // Liste vide, on peut ajouter au début insert_head(plist, valeur); } else { insert_after(plist, plist->last, valeur); } } // Efface where->next int delete_after(struct list *plist, struct cell *where) { if (where == NULL || where->next == NULL) { // Emplacement invalide return 0; } struct cell *del_cell = where->next; if (plist->last == del_cell) { // Mettre à jour le dernier élément plist->last = where; } // Sauter del_cell where->next = del_cell->next; // Libérer del_cell free(del_cell); return 1; } struct cell *find_first(const struct list *plist, int valeur) { struct cell *where = plist->head; while (where != NULL && where->contenu != valeur) { where = where->next; } return where; } void delete_list(struct list *plist) { // Effacer la tête de la liste // jusqu'à ce qu'elle n'en ait plus while (delete_head(plist)) ; } void afficher_liste(const struct list *plist) { printf("["); for (struct cell *iterator = plist->head; iterator != NULL; iterator = iterator->next) { if (iterator == plist->head) { printf("head(%d)", iterator->contenu); } else if (iterator == plist->last) { printf("->last(%d)", iterator->contenu); } else { printf("->(%d)", iterator->contenu); } } printf("]\n"); } int main() { struct list liste = liste_vide; // Exo 1 for (int i = 1; i <= 5; i++) { insert_head(&liste, i); } afficher_liste(&liste); // Exo 2 delete_head(&liste); afficher_liste(&liste); // Exo 3 insert_after(&liste, liste.head, 7); insert_after(&liste, liste.last, 10); afficher_liste(&liste); // Exo 4 delete_after(&liste, liste.head->next); afficher_liste(&liste); // Exo 5 if (find_first(&liste, -1) == NULL) { printf("Pas de -1 trouvé!\n"); } else { printf("Oups!\n"); } struct cell *one = find_first(&liste, 1); if (one == NULL) { printf("Oups!\n"); } else { one->contenu = 13; } afficher_liste(&liste); // Exo 6 delete_list(&liste); afficher_liste(&liste); }