Exercice : Fonctions d’édition

Exercice : Fonctions d’édition#

Il s’agit maintenant d’implémenter les fonctions de base permettant de modifier une liste, c’est-à-dire ajouter et supprimer des éléments. De nombreuses fonctions de ce type sont possibles et chacune a son utilité, nous nous contenterons ici des plus simples permettant de manipuler un minimum nos listes.

  1. Écrivez une fonction permettant d’ajouter un élément donné en paramètre en tête d’une liste. L’ajout en tête est souvent le type d’ajout le plus simple et le plus rapide pour les listes simplement chaînées.

    void ajouter_en_tete(liste *l, int val);
    

    BEGIN SOLUTION

    Attention de ne pas inverser les affectations e->next = l->tete et l->tete = e.

    void ajouter_en_tete(liste *l, int val) {
        elem *e = (elem *)malloc(sizeof(elem));
        e->val  = val;
        e->next = l->tete;
        l->tete = e;
        l->nbelem++;
    }
    

    END SOLUTION

  2. Ajouter maintenant une fonction permettant de chercher la première occurence d’une valeur dans une liste et de la supprimer. Cette fonction de suppression n’est pas la plus courante pour les listes chaînée mais elle nous sera bien utile plus tard et se combine bien avec la fonction que nous allons écrire à la prochaine question.

    void supprimer_valeur(liste *l, int val);
    

    Attention: les choses se compliquent avec cette fonction, pensez à bien la tester, les cas limites sont ici importants et plus nombreux.

    BEGIN SOLUTION

    void supprimer_valeur(liste *l, int val) {
        if (l->nbelem == 0)
            return;
        elem *e = l->tete;
        if (e->val == val) {
            l->tete = e->next;
            l->nbelem--;
            free(e);
            return;
        }
        while (e->next != NULL) {
            if (e->next->val == val) {
                elem *tmp = e->next;
                e->next = tmp->next;
                l->nbelem--;
                free(tmp);
                return;
            }
            e = e->next;
        }
    }
    

    END SOLUTION